I2CLCD vezérlés - hiba?

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00
Tartózkodási hely: Perbál
Kapcsolat:

HozzászólásSzerző: tetye » 2011. november 25. péntek, 13:12

Sziasztok!
Az lenne a kérdésem hogy hol lehet a hiba? :)

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


$regfile = "m644def.dat"
$crystal = 11059200
$baud = 19200
$hwstack = 100
$swstack = 130
$framesize = 100

'I2C____________________________________________________________________________
Config Sda = Portc.1
Config Scl = Portc.0
Config I2cdelay = 10
I2cinit

$lib "#lcd_i2c-bl_mcp23017.lib"                             'My compiled i2c driver for the LCD
Const _i2c_lcd_address_w40 = &B01000000                     'MCP23017
Const _i2c_lcd_bl = 1                                       'Backlight yes/no
Config Lcd = 16 * 2
Initlcd
Cls
Initlcd
Cls

Main:

Lcd "Hello world."

End

Már fordításnál hibát irt. / invalid datatype /varible not dimensioned
#lcd_i2c-bl_mcp23017.lib tartalma:

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

copyright = Robert Cseh (csehrobert@tavir.hu)
www       = avr.tavir.hu
email     = csehrobert@tavir.hu
comment   = I2C LCD driver for MCP23017
libversion   = 1.00
date         = 10 feb 2007
statement    = You are free to use this code any way you like.
statement    = Please inform me any tips via mail about this library.
history      = No known bugs.


;define a constant named i2c_lcd_address_w pointing to the i2c address
;_lcd_bl is a backlight switcher.
;
;Connect the following pins from MCP23008 to LCD
;
;P0 - D4
;P1 - D5
;P2 - D6
;P3 - D7
;P4 - RS
;P5 - RW (not used, set to 0 to ground for write)
;P6 - Bl (backlight switch)
;P7 - E1

[_Init_LCD]
_Init_LCD:
 *BASIC: I2cinit
 *BASIC: I2cstart
 *BASIC: I2cwbyte _i2c_lcd_address_w
 *BASIC: I2cwbyte &H0A
 *BASIC: I2cwbyte &B00001100
 *BASIC: I2cstop
 *BASIC: I2cstart
 *BASIC: I2cwbyte _i2c_lcd_address_w
 *BASIC: I2cwbyte 1
 *BASIC: I2cwbyte 0
 *BASIC: I2cstop
 *BASIC: I2cstart
 *BASIC: I2cwbyte _i2c_lcd_address_w
 *BASIC: I2cwbyte 0
 *BASIC: I2cwbyte 255
 *BASIC: I2cstop
 *BASIC: I2cstart
 *BASIC: I2cwbyte _i2c_lcd_address_w
 *BASIC: I2cwbyte &H0C
 *BASIC: I2cwbyte 255
 *BASIC: I2cstop
 *BASIC: I2cstart
 *BASIC: I2cwbyte _i2c_lcd_address_w
 *BASIC: I2cwbyte &H02
 *BASIC: I2cwbyte 255
 *BASIC: I2cstop
 *BASIC: waitms 50
 ldi r16,128       ; this is to make the initialization on both halfs of a line LCD
 Ldi _temp1, &h03   ; at init-time I call all routines before _lcd_e is loaded into r16
 Rcall _Send_to_LCD
 *BASIC: waitms 4
 Rcall _Send_to_LCD
 Rcall _Send_to_LCD
 Ldi _temp1, &h02
 Rcall _Send_to_LCD
 Ldi _temp1, &h28
 Rcall _Write_lcd_byte  ;RS flag should to be 0, so jump directly to write byte
 Ldi _temp1, &h08
 Rcall _Write_lcd_byte
 Ldi _temp1, &h0c
 Rcall _Write_lcd_byte
 Ldi _temp1, &h01
 Rjmp _Write_lcd_byte
[END]


[_Write_lcd]
_Write_lcd:
 ldi r16, 128
 sbr r16,&h10                         ;set RS flag (4 high bits is used as control)
 rjmp _write_lcd_byte
