Opel kijelző (TID) kezelése

Hogyha sikeresen O/PLED illetve hagyományos alfanumerikus - esetleg tán grafikus kijelzővel gyűlik meg a baja valakinek:)
Avatar
szepnorbee
Bitmanipulátor
Hozzászólások: 122
Csatlakozott: 2009. augusztus 31. hétfő, 6:00

Opel kijelző (TID) kezelése

Hozzászólás Szerző: szepnorbee »

Adott egy Opelekben használatos információs kijelző, amit TID (Triple Info Display) -nek hívnak. Azért nyitottam neki új témát mert ez se nem grafikus, se nem karakteres kijelző. Leginkább a 7 szegmenses kijelzőkhöz hasonlít megjelenésileg, de ez állítólag i2c buszon kommunikál. Három részre van felosztva az LCD (óra, dátum, hőmérséklet) A középső részt lehet vezérelni a dátum helyén (8 karakter). Eddig nem is lenne nagy gond, de sajnos nem tudom, hogyan tudnám meghajtani AVR-el. Bezavar kicsit, hogy ez nem 2wire kommunikációt használ hanem 3 vezetékest. Van SCL, SDA ill. MRQ. A neten nemigazán találtam ennek meghajtására bascom mintát sajnos, de hátha közületek valakinek volt már dolga ilyen cuccal. Van egy-két leírás a neten hozzá de sajnos a google forditó nem szeretí az ilyen "szakszöveget" így nemigazán elég, hogy felfogjam. Itt vannak leírások: http://www.corsa24.de.vu/ http://blog.yam.com/jackktop/article/1004086

http://www.eelkevisser.nl/szamota-nagy.htm

Ha valaki tudna segíteni, vagy kallódik egy mintakódja és azt bemásolja ide, azt megköszönöm! :)
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

http://blog.yam.com/jackktop/article/1004086

A kódot lesd meg. Az i2c start, i2cstop, i2csend elég (az asm háttér nem kell) :).

http://blog.yam.com/jackktop/article/1004086
lap 1/3TOL lefele a teljes protokoll:) Az mrq is :)


Full leírás: http://www.carluccio.de/index.php/Opel_TID
Avatar
szepnorbee
Bitmanipulátor
Hozzászólások: 122
Csatlakozott: 2009. augusztus 31. hétfő, 6:00

Hozzászólás Szerző: szepnorbee »

Köszönöm Robert! Nos. Ott tartok hogy AVR-el (Atmega8) bármit ki tudok iratni rá, de nem vagyok tisztában a pontos időzítési ciklusokkal. Külső 4 Mhz-ről jár a proci (kondikat nem hagytam ki). A problémám az, hogy pl. egy egyszerű WELCOME feliratot 5ször (vagy hogy elég egyszer is) kell az i2c buszra küldeni mire megjelenik, szóval időzítési problémáim vannak. Vagy ha írok egy ciklust ami 1-től 10-ig számol (1 mp-s közökkel) akkor vannak számok amik kimaradnak. Tudna valaki hozzáértő segíteni? A fent linkelt külföldi fórumokon leírják a metódust de nemigazán értem. Ha valakinek lenne egy kis ideje rám, az jó lenne.

A jelenlegi program:
(ebben a formában a WELCOME felirat meg sem érkezik jelenni)

Kód: Egész kijelölése

$regfile "m8def.dat"

Declare Sub Createtxt()
Declare Sub Displaytxt()                                    'text2s auf tid schreiben

Config Pind.7 = Output
Config Sda = Portd.6
Config Scl = Portb.0
Config I2cdelay = 48                                        '47

Wait 1
'Változók

'Szöveg előállításához
Dim Letters2s(8) As String * 1 , Parity_bit As String * 1
Dim Text2s As String * 8 , Bin2s(8) As String * 8
Dim Hex2s(8) As Byte , Count_parity As Byte
Dim Bitsofletter As String * 8
Dim A As Byte , B As Byte , C As Byte , D As Byte

'Egyéb változók

Dim Szam As Byte
Dim Wtime As Integer

'Üdvözlő üzenet

For A = 1 To 9
Text2s = "WELCOME "
Call Createtxt
Call Displaytxt
Next A


'Főprogram

Do
Incr Szam
If Szam > 5 Then Szam = 0
Text2s = "L/KM " + Str(szam) + ",6"
Call Createtxt
Call Displaytxt
Waitms 300
Loop



'Karakterek generálása
Sub Createtxt()
For A = 1 To 8
Count_parity = 0
Letters2s(a) = Mid(text2s , A , 1)
Hex2s(a) = Asc(letters2s(a))
Bin2s(a) = Bin(hex2s(a))
Bin2s(a) = Right(bin2s(a) , 7)
If Bin2s(a) = "0000000" Then
Bin2s(a) = "0100000"
End If

