16x4 LCD am I2C-BUS mit einem E-Pin (ASM & Bascom)

Cassio

Aktives Mitglied
29. Okt. 2008
4.027
17
38
Region Hannover
Sprachen
  1. BascomAVR
Hallo zusammen!

Ich hatte hier ja immer noch meine fertige Platine vom Test mit dem 27x4 LCD am I2C-BUS liegen ( Hier der alte Thread ) !

Weil ich die fertige Platine nicht einfach in die Ecke legen wollte, habe ich mir ein 16x4 LCD besorgt und versucht, dies auch über den I2C-BUS anzusteuern.

Probleme hatte ich eigentlich nur in dem Punkt erwartet, dass mein Vier-Zeilen-LCD nur einen E-Pin besitzt. :hmmmm:
Aus dem Grunde habe ich den alten Testaufbau wieder hergestellt und es einfach mal ausprobiert. ;)


Hier mal der Testaufbau insgesamt:
4x16-I2C-Test_Aufbau.jpg

Oben links ist wieder meine "alte" Platine zu sehen.
Unten ist das neue 16x4 LCD.
Auf dem Steckboard werkelt ein Mega8


Nach ein paar kurzen Vesuchen, was die Zeilen und Zeichen betrifft,
kam dann dieses Ergebnis heraus:
4x16-I2C-Test_Display1.jpg

Wie man erkennen kann, werden alle 64 Zeichen richtig angezeigt.



Nun war mir das Prinzip auch klar und es folgte ein zweiter Anzeigentest:
4x16-I2C-Test_Display2.jpg



Wie gleich im Programmcode zu sehen ist, werden immer nur ZWEI Zeilen angesprochen....
Locate 1 , 1
Loctae 2 , 1

Die Zeichen für Zeile 1 gehen dann einmal von 1 bis 16
und für Zeile 3 von 17 bis 32 !

Das selbe Prinzip gilt dann auch für die beiden anderen Zeilen:
Zeile 2 = Zeichen 1 bis 16
Zeile 4 = Zeichen 17 bis 32

Fertig! :)


Hier mal der Programmcode dazu:


CodeBox bascom

'
$regfile = "m8def.dat"
$crystal = 8000000 'intern !


$hwstack = 128
$swstack = 128
$framesize = 128

$baud = 38400 'TxD zum PC (0,16% Fehler)



' ================================================
' Bestimme die Ein- und Ausgänge

Ddrd = &B0001_0010 '1 ist Ausgang 0 ist Eingang
Portd = &B1110_1101 'auf Hi oder Low setzen

'PC.4 = SDA
'PC.5 = SCL
Ddrc = &B11_0100 '1 ist Ausgang 0 ist Eingang
Portc = &B00_1011 'auf Hi oder Low setzen

'PB.0 = LED
Ddrb = &B011 '1 ist Ausgang 0 ist Eingang
Portb = &B100 'auf Hi oder Low setzen0

Led Alias Portb.0


' ================================================
' Globale Interrupts einschalten
Enable Interrupts


' ================================================
' Config für INT0 (I2C-Matrix)
'Enable Int0 ' Überwache INT0
'On Int0 Matrix_scan
'Enable Int0

' ==============================================================================
' I2C-Config
Config Scl = Portc.5 'I2C SCL
Config Sda = Portc.4 'I2C SDA

Config I2cdelay = 1

I2cinit


' I2C Matrixtastatur (Kent Andersson)------------------------
'$lib "key_i2c.lib" 'LIB für I2C-Matrixtastatur
'$external _key_code 'Externe Routine

'*****WICHTIG !*************************************************
'* Die Funktion "_key_scan", in der LIB "key_i2c.lib", MUSS ab BASCOM Ver. 2.0.3.0 auf _key_code geändert werden!
'* Ab BASCOM 2.0.3.0 dürfen Funktionen und Variablen NICHT mehr den selben Namen besitzen!
'* Bitte folgendes in der LIB ändern=
'* [_Key_code]
'* _Key_code:
'* Das war es dann auch schon !
'*****WICHTIG !*************************************************

'Const Pcf8574_kbd = &H72 'I2C-Adresse des PCF8574A
'!rcall _Key_Init 'Initialisierung aufrufen

'Dim _key_scan As Byte 'Variable für Tastenausgabe
'Dim Kb As Byte


'**************************************************************
' I2C LCD (Kent Andersson)-----------------------------------
$lib "Lcd_i2c.lib" 'LIB für I2C-LCD
'$lib "Lcd_i2c_mg.lib" 'mit @genu(250)
'$lib "Lcd_i2c_og.lib" 'ohne @genus(250)
'$lib "Lcd_i2c_ks077.lib" 'LIB für KS077


Const Pcf8574_lcd = &H74 'I2C-Adresse des PCF8574A