_Lcd_Control:
 ldi r16, 128
_write_lcd_byte:
 push r24
 Swap _temp1                               
 Rcall _Write_lcd_Nibble
 pop r24       
_Write_lcd_nibble:
 Cbr _temp1,&HF0                      ; E1, RW, RS low

_Send_to_LCD:
push r26
push r27
 ldi r25,3
_send_3_times:
 *BASIC: I2cstart
 *BASIC: I2cwbyte _i2c_lcd_address_w
 *BASIC: I2cwbyte &H15
 *BASIC: _temp1.6=_i2c_lcd_bl
 *BASIC: I2cwbyte _temp1
 *BASIC: i2cstop
 eor _temp1,R16                         ; Xor E1 to set them
; @genus(250)
 ldi r26,0
_LCD_delay:
 dec R26
 brne _LCD_delay
 Dec R25
 Brne _send_3_times
 eor _temp1,R16                ; Xor to restore to initial state (even number of times)
pop r27
pop r26
ret

[END]

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9993
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2011. november 25. péntek, 14:41

A lib a MCP23008-hoz van, míg Te a MCP23017-et kezelnéd.
A címet nézd meg:
_i2c_lcd_address_w40 helyett _i2c_lcd_address_w van a LIBben.

Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00
Tartózkodási hely: Perbál
Kapcsolat:

HozzászólásSzerző: tetye » 2011. november 25. péntek, 16:50

A háttér világítást hogy lehet felkapcsolni?

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9993
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

HozzászólásSzerző: Robert » 2011. november 25. péntek, 16:55

A betűk egymás után, általában értelmes szöveget adnak ki :P

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

Const _i2c_lcd_bl = 1                                       'Backlight yes/no

Avatar
tetye
Chipgyilok
Hozzászólások: 279
Csatlakozott: 2007. augusztus 29. szerda, 6:00
Tartózkodási hely: Perbál
Kapcsolat:

HozzászólásSzerző: tetye » 2011. november 25. péntek, 16:56

Az úgy volt, csak nem működött azt hittem kell még valami.
Működik, csak rossz volt a kijelző. Zsír új displaytech 162b...
Köszi!

Avatar
kefeur
Tranzisztorgyógyász
Hozzászólások: 186
Csatlakozott: 2008. február 17. vasárnap, 7:00
Tartózkodási hely: Szuhakálló

Re: I2CLCD vezérlés - hiba?

HozzászólásSzerző: kefeur » 2015. február 18. szerda, 22:00

Üdv mindenkinek .
Nem nyitottam új témát PCF8574 miatt .
Bascom alá szeretnék lib. et a Kínai .. változtathoz.
Amit eddig találtam sajnos javarészt nem volt használható.
1 működő van , de az változók kiírását nem teszi lehetővé.
4*40 es kijelzőhöz szeretném.
A működő lib lejjebb , de már ezen is faragni kellett.

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

copyright = Kent Andersson
www       = none
email     = kent@smmab.se
comment   = I2C LCD driver
libversion   = 1.02
date         = 31 march 2002
statement    = You are free to use this code any way you like, if you are able to optimize
statement    = it better, please send me an update on my e-mail.
history      = No known bugs.

;modifiziert für YwRobot: E2 = BT dient zur Hintergrundbeleuchtung und muss zur Anzeige high sein!

;define a constant named PCF8574_LCD pointing to the i2c address
;dimension _lcd_e as byte to control the E-lines (4 lines LCD:s)
;_lcd_e should have one of the following values
;128 to enable E1, 64 to enable E2, 192 to enable both E1 and E2 (cls, deflcdchar)
;Connect the following pins from PCF8574 to LCD
;
;P0 - D4
;P1 - D5
;P2 - D6
;P3 - D7
;P4 - RS
;P5 - RW (not used, set to 0 to ground for write)
;P6 - E2 (on 1 or 2 line display nc)
;P7 - E1