For B = 1 To 7                                              'anzahl der highs in wort zählen
Bitsofletter = Mid(bin2s(a) , B , 1)
If Bitsofletter = "1" Then
Incr Count_parity
End If
Next B

If Count_parity = 0 Or Count_parity = 2 Or Count_parity = 4 Or Count_parity = 6 Or Count_parity = 8 Then       'parität ermitteln
Parity_bit = "1"
Else
Parity_bit = "0"
End If

Bin2s(a) = Bin2s(a) + Parity_bit
Hex2s(a) = Binval(bin2s(a))
Next A
End Sub


'Karakterek kiírása i2c buszra
Sub Displaytxt()
Reset Portd.7                                               'pull mrq low
Waitus 2350                                                 '2350                                                 'mesured 2350
Set Portd.7
Waitus 103                                                  '105                                                  'let it got high again
I2cstart                                                    'start condition
Waitus 65                                                   '65
I2cwbyte &H94
Reset Portd.7
I2cwbyte &H01
I2cwbyte &H01
For C = 1 To 8
I2cwbyte Hex2s(c)
Next C
Set Portd.7
Waitus 250                                                  '250
I2cstop
End Sub
End
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

Hozzászólás Szerző: Bence »

Hello!

Fusebitek jól vannak beállítva? A Fusebit KLA987-et állítsd 111111-re, ha ez eddig alapbeállításon volt akkor nem 4 MHz-ről járt a chip és lehet hogy ez volt a probléma.
Bence
Avatar
szepnorbee
Bitmanipulátor
Hozzászólások: 122
Csatlakozott: 2009. augusztus 31. hétfő, 6:00

Hozzászólás Szerző: szepnorbee »

Csak PonyProg-al tudom programozni és fuse biteket állítani mert csak ezzel jó a programozóm. Ez meg nem ír KLA987-et a fusebitek között. A CLK 1111-re van lőve a CKOPT-pedig kikapcsolva (ha jól tudom ez a belső 2 kondi) PonyProg-ban nem tudnád leírni mire gondolsz?

Szerk: Köszi közben rájöttem!! A SUT-ot kellett még 11-re állítani és így sokkal stabilabb. Ez már nekem így jó is lessz! Köszi szépen!!!
Avatar
Bence
Tranzisztorgyógyász
Hozzászólások: 166
Csatlakozott: 2007. október 30. kedd, 6:00

Hozzászólás Szerző: Bence »

Szívesen. Én PonyProgba nem állítottam még fusebiteket, de örülök hogy sikerült!
Bence
Avatar
szepnorbee
Bitmanipulátor
Hozzászólások: 122
Csatlakozott: 2009. augusztus 31. hétfő, 6:00

Hozzászólás Szerző: szepnorbee »

Sziasztok! Van ez a címben szereplő kijelzőm. i2c hez hasonló a vezérlése. Most ismerkedem a Bascomnak azon részével, hogy külső LIB-eket is lehet használni. Van is ehez a kijelzőhöz egy lib-em ami AT89C2052-re lett írva 12Mhz-en:

Kód: Egész kijelölése

;Versja 1.0   pierwsza i ostatnia
;aby uzywac tej biblioteki trzeba na początku wpisać dytektywe
;$lib "ice.lib" 'a pod spodem takie coś
;$external Wait_sda
;$external Czekaj
;$external Takt
;$external I2c_start
;$external Tid_ende
;$external I2c_send
;$external Pisz_tid 'do wyswietlania uzywa się tylko tej procki ale pozostale są potrzebne do działania tej
;Miłej zabawy: Darek R. s_ice 5.12.2004

;wykorzystywane porty
;Scl Alias P1.0
;Sda Alias P1.1
;Mrq Alias P1.2




;procedura opuzniająca parametry podaje się w R0 i R1 (czas opuznienia)
;wywolanie
;mov r0,#255 : mov r1,#255 : lcall czekaj
[CZEKAJ]
Czekaj:
Loop0:
push r0
Loop1:
djnz r0,loop1
pop r0
djnz r1,loop0
ret
[END]




;PROCKI DO OBSLUGI LCD NA I2C OPLA ASTRY UWAGA SCL,SDA,MRQ SĄ PISANE NA STALE JEŚLI SIĘ COŚ ZMIENI TO W PROCEDURACH TERZ TRZEBA POZMIENIAĆ
;SCL=P1.0
;SDA=P1.1
;MRQ=P1.2
[WAIT_SDA]