' _lcd_e Variable für E + E2
Dim _lcd_e As Byte
_lcd_e = 192 ' E-Pin aktiv
' 128 für E-Pin
' 64 für E2-Pin
' 192 für E + E2 aktiv
' ==============================================================================


Dim I As Byte


' #############################################################################
' Anfangswerte:
Initlcd
Cls



' ################################################
' # #
' #---------------Arbeitsschleife----------------#
' # #
' ################################################
Do 'Hauptschleife-Beginn

Led = 0 'EIN
Locate 1 , 1 'erste Zeile
Lcd "1234567890123456"

Wait 1

Led = 1 'AUS
Locate 2 , 1 'zweite Zeile
Lcd "2345678901234567"

Wait 1

Led = 0 'EIN
Locate 1 , 17 'dritte Zeile
Lcd "3456789012345678"

Wait 1

Led = 1 'AUS
Locate 2 , 17 'vierte Zeile
Lcd "4567890123456789"


Wait 3
Cls


Led = 0
Locate 1 , 1
Lcd "AVR-Praxis Forum"

Locate 2 , 1
Lcd "-----Cassio-----"

Locate 1 , 17
Lcd "++++01:11:49++++"

Locate 2 , 17
Lcd "****20:02:11****"

Wait 3
Cls

Led = 1
Wait 1


Led = 0
Locate 1 , 1
Lcd "Dies ist Zeile 1Dies ist Zeile 3"

Locate 2 , 1
Lcd "Dies ist Zeile 2Dies ist Zeile 4"


Wait 3
Cls

Led = 1
Wait 1
Cls

Loop 'Hauptschleife-Ende



' ################################################
' # #
' #----------------Subroutinen-------------------#
' # #
' ################################################

'--------------------------------------------------------------------Matrix_Scan
'Matrix_scan:

'!rcall _key_code 'externe Routine aufrufen
'If _key_scan > 0 Then
'Kb = Lookupstr(_key_scan , Matrix_wert) 'Wert vom Key_scan der Tastatur anpassen
'Else
'End If

'Return


End

' ------------------------------------------------------------------Data-Tabelle
'Matrix_wert:
'Data "Z" , "7" , "8" , "9" , "A" , "4" , "5" , "6" , "B" , "1" , "2" , "3" , "C" , "F" , "0" , "E" , "D"
'Return





Wie ihr hier sehen könnt:


CodeBox bascom

Led = 0
Locate 1 , 1
Lcd "Dies ist Zeile 1Dies ist Zeile 3"

Locate 2 , 1
Lcd "Dies ist Zeile 2Dies ist Zeile 4"


Wait 3
Cls


habe ich einfach mal den Text in der Zeile "durchgeschrieben".

Das Ergebnis sieht dann auch wie erwartet aus:
4x16-I2C-Test_Display3.jpg



Theoretisch wäre es also möglich, an einem dieser Adapter zwei 16x4 Displays zu betreiben und diese nur mit den unterschiedlichen E-Leitungen zu beschalten.
Mir schwebt da aber für den nicht benötigten E2-Pin ein anderer Verwendungszweck vor. ;)


Das war es schon zu dem Kurztest.......
Endlich mal wieder eine Erfolgsmeldung. :)

Grüße,
Cassio




Noch kurz zur Erklärung:
Vielleicht ist es ja jemanden aufgefallen.....
Ich habe im Test-Code immer beide E-Leitungen aktiviert (_lcd_e = 192)!
Dies kommt daher, das ich einen Defekt am E-Pin meines PCF8574A festgestellt habe. :eek:
Dieser ist leider hinüber und gibt keine Signale mehr raus.
Vielleicht ist dies auch der Grund, warum zum Ende der Tests mit dem 27x4 LCD gar nichts mehr funktionierte. :rolleyes:
Es waren dann zum Schluss also nicht nur die LCD`s defekt sondern auch der E-Pin. :cool:
 
Hi Cassio,

na das ist doch schön ;)
Mal wieder ein Erfolgserlebnis :D Dann hoffe ich mal das dein 27x4 demnächst
auch am I2C-Bus zum Leben erweckt wird.

Mein Zisternen-Sensor ist ja soweit zur Hälfte fertig (die Sensor-Seite) und
als nächstes wird nach nem Drehzahlmesser für Fräse/Drehbank/Bohrsäule
geschriehen :eek: :rolleyes: Mit 4x 7Segment und Tiny2313 denke ich mal.
Mir gehen aber ein wenig die Hallsensoren aus. Ich hab nur 4Stk hier liegen
und bei Reichelt gibts zur Zeit nur die bipolaren Sensoren bei denen die
Feldlinien (gegenüber einer einfachen Präsenz des Magnetfeldes) in der
Richtung umgekehrt werden müssen.

Gruß
Dino
 
Mal wieder ein Erfolgserlebnis.....


Hallo Dino!

Die Sache mit dem defekten PCF-Pin für E1 hatte mich ja nicht locker gelassen..... ;)

Also habe ich heute mal die PCF`s durchgeprüft, in dem ich einfach jeden Ausgang einmal High und einmal Low gesetzt habe.....
Ganz normal mit den I2C-Anweisungen, ohne zusätzliche LIB`s.

Tja und siehe da, alle Pins arbeiten tadellos. :cool:

Dann wieder einen Test mit dem LCD...
Nix, nur E2 funktioniert. E1 stellt sich tot! :(

Da ich Softwarefehler ausschließen konnte, habe ich meinen Rastermaßadapter (1,27mm zu 2,54mm) mal unter die Lupe genommen.
Nach minutenlangen Suchen mit einer 8-fach Lupe und "Hintergrundlicht" habe ich dann eine gaaaaaanz feine Brücke zwischen R/W und E1 gefunden. :eek:
Da R/W ja standardmäßig auf GND liegt wundert es mich nun auch nicht mehr, dass auf E1 absolut nichts zu messen war.

Nach dem Entfernen der Brücke mit einer dünnen Nadel funktionieren nun auch wieder beide E-Leitungen. :)


Ich habe dann noch mal eines meiner 27x4 LCD`s angeschlossen......
aber da passiert weiterhin nichts. :mad:

Was mir beim Messen aber aufgefallen ist.....
Der jeweils nicht aktivierte E-Pin empfängt ebenfalls kurz ein paar Signale.
Ob diese Eigenschaft dem LCD zu schaffen macht? :hmmmm:
Ich kann das ja irgendwann noch mal prüfen....

Grüße,
Cassio
 
Hallo, an alle ASM-Programmierer !

Ich habe mich mal ein wenig an ASM vergangen und die LIB zum Ansteuern der LCD`s via I2C bearbeitet. :rolleyes:

Der Grund dafür ist, dass ich den ungenutzten "E2-Pin" am PCF8574 als Schaltausgang verwenden möchte.

Zur Kontrolle habe ich zu Beginn eine LED angeschlossen..... und jetzt die Hintergrundbeleuchtung vom LCD.
Es klappt auch soweit. :)
Allerdings blinkt die LED jedesmal ganz kurz, wenn ich neue Daten zum LCD sende. :rolleyes:


Da ich ja allgemein Bekannt keine Ahnung von ASM habe, ist mein Ergebnis auch nur durch experimentieren mittels meines Halbwissens enstanden. :cool:

Kann bitte noch mal von euch einer drüber schauen, wie man das Ganze verbessern kann?
Cool wäre es natürlich, wenn ich den ungenutzen R/W-Pin auch noch als "Schalter" verwenden könnt. :eek:
Dies hätte ich bei Erfolg dann im zweiten Schritt geplant.


Ich stell hier mal meine veränderte LIB ein:
Das Original ist natürlich von Kent Anderson!

Alle Änderungen habe ich mit "modifiziert" kommentiert.
Code:
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.

;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, &h80                 ; modifiziert - nur E1-Pin
 Ldi _temp1, &h03  
 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, &h80                  ; modifiziert - nur E1-Pin
 sbr r16,&h10                         ;set RS flag (4 high bits is used as control)
 rjmp _write_lcd_byte
_Lcd_Control:
 ldi r16, &h80                  ; modifiziert - nur E1-Pin
_write_lcd_byte:
 push r24
 Swap _temp1                                
 Rcall _Write_lcd_Nibble 
 pop r24        
_Write_lcd_nibble:
*lds r27,{_lcd_bl}          ;modifiziert - neue Schaltvariable _lcd_bl
 Cbr _temp1, &hB0                      ;modifiziert - nur E1, RW, RS auf Low
or _temp1, r27              ;modifiziert - E2-Pin anpassen


_Send_to_LCD:
push r26
push r27
 ldi r25,3
_send_3_times:
 *BASIC: i2csend pcf8574_LCD,_temp1
 eor _temp1,R16
; @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]


Hat jemand eine Idee, wie ich das "Blinken" des Pins in den Griff bekomme?

Danke und Grüße,
Cassio
 
Hallo zusammen!

Was mache ich mir eigentlich so viele Gedanken und tüftel hier stundenlang rum? :hmmmm:

Die Idee hatte natürlich schon mal jemand :rolleyes: und HIER ist auch gleich die Lösung dazu!

Tja, was soll ich sagen.....
Jetzt blinkt es auch nicht mehr. :D


OK, dann wäre der erste Teil erledigt.
Nun kommt noch der R/W-Pin und ggf. eine Möglichkeit, auch ohne die Anzeige des Displays aktualisieren zu müssen die Ausgänge zu schalten. :rolleyes:

Wenn da einer der ASM`ler noch ein paar Ideen hat....
immer her damit, für den kleinen BASCOMmer. :)


Grüße,
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)