[_Init_LCD]
_Init_LCD:
 *BASIC: waitms 50
 ldi r16,&hC0       ; this is to make the initialization on both halfs of a 4-line LCD
 Ldi _temp1, &h03   ; at init-time I call all routines before _lcd_e is loaded into r16
 Rcall _Send_to_LCD
 *BASIC: waitms 4
 Rcall _Send_to_LCD
 Rcall _Send_to_LCD
 Ldi _temp1, &h02
 Rcall _Send_to_LCD
 Ldi _temp1, &h28
 Rcall _Write_lcd_byte  ;RS flag should to be 0, so jump directly to write byte
 Ldi _temp1, &h08
 Rcall _Write_lcd_byte
 Ldi _temp1, &h0c
 Rcall _Write_lcd_byte
 Ldi _temp1, &h01
 Rjmp _Write_lcd_byte
[END]


[_Write_lcd]
_Write_lcd:
* lds r16,{_lcd_e}
 sbr r16,&h10                         ;set RS flag (4 high bits is used as control)
 rjmp _write_lcd_byte
_Lcd_Control:
* lds r16,{_lcd_e}
_write_lcd_byte:
 push r24
 Swap _temp1
 Rcall _Write_lcd_Nibble
 pop r24
_Write_lcd_nibble:
 Cbr _temp1,&b11110000                      ; E1, E2, RW, RS low

_Send_to_LCD:
; E2 = Backlight high setzen:
  *BASIC: _temp1.6 = 1
; oder...
; *BASIC: _temp1 = _temp1 or &B01000000
push r26
push r27
 ldi r25,3

* lds r26,{lcd_backlight}
  BST  r26, 0
* BLD  _temp1, 6


_send_3_times:
PUSH _temp2
  BST  _temp1, 0
* BLD  _temp2, PCF_D4
  BST  _temp1, 1
* BLD  _temp2, PCF_D5
  BST  _temp1, 2
* BLD  _temp2, PCF_D6
  BST  _temp1, 3
* BLD  _temp2, PCF_D7
  BST  _temp1, 4
* BLD  _temp2, PCF_RS
  BST  _temp1, 5
* BLD  _temp2, PCF_RW
  BST  _temp1, 6
* BLD  _temp2, PCF_E2
  BST  _temp1, 7
* BLD  _temp2, PCF_E1
 *BASIC: i2csend pcf8574_LCD, _temp2
  POP  _temp2
  eor _temp1,R16                       ; Xor E1 and/or E2 to set them
; @genus(250)
 ldi r26,0
_LCD_delay:
 dec R26
 brne _LCD_delay
 Dec R25
 Brne _send_3_times
 eor _temp1,R16          ; Xor to restore to initial state (even number of times)
pop r27
pop r26
ret

[END]


A basic kód amivel teszteltem :

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

'----------------------------------------------------------------------------
$regfile = "m328pdef.dat"
$crystal = 16000000
$baud = 9600
$lib "china_i2c_lcd.lib"
'$hwstack = 64
'$swstack = 10
'$framesize = 40


'**********************************************************
'******************* Deklarationen ************************

Const Pcf8574_lcd = &H4E                                    'Adresse des I2C-LCDs

Dim _lcd_e As Byte
Dim Lcd_backlight As Byte
_lcd_e = 128

Dim A As Bit
Dim B As Long
Dim W As Word
Dim S As String * 10
Dim Z As Bit
Dim Q As Bit

Const Pcf_d4 = 4                                            'Pinzuordnung PCF8574 -> LCD
Const Pcf_d5 = 5
Const Pcf_d6 = 6
Const Pcf_d7 = 7
Const Pcf_rs = 0
Const Pcf_rw = 1                                            'Backlight
Const Pcf_e2 = 3                                            'e2/rw.
Const Pcf_e1 = 2                                            'E
'****************** Initialisierung ***********************