Wait_sda:
clr P1.2      ;mrq ustaw na 0
              ;opuznij o 910us
mov r0,#223   ;JAKBY NIE DZIALALO TO PRUBUJ Z #230
mov r1,#2
lcall Czekaj
setb P1.2     ;mrq ustaw na 1
              ;opuznij o 910us
mov r0,#223
mov r1,#2
lcall Czekaj

mov r0,#223   ;opuznij o 910us jak bedzie wiecej to chyba nie zaszkodzi a może polepszyc
mov r1,#2
lcall Czekaj


ret
[END]


[TAKT]
takt:
;jak czasy za krotkie to nic nie widac
mov r0,#195      ;202us 95
mov r1,#1
lcall czekaj
setb P1.0        ;scl=1
mov r0,#145      ;102us 45
mov r1,#1
lcall czekaj
clr P1.0         ;scl=0
mov r0,#11       ;34us  11
mov r1,#1
lcall czekaj
ret
[END]


[I2C_START]
I2c_start:
;startuje ze stanów wysokich i potem i2c start
;to moze byc zbedne
;P1 = 7      od razu ustawia te bity 00000111b
;ustaw 0 na SDA gdy na scl jest 1 (warunek startu)
clr P1.1          
mov r0,#90        ;192us
mov r1,#1
lcall czekaj
clr P1.0          ;SCL=0
mov r0,#90        ;192us
mov r1,#1
lcall czekaj
ret
[END]

[TID_ENDE]
Tid_ende:
           ;opuznij o 71us
mov r0,#90 ;72us
mov r1,#1
lcall czekaj
setb P1.2 ;mrq=1
mov r0,#60 ;132us
mov r1,#1
lcall czekaj
setb P1.0 ;scl=1
mov r0,#55 ;122us
mov r1,#1
lcall czekaj
setb P1.1 ;sda=1
ret
[END]

[I2C_SEND]
;R2 JEST PARAMETREM PROCEDURY I ZAWIERA ZNAK DO WYSLANIA
I2c_send:
;mov r2,{znak}'wywolanie
clr c        ;zeruj carry flag
mov acc,r2   ;{znak}                                             ;zapisz liczbe do obrubki
rlc acc                                                       ;przesun w lewo o jeden bit
MOV C,{psw.0}                                                 ;ustaw carry flag tak jak bit parzystosci
jc dalej1                                                  ;jesli carry jest = 1 znaczy że liczba jest nieparzysta wiec nic nie rob z ta liczba Wyswietlacz opla ma kontrole parzystosci nieparzystą
setb acc.0                                                    ;ustawia bit aby byla nieparzysta liczba jedynek
Dalej1:
             ;acc zawiera daną do wyslania
;mov {znak},acc  ;przepisz z acc do znak

mov b,#8 ;powtóż 8 razy wysylanie bitu

Petla:
push acc      ;zapisz acc
push b        ;zapisz b

;przesuwanie bitow w celu wyodrebnienia jednego do wyslania
djnz b,shifting
sjmp noshifting
Shifting:
rrc a
djnz b,shifting
Noshifting:
anl a,#00000001b

;wysylanie bitu
jnz setsda
clr P1.1 ;Sda=0
sjmp opusc_ustawianie
Setsda:
setb P1.1 ;Sda=1
Opusc_ustawianie:

;$end Asm : Decr B : Sda = Znak.b : Incr B : $asm              'ustaw bit na sda dlatego jest decr b bo petla w asm wylacza sie jak b=0 i ten bit opuszczal, wiec petla zlicza od osmiu ,ale numeracja bitów jest od 7 do 0 , i po to to jest [ZASTĄPIONE ASEMBLEREM PATRZ WYŻEJ TAM GDZIE WYSYLANIE 8BITÓW]
pop b
pop acc

push b
lcall takt
pop b
djnz b,petla
clr P1.1 ;SDA=0 ack po wyslanym bajcie Sda i Mrq muszą byc na 0 inaczej nie bedzie dzialac
lcall takt

;opuznij o 42us AMENDE
mov r0,#15 ;52us
mov r1,#1
lcall czekaj
ret
[END]


