I2C LCD

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
pkedvessy
Tranzisztorgyógyász
Hozzászólások: 198
Csatlakozott: 2006. január 1. vasárnap, 7:00

I2C LCD

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

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
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Igen.

Nem tetszett. Maradtam a hagyományos kiírásnál. Az működik (Home, Text, Köv sor, CLS). A MCSelec oldalon levő csak PCF8xxx chiphez jó. Ez meg drága (olcsóbb alternatíva is van, arra meg van a SW).
Egyszer a lib-et is átfragagom erre.
Avatar
Gova
DrótVégénSzéndarab
Hozzászólások: 26
Csatlakozott: 2008. február 14. csütörtök, 7:00

I2C LCD probléma

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

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.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

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?
Avatar
Gova
DrótVégénSzéndarab
Hozzászólások: 26
Csatlakozott: 2008. február 14. csütörtök, 7:00

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

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?

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

   Loop
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Mega32 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....
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

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

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...
Avatar
nobody_hun
Bitfaragó
Hozzászólások: 425
Csatlakozott: 2005. november 14. hétfő, 7:00

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

"é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.
"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."
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

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

szóval akkor ennek így működni kell...
a .lbx állomány megvan, de nem találom a .lib-et, a file csere-bere alá feltudnád tölteni esetleg?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

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:).
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

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).
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

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

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!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Jobb egérgomb -> mentés másként.

Átnevezetem, a # nem tetszett a firefoxnak...
Avatar
norbi
Chipgyilok
Hozzászólások: 308
Csatlakozott: 2006. augusztus 3. csütörtök, 6:00

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

Í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 :D

...kis nézelődés utén rájöttem, hogy ílyen formában tényleg Nem lehet üzemeltetni 2 LCD-t :cry: (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...
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

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

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
Válasz küldése