Config Scl = Portc.5                                        'Configure i2c SCL
Config Sda = Portc.4                                        'Configure i2c SDA
Config Lcd = 20 * 4
Config I2cdelay = 10
Config Portc.0 = Input
Config Portb.5 = Output
I2cinit
'_lcd_e = 128 select E1, 64 select E2, 192 select both (for CLS or DefLCDChar etc.)

                                              'Upper half of 4-line display is selected

'Here the LCD test program that is included in BASCOM follows
'and at the end there is a demo of the keyboard scan routine


'Config Lcd = 40 * 4                                         'configure lcd screen
'other options are 16 * 4 and 20 * 4, 20 * 2 , 16 * 1a
'When you dont include this option 16 * 2 is assumed
'16 * 1a is intended for 16 character displays with split addresses over 2 lines

'$LCD = address will turn LCD into 8-bit databus mode
'       use this with uP with external RAM and/or ROM
'       because it aint need the port pins !
' Put your own strings here
'warte bis Kondensator bei Ta0 geladen, auch für LCD-Init:
Waitms 300
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Set Portb.5

'Lcd_backlight = 0


'**********************************************************
'******************** főprogram ***************************
Cls
Do

B = Getadc(0)
B = 120
S = Str(b)

S = Format(s , "000.0")

'Print B ; " " ; S
Waitms 10

Locate 1 , 1
Lcd "  Fotosensor  "

Locate 2 , 1
Lcd "  value ="
'Lcd S
' Wait 1
Waitms 200
Locate 3 , 1
Lcd "3_ik sor teszt"
Locate 4 , 1
Lcd "4-ik sor teszt" ; "B "
Toggle Q
Portb.5 = Q
A = Q Xor 1
Lcd_backlight = A
 Loop

End


Az S , vagy B változók kiíratásának gíümölcse egy jó kusza karaktrteli kijelző, nem látom át miért.
Talán az MCP23017.lib et kellene átfaragni , konfigolható PCF8574 vezérlésére persze 4 soros lcd hez is.
Az én képességeimet meghaladja sajna!
Portkiosztás a tesztkódban:
Const Pcf_d4 = 4 'PCF8574 -> LCD
Const Pcf_d5 = 5
Const Pcf_d6 = 6
Const Pcf_d7 = 7
Const Pcf_rs = 0
Const Pcf_rw = 1 'Backlight
Const Pcf_e2 = 3 'e2/rw.
Const Pcf_e1 = 2 'E
A kijelző R/W je persze testen.
Fizikálisan így passzol :oops:
Minden megoldás érdekelne .
Köszönettel: Feri
Kefeur

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9993
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: I2CLCD vezérlés - hiba?

HozzászólásSzerző: Robert » 2015. február 19. csütörtök, 5:39

A standard i2c/PCF8574 libraryt már nézted?

http://www.mcselec.com/index.php?option ... &Itemid=57

Avatar
csabeszq
Bitfaragó
Hozzászólások: 676
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: I2CLCD vezérlés - hiba?

HozzászólásSzerző: csabeszq » 2015. február 19. csütörtök, 6:49

A standard library-t nekem sikerült bebukni.

Kétféle I2C LCD panelt lehet kapni. Amiről te beszélsz, azon fejjel lefelé van a PCF8574 IC, de én olyat vásároltam, amin egyenesen van.

Értelemszerűen teljesen más biteket kell a fejjel lefordított és az egyenesen álló IC lábain programozni.

BL-EN-RW-RS-D4-D5-D6-D7
3-2-1-0-4-5-6-7 (ami a LiquidCrystal_I2C kódja)
7-4-5-6-0-1-2-3 (én ilyet vásároltam)

De mondjuk a bitek sem stimmeltek, mert a 7. bit 0-n bekapcsolta a háttérvilágítást, 1-en kikapcsolta. A kód fordítva működött. :)

Avatar
kefeur
Tranzisztorgyógyász
Hozzászólások: 186
Csatlakozott: 2008. február 17. vasárnap, 7:00
Tartózkodási hely: Szuhakálló

