I2C LCD
I2C LCD
Sziasztok!
Próbálta már valaki az mcselec.com oldalon szereplő AN #118 - I2C LCD and Keboard library-t? Nekem sehogy se akar menni...
Várom a tapasztalatokat, hátha valakinek működött már!
Köszi
Próbálta már valaki az mcselec.com oldalon szereplő AN #118 - I2C LCD and Keboard library-t? Nekem sehogy se akar menni...
Várom a tapasztalatokat, hátha valakinek működött már!
Köszi
I2C LCD probléma
Szia.
Vettem tőled egy I2C LCD vezérlőt. Olyan probléma jelentkezett, hogy az LCD-n kb. 1 másodpercenként írja csak ki a karaktereket. Eddig tökéletesen működött, de mai napon ez merült fel. Először az LCD háttér világitása tünt le majd nagyon lassan irt ki egy alap programot
Kb. ennyi a program:
Do
Locate 2 , 1
LCD " Érték: " , A
INCR A
Loop
Az I2C le van benne inicializálva, de valamiért nagyon lassú a kiíratás.
Ha van valami ötleted azt szívesen meghallgatnám, milyen hibák lehetnek.
Vettem tőled egy I2C LCD vezérlőt. Olyan probléma jelentkezett, hogy az LCD-n kb. 1 másodpercenként írja csak ki a karaktereket. Eddig tökéletesen működött, de mai napon ez merült fel. Először az LCD háttér világitása tünt le majd nagyon lassan irt ki egy alap programot
Kb. ennyi a program:
Do
Locate 2 , 1
LCD " Érték: " , A
INCR A
Loop
Az I2C le van benne inicializálva, de valamiért nagyon lassú a kiíratás.
Ha van valami ötleted azt szívesen meghallgatnám, milyen hibák lehetnek.
Program beállított órajel, és achip beállított orajele azonos?
Az I2C vez sebessége:
4x20-ason tesztelve:
- Teleírva a kijelzőt kb. 3.5 frame/sec
- i2cdelay=10 esetén.
A teljes prg-t be tudod rakni?
Chip órajel, definíciók...
LED villogtatás portlábon 1 sec várakozással -> jó a sebessége?
Megax8-as chip esetén a DivClk8-at kikapcsoltad?
Az I2C vez sebessége:
4x20-ason tesztelve:
- Teleírva a kijelzőt kb. 3.5 frame/sec
- i2cdelay=10 esetén.
A teljes prg-t be tudod rakni?
Chip órajel, definíciók...
LED villogtatás portlábon 1 sec várakozással -> jó a sebessége?
Megax8-as chip esetén a DivClk8-at kikapcsoltad?
Szia.
Ennyi az egész program és ennél az A változó értékét 1 másodpercenként irja ki. Mi lehet a probléma?
Ennyi az egész program és ennél az A változó értékét 1 másodpercenként irja ki. Mi lehet a probléma?
Kód: Egész kijelölése
$regfile = "M32def.dat"
$crystal = 14745600
$baud = 9600
$hwstack = 256
$swstack = 256
$framesize = 256
'-------------------- Variable --------------------
Dim A As Single
'--------------------- LCD Init -------------------
'I2c
Config I2cdelay = 10
Config Sda = Portc.1
Config Scl = Portc.0
'I2C_LCD
$lib "#lcd_i2c-bl.lbx"
Const _i2c_lcd_address_w = &H4E
Const _lcd_bl = 1
Config Lcd = 20 * 4
Initlcd
Cls
Initlcd
Cls
A = 0
Cls
Locate 1 , 5
Lcd "Calibration"
' Bitwait Pind.7 , Reset
Do
Incr A
Locate 2 , 1
Lcd "Beer Pump 1: " ; A
LoopMega32 a biztoisítékbiteknél át van állatva, hogy ne a belső 1 MHZről járjon?
$baud minek, ha nincsen sorosport használva? (Tesztelni lehetne hogy a freki jó-e)
Én az órajelre tippelek....
Meg tudom lesni, hogy hogy viselkedik - este. De kb. 2-4 fps-t tud.
A karakteres LCD alapban - ha nem használt a Busy flag - 3-5 fps-t tud az AVR-ről. BUSY flag figyeléssel tud kb. 6-10 fps-t.
Ha a kijelző KS066-os chipes és nem a HD44780 (az összes szinte már KS chipes), akkor a Bascom 1.11.9.2 (?1.11.9.1) óta tudja speciálisan ezt is kezelni. Ennek megadás a Config LCD sorban lehet (lsd súgó, most nincs előttem)
Az I2CDelay=1 is lehet (200kHz busz). I2CDelay=10 esetén 50 kHz-s a busz. Ha kell gyorsítani, akkor még bele lehet ASM-ül is nyúlni, ekkor 400kHz-s lesz az I2C busz....
$baud minek, ha nincsen sorosport használva? (Tesztelni lehetne hogy a freki jó-e)
Én az órajelre tippelek....
Meg tudom lesni, hogy hogy viselkedik - este. De kb. 2-4 fps-t tud.
A karakteres LCD alapban - ha nem használt a Busy flag - 3-5 fps-t tud az AVR-ről. BUSY flag figyeléssel tud kb. 6-10 fps-t.
Ha a kijelző KS066-os chipes és nem a HD44780 (az összes szinte már KS chipes), akkor a Bascom 1.11.9.2 (?1.11.9.1) óta tudja speciálisan ezt is kezelni. Ennek megadás a Config LCD sorban lehet (lsd súgó, most nincs előttem)
Az I2CDelay=1 is lehet (200kHz busz). I2CDelay=10 esetén 50 kHz-s a busz. Ha kell gyorsítani, akkor még bele lehet ASM-ül is nyúlni, ekkor 400kHz-s lesz az I2C busz....
Hello mindenkinek!
Elakadtam egy kicsit így újév előtt...a meglévő rendszerhez próbából tenni akartam egy I2C-s LCD-t, de így nem akar menni, mivel már van egy 128x64-es gaf. lcd direkt a chipen és hát honnan tudja, hogy ha CLS-t írok, akkor melyiket kell törölni? Hibát is ad, ha leszeretném fordítani! Hol lehetne módosítani, hogy meg tudjam külömböztetni a CLS-küldést ?
Köszönöm!
u.i.: az I2C LCD vezérlő máshol szuperűl megy, nem volt baj vele...
Elakadtam egy kicsit így újév előtt...a meglévő rendszerhez próbából tenni akartam egy I2C-s LCD-t, de így nem akar menni, mivel már van egy 128x64-es gaf. lcd direkt a chipen és hát honnan tudja, hogy ha CLS-t írok, akkor melyiket kell törölni? Hibát is ad, ha leszeretném fordítani! Hol lehetne módosítani, hogy meg tudjam külömböztetni a CLS-küldést ?
Köszönöm!
u.i.: az I2C LCD vezérlő máshol szuperűl megy, nem volt baj vele...
- nobody_hun
- Bitfaragó
- Hozzászólások: 425
- Csatlakozott: 2005. november 14. hétfő, 7:00
"és hát honnan tudja, hogy ha CLS-t írok, akkor melyiket kell törölni?"
Szerintem onnan, hogy ha sima CLS-t írsz, akkor az a grafikust törli, ha pedig I2C-n kiírod a törlés parancsát, akkor az I2C-st.
Kérdés, hogy lib-et használsz-e, vagy a forrásban vannak megírva a I2C-s LCD rutinok.
Ha lib-ed van, írd át a rutin nevét CLS-ről CLSI2C-re és megszűnik a hiba.
Szerintem onnan, hogy ha sima CLS-t írsz, akkor az a grafikust törli, ha pedig I2C-n kiírod a törlés parancsát, akkor az I2C-st.
Kérdés, hogy lib-et használsz-e, vagy a forrásban vannak megírva a I2C-s LCD rutinok.
Ha lib-ed van, írd át a rutin nevét CLS-ről CLSI2C-re és megszűnik a hiba.
"Az IC-k füsttel működnek. Ha kijön belőlük a füst, nem működnek tovább." - ismeretlen szerző
"Az ID:FFFFFF egyenlő az Atmel még nem kiadott processzorával."
"Az ID:FFFFFF egyenlő az Atmel még nem kiadott processzorával."
2 opció van:
- ha libraryként kezeled, az a karakteres LCDkezelő rutint cseréli le az I2C-sre.
- ha 2 LCDt is kell kezelni n8karakterest _és_ grafikust, akkor azt a bascom nem tudja. Ekkor az I2Cre neked kell kiküldeni a HD44780 kódjait. Erre mintát találsz a karakteres LCD fejezet végén is, illetve a WebSzerver fejeztet végén van így megoldva a karakteres LCD kezelése.
Az AVR nem tudja a 2monitoros módot:)
Érdekes lehet még, hogy egy AVRt berakni a LCD kezelésére, ami a sorosport->LCD átalakítást megteszi. Erre egy Tiny2313 is bőven elég...
Igaz nem annyira elegáns:).
- ha libraryként kezeled, az a karakteres LCDkezelő rutint cseréli le az I2C-sre.
- ha 2 LCDt is kell kezelni n8karakterest _és_ grafikust, akkor azt a bascom nem tudja. Ekkor az I2Cre neked kell kiküldeni a HD44780 kódjait. Erre mintát találsz a karakteres LCD fejezet végén is, illetve a WebSzerver fejeztet végén van így megoldva a karakteres LCD kezelése.
Az AVR nem tudja a 2monitoros módot:)
Érdekes lehet még, hogy egy AVRt berakni a LCD kezelésére, ami a sorosport->LCD átalakítást megteszi. Erre egy Tiny2313 is bőven elég...
Igaz nem annyira elegáns:).
Felrakva a File Csere-Bere alá:
#I2C-LCDlibrary-k.zip (4 kbyte)
Tartalma:
#lcd_i2c-bl.LBX - MCP23008
#lcd_i2c-bl.lib - MCP23008
#lcd_i2c-bl_mcp23017.lib - MCP23017
#lcd_i2c-bl_mcpduo.lib - MCP23008+MCP23017 együtt
A 23017-eseknál a szabad porton a billentyűzet kezelés részben implementálva (csak a sima nyomógomb, nem a gombmátrix).
#I2C-LCDlibrary-k.zip (4 kbyte)
Tartalma:
#lcd_i2c-bl.LBX - MCP23008
#lcd_i2c-bl.lib - MCP23008
#lcd_i2c-bl_mcp23017.lib - MCP23017
#lcd_i2c-bl_mcpduo.lib - MCP23008+MCP23017 együtt
A 23017-eseknál a szabad porton a billentyűzet kezelés részben implementálva (csak a sima nyomógomb, nem a gombmátrix).
De ha lib-et használok, akkor nobody-hun válasza jónak tűnik, csak le kell cserélni az utasításokat...vagy akkor ez még sem menne? nem lenne szükség csak 2utasításara, "cls" és "lcd".
(Az egyes helységekben szerettem volna megjeleníteni a "központ" által mért adatokat, vagyis a központ gyakran méri ezeket, de a helységekben lévő lcd-re csak percenként küldeném ki.)
u.i.: valamiért nem lehet letölteni a lib-es file-t!
(Az egyes helységekben szerettem volna megjeleníteni a "központ" által mért adatokat, vagyis a központ gyakran méri ezeket, de a helységekben lévő lcd-re csak percenként küldeném ki.)
u.i.: valamiért nem lehet letölteni a lib-es file-t!
Így próbáltam, de IE-ben sem ment...de most már jó, köszönöm! Neki is esek még mielőtt harangoznak 
...kis nézelődés utén rájöttem, hogy ílyen formában tényleg Nem lehet üzemeltetni 2 LCD-t
(valahol nem lehetne átírni az eredeti Cls parancsot?) Marad a másik megoldás, vagyis, hogy direkt írom ki a parancsokat az I2C-re. De ezt most szerintem halasztom, pedig jó móka lenne, hogy 1-2 helyen I2C-s LCD-n megjelennének a főbb adatok...
...kis nézelődés utén rájöttem, hogy ílyen formában tényleg Nem lehet üzemeltetni 2 LCD-t
Direkt LCD kezelés, I2C porton:
Remélem működik, egy prg-ből emeltem ki, amiben szintén ez a több LCD kezelés volt feladat....
De esetleg megoldható, hogy (pl. RS485 busz ha van), akkor az LCD-t oda is felrakni, mint önálló eszközt (ekkor önálló AVRt is kapna már)).
Az I2C-s LCD Natív kezelése (az ékezetes karakterek nincsenek létrehozva, alapban 2*16-os LCDre készült)
Támogatott funkciók:
- Locate
- CLS
- Home
- Karakter kiírása
- Firstline
- Secondline
Remélem működik, egy prg-ből emeltem ki, amiben szintén ez a több LCD kezelés volt feladat....
De esetleg megoldható, hogy (pl. RS485 busz ha van), akkor az LCD-t oda is felrakni, mint önálló eszközt (ekkor önálló AVRt is kapna már)).
Az I2C-s LCD Natív kezelése (az ékezetes karakterek nincsenek létrehozva, alapban 2*16-os LCDre készült)
Támogatott funkciók:
- Locate
- CLS
- Home
- Karakter kiírása
- Firstline
- Secondline
Kód: Egész kijelölése
'I2C beállítás
Config I2cdelay = 10 'Csak szoftveres esetben kell
Config Scl = Portc.5 'Is serial clock SCL
Config Sda = Portc.4 'Is serial data SDA
I2cinit
'I2C alapu LCD modul
'Configure I2C LCD (PCF8574) Illetve alap MCP23017 ugyanezen a címen (A0,A1,A2:GND)
Const Bit_rs = 4
Const Bit_e = 7
Const Bit_bl = 6 'hattervilagitas
'LCD variables
Dim I2c_lcd_t As String * 80 'Teljes LCD 4*20 eseten)
Dim I2c_lcd_tempstr As String * 1
Dim I2c_lcd_temp As Byte
Dim I2c_lcd_x As Byte
Dim I2c_lcd_hulp As Byte
Dim I2c_lcd_h As Byte
Dim I2c_lcd_bl As Bit
Dim I2c_lcd_a As Byte 'A csatorna
Dim I2c_lcd_b As Byte 'B csatorna
'Dim I2c_lcd_xk As Byte
'Dim I2c_lcd_yk As Byte
'Locate in LCD
'Declare Sub I2c_lcd_locate(byval I2c_lcd_x As Byte , Byval I2c_lcd_y As Byte)
'Subroutine to initialize the LCD display
Declare Sub I2c_lcd_init
Declare Sub I2c_lcd_char(byval I2c_lcd_c As Byte)
'Subroutine to send a text to the LCD
Declare Sub I2c_lcd_txt
'Subroutine to do a clear/home for the LCD
Declare Sub I2c_lcd_home ' CLS/Home
' goto 0/0 of LCD
Declare Sub I2c_lcd_firstline
' goto second line of LCD
Declare Sub I2c_lcd_secondline
'MCP23017-re kiiras B port!
Declare Sub I2c_lcd_portkiir 'B
.
.
.
.
.
.
'I2C LCD szubrutinok
' Subroutine to initialize the LCD-display
Sub I2c_lcd_init
I2cfut = 1
'MCP23017 init
I2cinit
I2cstart 'Sends start condition
I2cwbyte I2c_lcd_address_w '000 cimu eszkoz (kimenet)IOCON regiszter beállítása
I2cwbyte &H0A 'A es B
I2cwbyte Iocon
I2cstop
I2cstart '000 - Kimenet B csatorna beállítás
I2cwbyte I2c_lcd_address_w
I2cwbyte 1
I2cwbyte Iodirki
I2cstop
'Device be
I2cstart '000 - Bemenet A csatorna beállítás
I2cwbyte I2c_lcd_address_w 'A
I2cwbyte 0
I2cwbyte Iodirbe
I2cstop
I2cstart '000 - Bemenet A Pull Up beállítás
I2cwbyte I2c_lcd_address_w 'A
I2cwbyte &H0C
I2cwbyte 255
I2cstop
I2cstart '000 - Bemenet A Invert beállítás
I2cwbyte I2c_lcd_address_w 'A
I2cwbyte &H02
I2cwbyte 255
I2cstop
Waitms 15
'set 8-bit mode (attention)
'toggle the E -line
I2c_lcd_b = &B10000011
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000011
Call I2c_lcd_portkiir
Waitms 4
'set 8-bit mode (attention)
I2c_lcd_b = &B10000011
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000011
Call I2c_lcd_portkiir
Waitms 1
'set 8-bit mode (attention)
I2c_lcd_b = &B10000011
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000011
Call I2c_lcd_portkiir
Waitms 4
'set 4-bit operation
I2c_lcd_b = &B10000011
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000011
Call I2c_lcd_portkiir
Waitms 1
'set 8-bit mode (attention)
I2c_lcd_b = &B10000010
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000010
Call I2c_lcd_portkiir
I2c_lcd_b = &B10001000
Call I2c_lcd_portkiir
I2c_lcd_b = &B10001000
Call I2c_lcd_portkiir
Waitms 1
I2c_lcd_b = &B10000000
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000000
Call I2c_lcd_portkiir
'Display off, cursor off, blink off
I2c_lcd_b = &B10001000
Call I2c_lcd_portkiir
I2c_lcd_b = &B00001000
Call I2c_lcd_portkiir
Waitms 1
I2c_lcd_b = &B10000000
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000000
Call I2c_lcd_portkiir
'display on, cursor off, blinking off
I2c_lcd_b = &B10001100
Call I2c_lcd_portkiir
I2c_lcd_b = &B00001100
Call I2c_lcd_portkiir
Waitms 1
I2c_lcd_b = &B10000000
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000000
Call I2c_lcd_portkiir
'clear display and send cursor to address 0
I2c_lcd_b = &B10000001
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000001
Call I2c_lcd_portkiir
Waitms 1
I2cfut = 0
End Sub
' Routine to send a character to the LCD-display
'
Sub I2c_lcd_char(i2c_lcd_c As Byte)
If I2c_lcd_c = 42 Then '* CLS/HOME
Call I2c_lcd_home
Elseif I2c_lcd_c = 35 Then '# second line
Call I2c_lcd_secondline
Else
I2c_lcd_temp = I2c_lcd_c And &HF0
Rotate I2c_lcd_temp , Right , 4
' i2c_Lcd_temp.bl = i2c_Lcd_bl
I2c_lcd_b = I2c_lcd_temp
Call I2c_lcd_portkiir
Set I2c_lcd_temp.bit_e
Set I2c_lcd_temp.bit_rs
' i2c_Lcd_temp.bl = i2c_Lcd_bl
I2c_lcd_b = I2c_lcd_temp
Call I2c_lcd_portkiir
Reset I2c_lcd_temp.bit_e
Reset I2c_lcd_temp.bit_rs
' i2c_Lcd_temp.bl = i2c_Lcd_bl
I2c_lcd_b = I2c_lcd_temp
Call I2c_lcd_portkiir
I2c_lcd_temp = I2c_lcd_c And &H0F
' i2c_Lcd_temp.bl = i2c_Lcd_bl
I2c_lcd_b = I2c_lcd_temp
Call I2c_lcd_portkiir
Set I2c_lcd_temp.bit_e
Set I2c_lcd_temp.bit_rs
' i2c_Lcd_temp.bl = i2c_Lcd_bl
I2c_lcd_b = I2c_lcd_temp
Call I2c_lcd_portkiir
Reset I2c_lcd_temp.bit_e
Reset I2c_lcd_temp.bit_rs
' i2c_Lcd_temp.bl = i2c_Lcd_bl
I2c_lcd_b = I2c_lcd_temp
Call I2c_lcd_portkiir
End If
End Sub
' Routine to send a string to the LCD-display
'
' Fill i2c_Lcd_t with the text and call i2c_Lcd_txt
'
Sub I2c_lcd_txt
I2cfut = 1
I2c_lcd_hulp = Len(i2c_lcd_t)
For I2c_lcd_x = 1 To I2c_lcd_hulp
I2c_lcd_tempstr = Mid(i2c_lcd_t , I2c_lcd_x , 1)
I2c_lcd_temp = Asc(i2c_lcd_tempstr)
Call I2c_lcd_char(i2c_lcd_temp)
Next I2c_lcd_x
I2cfut = 0
End Sub
Sub I2c_lcd_home
I2c_lcd_b = &B10000000
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000000
Call I2c_lcd_portkiir
Waitms 2
I2c_lcd_b = &B10000001
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000001
Call I2c_lcd_portkiir
Waitms 2
End Sub
Sub I2c_lcd_secondline
Call I2c_lcd_firstline
For I2c_lcd_h = 1 To 40
I2c_lcd_b = &B10000001
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000001
Call I2c_lcd_portkiir
Waitms 2
I2c_lcd_b = &B10000100
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000100
Call I2c_lcd_portkiir
Waitms 2
Next I2c_lcd_h
End Sub
Sub I2c_lcd_firstline
I2c_lcd_b = &B10000000
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000000
Call I2c_lcd_portkiir
Waitms 2
I2c_lcd_b = &B10000010
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000010
Call I2c_lcd_portkiir
Waitms 2
End Sub
'(Sub I2c_lcd_locate(i2c_lcd_xk As Byte , I2c_lcd_yk As Byte)
I2cfut = 1
Local 1temp As Byte
Local 2temp As Byte
'Firstline, left
I2c_lcd_b = &B10000000
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000000
Call I2c_lcd_portkiir
Waitms 2
I2c_lcd_b = &B10000010
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000010
Call I2c_lcd_portkiir
Waitms 2
Select Case I2c_lcd_yk
Case 2 : 1temp = 40
Case 3 : 1temp = 20
Case 4 : 1temp = 60
Case Else : 1temp = 0
End Select
1temp = 1temp + I2c_lcd_xk
Decr 1temp
For 2temp = 1 To 1temp
I2c_lcd_b = &B10000001
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000001
Call I2c_lcd_portkiir
Waitms 2
I2c_lcd_b = &B10000100
Call I2c_lcd_portkiir
I2c_lcd_b = &B00000100
Call I2c_lcd_portkiir
Waitms 2
Next 2temp
I2cfut = 0
End Sub
')
Sub I2c_lcd_portkiir
I2c_lcd_b.bit_bl = I2c_lcd_bl
I2cstart
I2cwbyte I2c_lcd_address_w
I2cwbyte &H15
I2cwbyte I2c_lcd_b
I2cstop
End Sub