[PISZ_TID]
;R0 jest parametrem wywolanie [mov r0,#{tekst}] - adres do zmiennej tekst potem lcall pisz
; Zmienna Tekst To Dim Tekst As String * 8
Pisz_TID:
orl P1,#&B00000111 ;wszystkie linie na stan wysoki SCL,SDA i MRQ
push r0            ;zapisz R0 z adresem do ciagu znakow
lCall Wait_sda
lCall I2c_start
mov r2,#74
lCall I2c_send     ;(74) w siedmiobitowym wychodzi 0x94 Adres wyswietlacza


clr p1.2           ;Mrq = 0  tu na stale bylo zerowane SCL,MRQ i SDA Mrq jest ustawione na 1 tylko podczas wysylania adresu do LCD
mov r0,#7          ;26us
mov r1,#1
lcall czekaj
mov r2,#0          ;ikonki1
lCall I2c_send
mov r2,#0          ;ikonki2
lCall I2c_send
 ; - - - - - - - - - - - - - - - - - - - - - - - - - -
pop R0             ;odtwóż adres zmiennej
mov R1,#0          ;flaga jesli 0 to wyzylaj znaki ciagu, jesli 1 to znak pusty (127)
mov b,#8
Wysylaj:
mov a,@r0          ;czytaj znak z ciągu

push b             ;trzeba zapisac bo i2csend zmienia B
push r0            ;trzeba zapisac bo procka czekaj uzywa r0 i r1 jak by zmienic na r3 i r4 to nie trzeba bedzie zapisywac i kod mniej zajmie


jz ustaw_flage     ;jesli (acc)znak=0 reszta ciągu ma mieć 127(pusty znak) skocz i ustaw flage
sjmp dalej3        ;jesli nie to nie rob nic i skocz dalej
Ustaw_flage:
mov r1,#1
Dalej3:


cjne r1,#0,pusty_znak ;jesli r1<>0 to pisz pusty znak
mov r2,a              ;znak ciągu
sjmp dalej4
Pusty_znak:
mov r2,#127           ;pusty znak ,jak spacja, po to żeby śmieci nie zostawaly jak ciąg jest krótszy
Dalej4:

push r1               ;zapisz flage
lcall I2c_send
pop r1                ;przywroc flage
pop r0
pop b
inc r0
djnz b,wysylaj

lcall Tid_ende
orl P1,#&B00000111    ;wszystkie linie na stan wysoki SCL,SDA i MRQ
ret
[END]
Viszont nekem mega8-am van itthol és azonos órajelen is használom (12Mhz). Miket kell átírnom egyi lyen lib-ben, hogy használhassam? Elég a pin-ek neveit átírni az általam meghatározottakra? Úgynézem ez full ASM-kód ami nekem héber :) Bocsi, ha hülyeséget kérdezek. Használni már tudnám ha sikerülne átírni.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Hát a gondok:

1, Az AVR és a 8051 ASM nyelve kicsit más....
2, Kommentek lengyelül vannak

A többi csak hab a tortán :P
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Avatar
tuccer
DrótVégénSzéndarab
Hozzászólások: 15
Csatlakozott: 2011. augusztus 14. vasárnap, 6:00

Érdeklődés

Hozzászólás Szerző: tuccer »

Sziasztok valaki tudna nekem segíteni a TID kijelző meghajtásában, mert az orosz link ( http://www.compcar.ru/forum/showthread.php?t=5898 ) ugyan mutat példa programot de nem tudom a helyes kapcsolást.
Előre is köszönöm.
Avatar
broland
Tranzisztorgyógyász
Hozzászólások: 152
Csatlakozott: 2009. április 20. hétfő, 6:00

Hozzászólás Szerző: broland »

hello

találtam egy ilyet: http://www.mikrocontroller.net/attachme ... el_tid.zip
Bascom + egyebek a zippben.

üDv Roland
Avatar
tuccer
DrótVégénSzéndarab
Hozzászólások: 15
Csatlakozott: 2011. augusztus 14. vasárnap, 6:00

Hozzászólás Szerző: tuccer »

broland írta:hello

találtam egy ilyet: http://www.mikrocontroller.net/attachme ... el_tid.zip
Bascom + egyebek a zippben.

üDv Roland
Köszi csak az a baj hogy nem értek a Bascom hoz, ha arduinóval tudnám megoldani az lenne a jó.
Nincs meg valakinek az elkeveisser -es cucc mert a honlapja már nem elérhető. köszi
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Arduino alá átírni?
Nem olyan bonyi a protokoll.... Az alaputasítások meg közel 1:1 cserélhetőek...
Avatar
tuccer
DrótVégénSzéndarab
Hozzászólások: 15
Csatlakozott: 2011. augusztus 14. vasárnap, 6:00

Hozzászólás Szerző: tuccer »

Robert írta:Arduino alá átírni?
Nem olyan bonyi a protokoll.... Az alaputasítások meg közel 1:1 cserélhetőek...
Valami segítséget tudnál adni hogy mégis hogy kezdjek hozzá??
Előre is köszi.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

"Mutiba a sültgalamb combja":

Dim ~ define
GetADC ~ analogread
call ... ~ függvények definiálása
set/reset ~ digitalwrite...
Válasz küldése