Re: I2CLCD vezérlés - hiba?

HozzászólásSzerző: kefeur » 2015. február 19. csütörtök, 10:57

Köszi mindenkinek.
A standard lib sajna nagyon nem jó.
Az előző faragva tisztán karakteres módban teljesen jó , de viszont változókat nem lehet vele kijeleztetni.
Ez a nagy probléma.
Kefeur

Avatar
kefeur
Tranzisztorgyógyász
Hozzászólások: 186
Csatlakozott: 2008. február 17. vasárnap, 7:00
Tartózkodási hely: Szuhakálló

Re: I2CLCD vezérlés - hiba?

HozzászólásSzerző: kefeur » 2015. február 19. csütörtök, 11:58

Az eredeti ami müködik innen van: http://bascom-forum.de/archive/index.php/t-2567.html
Ebbe tettem bele a háttérvilágítás ki/be kapcsolását .
Előzőleg azt másoltam be ide a fórumba.

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

; E2 = Backlight high setzen:
  *BASIC: _temp1.6 = 1
; oder...
; *BASIC: _temp1 = _temp1 or &B01000000
push r26
push r27
 ldi r25,3

* lds r26,{lcd_backlight}
  BST  r26, 0
* BLD  _temp1, 6

Ez lehet hogy nem túl jó így , de legalább működik.
Persze nem E2 a haáttérvilágítás , hanem másik pin.
És lehet hogy itt akad össze valami.
Mindenesetre az eredeti Lib sem tudott változókat kijelezni , bebolondult tőle.
Kefeur

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3344
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: I2CLCD vezérlés - hiba?

HozzászólásSzerző: kapu48 » 2015. február 19. csütörtök, 22:24

A változót konvertálni kellene stringé, és azt ki íratni. :idea:

Avatar
ACdrian
DrótVégénSzéndarab
Hozzászólások: 45
Csatlakozott: 2009. január 12. hétfő, 7:00

Re: I2CLCD vezérlés - hiba?

HozzászólásSzerző: ACdrian » 2015. április 3. péntek, 19:29

Sziasztok!

Nekem is hasonló gondom van (kifordított bekötési sorrendű i2c modul). Találtam olyan könyvtárat, ahol tetszőlegesen átkonfigurálható a lábkiosztás, de a változók kiíratásánál nekem is teleírja karakterekkel a kijelzőt és a program végtelen ciklusba kerül. Olyan, mintha az i2c lib a változó kíírásának a végét sosem érné el (lib által használt belső változó a bascom-ban az LCD parancson belül?).
A stringgé alakítás természetesen nem oldja meg a problémát, mert bármilyen változónál ugyanezt csinálja.
A könyvtár szerzőjét is felkerestem ez ügyben, de nem érkezett rá válasz :(.

Avatar
Atesz
Tranzisztorgyógyász
Hozzászólások: 164
Csatlakozott: 2006. január 19. csütörtök, 7:00
Tartózkodási hely: Dombóvár

Re: I2CLCD vezérlés - hiba?

HozzászólásSzerző: Atesz » 2015. április 14. kedd, 19:37

A mcp23017.lib -el való LCD működtetéséhez hol találok kapcsolási rajzot?
Nyomógombokat kezel ez a lib?
Konkrétan egy ilyent: https://learn.adafruit.com/rgb-lcd-shield szeretnék megépíteni/használni AVR-el, Bascomban programozva.
Üdv, Atesz

Avatar
Robert
Elektronbűvölő
Hozzászólások: 9993
Csatlakozott: 2005. december 9. péntek, 7:00
Tartózkodási hely: Budapest
Kapcsolat:

Re: I2CLCD vezérlés - hiba?

HozzászólásSzerző: Robert » 2015. április 28. kedd, 2:46

i2clcd.zip

I2C_LCD.ZIP

MCP23017 illesztési programok...
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.


Vissza: “Bascom-AVR nyelvű programozás (AVR programozásának lehetőségei)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég