Bascom I2C : LCD ( auch Arduino ) mit PCF8574 OHNE LIB betreiben

Habe beim 20-Zeichen Display aber auch das Problem, dass:
Lcda 3, 1, "A" auf Zeile 1 Position 17
Lcda 4, 1, "A" auf Zeile 2 Position 17

Hi Thomas!

Was macht es denn bei der Angabe:
Lcda_ 3, 5, "A" :confused:

Wird das "A" dann bei 3 , 1 angezeigt, oder gar nicht mehr?
Wäre interessant zu wissen, ab wann das "A" in der dritten bzw. vierten Zeile an erster Stelle ausgegeben wird.


Grüße,
Cassio
 
Hallo Thomas!

Du brauchst erst mal keine weiteren Test`s machen.....
ich glaube zu wissen, woran es liegt. :wink:

Ich werde die Routinen bei Gelegenheit mal überarbeiten und hier dann aktualisieren.


Danke, für deine Info`s!
Cassio
 
Hallo Cassio

Big Smile... da bin ich ja mal gespannt...

Hier mal die Links zu den Display's. welche ich unter anderem im Einsatz habe:
http://www.ebay.ch/itm/160700138365?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649
http://www.ebay.ch/itm/270845840568?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649
http://www.ebay.ch/itm/180836912840?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649 mit Eigenbau LCD-Adapter

Dann habe ich auch noch Eingabau Dinger mit PCF8574 im DIL-Gehäuse :)

Diese Hong-Kong Firmen haben viele interssante Teile im Angebot und die Lieferung klappt super, meist Portofrei!

Dankende Grüsse
Thomas
 
Nochmals Hallo Cassio

Bei einem 4-Zeilen Display werden die Zeichen auf der 3. und 4. Zeile gerell 4 Zeichen zu "links" angezeigt.

Mit folgendem Code erscheint alles auf der richtigen Position:Case 3
X2 = X2 + 4
Pos = X1 + &H8C 'Anzeige-Charakter berechnen
Pos = Pos + X2 'Anzeige-Charakter berechnen
Gosub Lcd1 '1.Displaycontroller verwenden
Case 4
X2 = X2 + 4
Pos = X1 + &HCB 'Anzeige-Charakter berechnen
Pos = Pos + X2 'Anzeige-Charakter berechnen
Gosub Lcd1 '2.Displaycontroller verwenden

Es funktionieren auch die Kommandos:
Lcda 3, 20, "A"
Lcda 4, 20, "A"

An was vermutest du, dass es liegt, dass ab dem 16. Zeichen nichts mehr angezeigt wird? Zeichen wird zu Befehl?

Vorabendgrüsse
Thomas
 
Hallo Thomas!

Da ich gerade wenig Zeit habe, stelle ich jetzt einfach mal kommentarlos die neuen Codes ein!
Ich habe die Startzeichenberechnung nun geändert!

Außerdem musst du im eigentlichen Programm jetzt das Display mit Zeilen und Spalten (Charakter) definieren!!!
Hier mein Beispiel:
Code:
Dim Hbl As Byte                                             'LCD-HintergrundBeLeuchtung
[COLOR=#FF0000]Dim Lcd_zeilen As Byte
Dim Lcd_spalten As Byte[/COLOR]

Const Aus = 8                                               'HBL Ausschalten
Const Ein = 0                                               'HBL Einschalten


'**********************************************
'Angaben zum Display einstellen! Beispiel 4x16:
[COLOR=#FF0000]Lcd_zeilen = 4                                              'Anzahl der LCD-Zeilen eintragen!
Lcd_spalten = 16                                            'Anzahl der LCD-Charakter angeben[/COLOR]
'**********************************************

'**********************************************
'TWI-Adresse des LCD-Bausteins angeben:
Const Lcd_arduino = &H40                                    'I2C-Adresse des PCx8574(A)
'**********************************************



Jetzt aber erst mal mein Beispielprogramm:
Code:
'
'Subroutinen für I2C-Arduino-LCD
'
$regfile = "m1284pdef.dat"
$crystal = 12000000                                         'EXTERN !

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


' ------------------ATmega1284P------------------------
'                    +---v---+
'       (XCK/T0) PB0 |1    40| PA0 (ADC0)------Taster
'           (T1) PB1 |2    39| PA1 (ADC1)------Taster2
'    (INT2/AIN0) PB2 |3    38| PA2 (ADC2)------Taster_HBL
'     (OC0/AIN1) PB3 |4    37| PA3 (ADC3)
'           (SS) PB4 |5    36| PA4 (ADC4)
'         (MOSI) PB5 |6    35| PA5 (ADC5)
'         (MISO) PB6 |7    34| PA6 (ADC6)
'          (SCK) PB7 |8    33| PA7 (ADC7)
'              RESET |9    32| AREF
'                VCC |10   31| GND
'                GND |11   30| AVCC
'              XTAL2 |12   29| PC7 (TOSC2)
'              XTAL1 |13   28| PC6 (TOSC1)
'          (RXD) PD0 |14   27| PC5 (TDI)
'          (TXD) PD1 |15   26| PC4 (TDO)
'         (INT0) PD2 |16   25| PC3 (TMS)
'         (INT1) PD3 |17   24| PC2 (TCK)
'         (OC1B) PD4 |18   23| PC1 (SDA)-------I2C
'         (OC1A) PD5 |19   22| PC0 (SCL)-------I2C
' DCF77---(ICP1) PD6 |20   21| PD7 (OC2)-------LED
'                    +-------+


' ================================================
' Bestimme die Ein- und Ausgänge
Ddra = &B_0000_0000                                         '1 ist Ausgang 0 ist Eingang
Porta = &B1111_1111

Ddrb = &B_0000_0000                                         '1 ist Ausgang 0 ist Eingang
Portb = &B1111_1111

Ddrc = &B_0011_1111                                         '1 ist Ausgang 0 ist Eingang
Portc = &B1100_0000

Ddrd = &B_1011_1111                                         '1 ist Ausgang 0 ist Eingang
Portd = &B0100_0000                                         'auf Hi oder Low setzen



Led Alias Portd.7
Taster Alias Pina.0
Taster2 Alias Pina.1
Taster_hbl Alias Pina.2

' ==============================================================================
Declare Sub Lcda_(byval X1 As Byte , Byval X2 As Byte , Byval Text1 As String * 20)
Declare Sub Lcda_cls
Declare Sub Lcda_init
Dim Text As String * 20                                     'LCD Ausgabe
Dim Lcd_text(20) As Byte At Text Overlay                    'ASCII-Werte der LCD Ausgabe
Dim Init(5) As Byte                                         'Byte-Array für LCD-Parameter

Dim Hbl As Byte                                             'LCD-HintergrundBeLeuchtung
Dim Lcd_zeilen As Byte
Dim Lcd_spalten As Byte

Const Aus = 8                                               'HBL Ausschalten
Const Ein = 0                                               'HBL Einschalten


'**********************************************
'Angaben zum Display einstellen! Beispiel 4x16:
Lcd_zeilen = 4                                              'Anzahl der LCD-Zeilen eintragen!
Lcd_spalten = 16                                            'Anzahl der LCD-Charakter angeben
'**********************************************

'**********************************************
'TWI-Adresse des LCD-Bausteins angeben:
Const Lcd_arduino = &H40                                    'I2C-Adresse des PCx8574(A)
'**********************************************
'                         PCx8574(A)
'                             __
'                      A0  -o|1 |o-  Vdd
'                      A1  -o|  |o-  SDA
'                      A2  -o|  |o-  SCL
'                      RS  -o|  |o-  n.c. (INT)
'                      RW  -o|  |o-  D7
'                      E   -o|  |o-  D6
'HBL=HintergrundBeLeuchtung-o|  |o-  D5
'                     GND  -o|_9|o-  D4

' ==============================================================================
' I2C-Config
$lib "i2c_twi.lbx"
'Config Twi = 100000                                         'BUS-Takt,


'Config Scl = Portc.0                                        'I2C SCL
'Config Sda = Portc.1                                        'I2C SDA

'Config I2cdelay = 1

'I2cinit
' ==============================================================================


'######################## Pollin Modul : Inverted = 1 ##########################
Config Dcf77 = Pind.6 , Timer = 1 , Timer1sec = 1 , Debug = 1 , Update = 0 , Check = 1 , Inverted = 1 , Gosub = Sectic
Config Date = Dmy , Separator = .

Enable Interrupts

Date$ = "01.01.07"
Time$ = "12:00:00"


' #############################################################################
Dim I As Byte , I2 As Byte                                  'Indexzähler
Dim Tb As Bit                                               'Toggle-Bit
Dim Ab As Bit                                               'Anzeige-Bit

Dim Dtag As Byte , Wtag As String * 10
Dim Sync As Bit
Dim Puls As Bit
Dim Status_old As Byte

' #############################################################################
' Anfangswerte:

Tb = 0                                                      'Toggel-Bit auf 0
Ab = 0                                                      'Taster-Bit auf 0

Lcda_init
Hbl = Ein

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

If Taster_hbl = 0 Then                                      'Taster Hintergrundbeleuchtung
   Hbl = Ein
Else
   Hbl = Aus
End If



If Puls = 1 Then                                            'Puls wird von Sectic auf 1 gesetzt
   Dtag = Dayofweek()                                       'Wochentag ermitteln
   Wtag = Lookupstr(dtag , Wochentage)                      'Wochentag im Klartext
      Lcda_ 1 , 9 , Time$                                   'Zeit anzeigen
      Lcda_ 2 , 1 , Wtag                                    'Wochentag anzeigen
      Lcda_ 2 , 9 , Date$                                   'Datum anzeigen
      Text = Time(dcf_sec)                                  'DCF-Zeit anzeigen
      Lcda_ 3 , 9 , Text
   Reset Puls
Else
End If


If Status_old <> Dcf_status Then                            'Ausführen beim neuen Status
   Status_old = Dcf_status                                  'Status kopieren
   Text = Bin(dcf_status)                                   'in String konvertieren
   Lcda_ 4 , 9 , Text                                       'Statusbits binär anzeigen
Else
End If



If Taster2 = 0 Then                                         'CLS und Zähler-Test
   Hbl = Aus
   Lcda_init                                                'Display neu initialisieren
   Waitms 250
   Bitwait Taster2 , Set
   Hbl = Ein
      For I = 0 To 255                                      'Variablenausgabe-Test
      Text = Str(i)                                         'Binär zu String wandeln
      Lcda_ 1 , 7 , Text
      Lcda_ 1 , 23 , Text                                   'entspricht 3 , 7
      Lcda_ 2 , 7 , Text
      Lcda_ 2 , 23 , Text                                   'entspricht 4 , 7
      Next I
   Waitms 500
   Lcda_cls                                                 'beide Displayhälften löschen
   Reset Tb                                                 'Toggel-Bit auf 0
   Reset Ab                                                 'Taster-Bit auf 0
Else
End If


If Taster = 0 Then                                          'Displayanzeige wechseln
   Toggle Tb                                                'Toggle-Bit wechseln
   Reset Ab                                                 'Anzeige-Bit zurücksetzen
   Waitms 250
   Bitwait Taster , Set
Else
End If


If Tb = 0 Then
   If Ab = 0 Then                                           'Layout einmal ausgeben
      Lcda_cls
      Lcda_ 1 , 1 , "Uhrzeit"
      Lcda_ 2 , 4 , " der "
      Lcda_ 1 , 17 , "DCF_sec="
      Lcda_ 2 , 17 , "CASSIO  "
      Set Ab
   Else
   End If

Else
      For I = 1 To 4                                        'Geschwindigkeitstest aller 64 Zeichen
         For I2 = 1 To 16
            Lcda_ I , I2 , "X"
         Next I2
      Next I
      Wait 1
      Tb = 0
End If


' ----------------------------------------
If _sec > 1 Then Reset Dcf_status.7                         'Sync-Bit der Softclock zurücksetzen

If _sec = 1 Then
   If Dcf_status.7 = 1 Then
      Sync = 1                                              'Sync der Softclock merken
   Else
      Sync = 0                                              'Kein Sync der Softclock
   End If
Else
End If
' ----------------------------------------
If Sync = 1 Then                                            'Wenn Sync der Softclock, dann...
Lcda_ 1 , 8 , "="
Reset Led                                                   'LED EIN
Else                                                        'wenn kein Sync, dann.....
Lcda_ 1 , 8 , ":"
Set Led                                                     'LED AUS
End If

Loop                                                        'Hauptschleife-Ende


End                                                         'end program

' #############################################################################
Sectic:
Set Puls
Return



' #############################################################################
Sub Lcda_(x1 As Byte , X2 As Byte , Text1 As String * 20)   'Sub zur Zeichenausgabe am Display
$include "_lcda_i2c.bas"

' #############################################################################
Sub Lcda_cls:                                               'Sub zum löschen beider Displayhälften
$include "_lcda_CLS.bas"

' #############################################################################
Sub Lcda_init:                                              'Sub zum initialisieren beider Displayhälften
$include "_lcda_init.bas"



' #############################################################################
Wochentage:
Data "Mon" , "Die" , "Mit" , "Don" , "Fre" , "Sam" , "Son"


Dann noch das neue INIT:
EDIT: Geändert in das ursprüngliches INIT der ersten Seite!
Code:
$nocompile


' #############################################################################
'Lcd_init:                                                   'Sub zum Initialisieren beider Displaycontroller
Init(1) = &H00 + Hbl
Init(2) = &H00 + Hbl
I2csend Lcd_arduino , Init(1) , 2
Waitms 50

Init(1) = &H34 + Hbl
Init(2) = &H30 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           '03h
Waitms 4
I2csend Lcd_arduino , Init(1) , 2                           '03h
Waitms 1
I2csend Lcd_arduino , Init(1) , 2                           '03h
Waitms 1
Init(1) = &H24 + Hbl
Init(2) = &H20 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           '02h (4Bit Modus)
Waitms 1

I2csend Lcd_arduino , Init(1) , 2
Init(1) = &H84 + Hbl
Init(2) = &H80 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           '28h (4 Zeilen Dispaly)
Waitms 1

Init(1) = &H04 + Hbl
Init(2) = &H00 + Hbl
I2csend Lcd_arduino , Init(1) , 2
Init(1) = &HE4 + Hbl
Init(2) = &HE0 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           '0Eh (Select Mode)
Waitms 1

Init(1) = &H04 + Hbl
Init(2) = &H00 + Hbl
I2csend Lcd_arduino , Init(1) , 2
Init(1) = &H64 + Hbl
Init(2) = &H60 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           '06h (Select Mode)
Waitms 1

Init(1) = &H04 + Hbl
Init(2) = &H00 + Hbl
I2csend Lcd_arduino , Init(1) , 2
Init(1) = &HC4 + Hbl
Init(2) = &HC0 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           '0Ch (Select Mode)
Waitms 1

Init(1) = &H04 + Hbl
Init(2) = &H00 + Hbl
I2csend Lcd_arduino , Init(1) , 2
Init(1) = &H14 + Hbl
Init(2) = &H10 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           '01h (Cls)
Waitms 1

End Sub


Das neue CLS:
_lcda_cls.bas
Code:
$nocompile


'Clear Screen Anweisung
Init(1) = &H04 + Hbl
Init(2) = &H00 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           '0h für E1 senden
Init(1) = &H14 + Hbl
Init(2) = &H10 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           '1h für E1 senden
Waitus 400

'Erste Zeile, erstes Zeichen anwählen
Init(1) = &H84 + Hbl
Init(2) = &H80 + Hbl                                        '8h für E1 senden
I2csend Lcd_arduino , Init(1) , 2
Init(1) = &H04 + Hbl
Init(2) = &H00 + Hbl                                        '0h für E1 senden
I2csend Lcd_arduino , Init(1) , 2
Waitus 400

End Sub


Und noch die neue Text-Ausgabe:
_lcda_i2c.bas
Code:
$nocompile

Dim Pos As Byte                                             'Locate Berechnung
Dim Ascii_zeichen(5) As Byte                                'getrennte ASCII-Werte zur Übermittlung
Dim Zz As Byte                                              'Zeichenzähler
Dim Zi As Byte                                              'Zeichen-Indexzähler

' #############################################################################
'Sub Lcd_(x1 As Byte , X2 As Byte , Text1 As String * 20)

Text = Text1                                                'max.40 Zeichen String übergeben

If X1 > Lcd_zeilen Then
Shift X1 , Right , 1
Else
End If

Select Case X1
Case 1
   Pos = &H7F + X2
   Gosub Lcd1
Case 2
   Pos = &HBF + X2
   Gosub Lcd1
Case 3
   Pos = &H7F + Lcd_spalten
   Pos = Pos + X2
   Gosub Lcd1
Case 4
   Pos = &HBF + Lcd_spalten
   Pos = Pos + X2
   Gosub Lcd1
Case Else
End Select


End Sub

'          PCF8574A
'             __
'      A0  -o|1 |o-  Vdd
'      A1  -o|  |o-  SDA
'      A2  -o|  |o-  SCL
'     RS----o|1 |o-  n.c. (INT)
'     RW----o|2 |o----D7
'     E-----o|4 |o----D6
'  Light----o|8 |o----D5
'     GND  -o|_9|o----D4

' #############################################################################
Lcd1:                                                       'Sub zur LCD-Ausgabe auf 1.Displaycontroller
Zz = Len(text)

Init(2) = Pos And &HF0                                      'Zeichen-Startposition Bit7-4
Init(2) = Init(2) + Hbl

Init(4) = Pos And &H0F                                      'Zeichen-Startposition Bit3-0
Shift Init(4) , Left , 4
Init(4) = Init(4) + Hbl


Init(1) = Init(2) + &H04                                    'Bit7-4 + E1
Init(3) = Init(4) + &H04                                    'Bit3-0 + E1
I2csend Lcd_arduino , Init(1) , 4                           'Start-Array zum Display senden
Waitus 400


Ascii_zeichen(5) = &H00 + Hbl

For Zi = 1 To Zz                                            'Zeichenlänge des Strings ermitteln
   Ascii_zeichen(1) = Lcd_text(zi) And &HF0                 'ASCII-Wert Bit7-4
   Ascii_zeichen(1) = Ascii_zeichen(1) + Hbl
   Ascii_zeichen(2) = Ascii_zeichen(1) + &H01               'Bit7-4 + RS-Pin
   Ascii_zeichen(1) = Ascii_zeichen(1) + &H05               'Bit7-4 + RS + E1

   Ascii_zeichen(3) = Lcd_text(zi) And &H0F                 'ASCII-Wert Bit3-0
   Shift Ascii_zeichen(3) , Left , 4
   Ascii_zeichen(3) = Ascii_zeichen(3) + Hbl
   Ascii_zeichen(4) = Ascii_zeichen(3) + &H01               'Bit3-0 + RS-Pin
   Ascii_zeichen(3) = Ascii_zeichen(3) + &H05               'Bit3-0 + RS + E1
   I2csend Lcd_arduino , Ascii_zeichen(1) , 5               'ASCII-Daten zum Display senden
   Waitus 400
Next Zi                                                     'je nach Anzahl der Zeichen im String wiederholen

Return


Ich habe es gerade ausprobiert und bei mir klappt es! :wink:
LCDA_neu.jpg

Wenn es bei dir nun auch funktionieren sollte, dann kann ich die anderen Code-Teile auf der ersten Seite ja später mal aktualisieren!
Ich drück die Daumen! :cool:


Grüße,
Cassio
 
Guten Abend Cassio

Erneut, vielen Dank!

Es klappt teilweise. Die Positionen bei einem 4-Zeilen Display stimmen.

2-Zeilen Displays werden aber nicht richtig initialisiert. Ich denke, die die Init-Sequenz sollte hier sein:
I2csend Lcd_arduino , Init(1) , 2
Init(1) = &H84 + Hbl
Init(2) = &H02 + Hbl
I2csend Lcd_arduino , Init(1) , 2 '20h (2 Zeilen Dispaly)

(PS: Wie berechnen sie deine zwei Werte, sehe da nicht ganz durch)

Am Ende der Sub CLS muss wieder ein Waitms 500 stehen (Werte darunter führen zu anschliessenden Fehlanzeigen)

Das Problem mit den Strings länger als 15 Zeichen habe ich aber immer noch ... hmmm, die werden nicht angezeigt.

Viele Grüsse
Thomas
 
Ich denke, die die Init-Sequenz sollte hier sein:
I2csend Lcd_arduino , Init(1) , 2
Init(1) = &H84 + Hbl
Init(2) = &H02 + Hbl
I2csend Lcd_arduino , Init(1) , 2 '20h (2 Zeilen Dispaly)


Hallo Thomas!

Nein, dass INIT stimmt soweit!
Das &H02 wäre definitv falsch!

Die Werte steuern den PCx8574..... also Datenbits und Steuersignale gleichzeitig.

Also ich habe es hier mit 4x16, 2x16 und 2x20 sowie 4x27 ausprobiert.....
Bei mir funktioniert das alles tadellos.

Seltsam ist ja auch, dass du fehlerfrei ein Zeichen an der 16.Stelle anzeigen lassen kannst!
Hast du deinen I2C-Bus mal langsamer eingestellt.... max. 100k?

Grüße,
Cassio
 
Hi Thomas!

Was mir gerade noch einfällt....

Es kann sein, dass dein zweizeiliges Display gar keine "echte" zweite Zeile hat.....
sondern nur die "Verlängerung" der ersten Zeile.

Herausfinden kannst du es, wenn du einfach mal etwas in die dritte Zeile schreibst.
Zeile 1 und 3 gehören zusammen.... genauso wie Zeile 2 und 4 !

Kannst es ja mal ausprobieren.
Vielleicht lasse ich mir dazu noch mal etwas einfallen. :wink:

Ansonsten bleiben wir erst mal beim 4x16 Display.
Es muss ja einen Grund geben, warum du keine 16 Zeichen am Stück anzeigen lassen kannst.

Grüße,
Cassio
 
Herausfinden kannst du es, wenn du einfach mal etwas in die dritte Zeile schreibst.

Hi Thomas!

Ach nee..... blöde Idee!
Ich habe für den Fall ja extra ein "Umsetzen" eingebaut. :cool:


EDIT !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Neue geprüfte Routinen befinden sich im nächsten Beitrag!



Grüße,
Cassio
 
Hallo Thomas!

Ich habe heute Vormittag noch mal selber alles durchgespielt.....

Zum Testen habe ich ein 4x16 und ein 2x16 LCD verwendet.
Beides klappt absolut problemlos!

Hier nun die aktuellen Routinen zum INIT und für die Text-Ausgabe!

_lcda_init.bas
Code:
$nocompile


' #############################################################################
'Lcd_init:                                                   'Sub zum Initialisieren beider Displaycontroller
Init(1) = &H00 + Hbl
Init(2) = &H00 + Hbl
I2csend Lcd_arduino , Init(1) , 2
Waitms 50

Init(1) = &H34 + Hbl
Init(2) = &H30 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           '03h
Waitms 4
I2csend Lcd_arduino , Init(1) , 2                           '03h
Waitms 1
I2csend Lcd_arduino , Init(1) , 2                           '03h
Waitms 1
Init(1) = &H24 + Hbl
Init(2) = &H20 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           '02h (4Bit Modus)
Waitms 1

I2csend Lcd_arduino , Init(1) , 2
Init(1) = &H84 + Hbl
Init(2) = &H80 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           '28h (4 Zeilen Dispaly)
Waitms 1

Init(1) = &H04 + Hbl
Init(2) = &H00 + Hbl
I2csend Lcd_arduino , Init(1) , 2
Init(1) = &HE4 + Hbl
Init(2) = &HE0 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           '0Eh (Select Mode)
Waitms 1

Init(1) = &H04 + Hbl
Init(2) = &H00 + Hbl
I2csend Lcd_arduino , Init(1) , 2
Init(1) = &H64 + Hbl
Init(2) = &H60 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           '06h (Select Mode)
Waitms 1

Init(1) = &H04 + Hbl
Init(2) = &H00 + Hbl
I2csend Lcd_arduino , Init(1) , 2
Init(1) = &HC4 + Hbl
Init(2) = &HC0 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           '0Ch (Select Mode)
Waitms 1

Init(1) = &H04 + Hbl
Init(2) = &H00 + Hbl
I2csend Lcd_arduino , Init(1) , 2
Init(1) = &H14 + Hbl
Init(2) = &H10 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           '01h (Cls)
Waitms 500

End Sub



_lcda_i2c.bas
Code:
$nocompile

Dim Pos As Byte                                             'Locate Berechnung
Dim Ascii_zeichen(5) As Byte                                'getrennte ASCII-Werte zur Übermittlung
Dim Zz As Byte                                              'Zeichenzähler
Dim Zi As Byte                                              'Zeichen-Indexzähler

' #############################################################################
'Sub Lcd_(x1 As Byte , X2 As Byte , Text1 As String * 20)

Text = Text1                                                'max.40 Zeichen String übergeben

If Lcd_zeilen < 3 Then
   Select Case X1
   Case 1
      Pos = &H7F + X2
      Gosub Lcd1
   Case 2
      Pos = &HBF + X2
      Gosub Lcd1
   Case Else
   End Select
Else
   Select Case X1
   Case 1
      Pos = &H7F + X2
      Gosub Lcd1
   Case 2
      Pos = &HBF + X2
      Gosub Lcd1
   Case 3
      Pos = &H7F + Lcd_spalten
      Pos = Pos + X2
      Gosub Lcd1
   Case 4
      Pos = &HBF + Lcd_spalten
      Pos = Pos + X2
      Gosub Lcd1
   Case Else
   End Select
End If


End Sub

'          PCF8574A
'             __
'      A0  -o|1 |o-  Vdd
'      A1  -o|  |o-  SDA
'      A2  -o|  |o-  SCL
'     RS----o|1 |o-  n.c. (INT)
'     RW----o|2 |o----D7
'     E-----o|4 |o----D6
'  Light----o|8 |o----D5
'     GND  -o|_9|o----D4

' #############################################################################
Lcd1:                                                       'Sub zur LCD-Ausgabe auf 1.Displaycontroller
Zz = Len(text)

Init(2) = Pos And &HF0                                      'Zeichen-Startposition Bit7-4
Init(2) = Init(2) + Hbl

Init(4) = Pos And &H0F                                      'Zeichen-Startposition Bit3-0
Shift Init(4) , Left , 4
Init(4) = Init(4) + Hbl


Init(1) = Init(2) + &H04                                    'Bit7-4 + E1
Init(3) = Init(4) + &H04                                    'Bit3-0 + E1
I2csend Lcd_arduino , Init(1) , 4                           'Start-Array zum Display senden
'Waitus 400
Waitms 1

Ascii_zeichen(5) = &H00 + Hbl

For Zi = 1 To Zz                                            'Zeichenlänge des Strings ermitteln
   Ascii_zeichen(1) = Lcd_text(zi) And &HF0                 'ASCII-Wert Bit7-4
   Ascii_zeichen(1) = Ascii_zeichen(1) + Hbl
   Ascii_zeichen(2) = Ascii_zeichen(1) + &H01               'Bit7-4 + RS-Pin
   Ascii_zeichen(1) = Ascii_zeichen(1) + &H05               'Bit7-4 + RS + E1

   Ascii_zeichen(3) = Lcd_text(zi) And &H0F                 'ASCII-Wert Bit3-0
   Shift Ascii_zeichen(3) , Left , 4
   Ascii_zeichen(3) = Ascii_zeichen(3) + Hbl
   Ascii_zeichen(4) = Ascii_zeichen(3) + &H01               'Bit3-0 + RS-Pin
   Ascii_zeichen(3) = Ascii_zeichen(3) + &H05               'Bit3-0 + RS + E1
   I2csend Lcd_arduino , Ascii_zeichen(1) , 5               'ASCII-Daten zum Display senden
'   Waitus 400
Waitms 1
Next Zi                                                     'je nach Anzahl der Zeichen im String wiederholen

Return



Dann habe ich noch schnell Bilder gemacht, sobald die DCF77-Zeit empfangen war.....

Einmal mit den Einstellungen und Betrieb eines 2x16 LCD:
lcda_2x16.jpg


Dann habe ich den Aufbau geändert und ein 4x16 LCD verwendet, aber.....
mit den Einstellungen für ein 2x16 Display:
lcda_2-4x16.jpg


Anschließend alles auf 4x16 LCD eingestellt und den letzten Test erfolgreich abgeschlossen:
lcda_4x16.jpg


Wenn es bei dir nun nicht funktionieren sollte dann gehe ich leider davon aus,
dass deine China-Displays zwar sehr günstig sind..... aber auch seeeehr langsam! :cool:
Das zeigt allein schon deine Pause von 500ms nach dem INIT!

Du kannst ja mal mit den Zeiten in den Routinen etwas "spielen".
Vielleicht klappt es dann irgendwann. :wink:


Viel Spaß weiterhin,
Cassio
 
Hallo Cassio

Grossen Dank für dein Engagement!

Es klappt alles wunderbar mit der Darstellung.... bis auf den 16er String. Hier wird nach wie vor nichts angezeigt,
nicht mal Hieroglyphen, nada, nichts. Hast du denn auf deinen Bildern auch einern 16Zeichen langen Sring
angezeigt?

Wie gesagt 2-Zeilen und 4-Zeilen Display funktionieren sonst super, wie in der Version, als ich da das
X=X+4 einbaute. Da war es nicht mal nötig, Anzahl Zeilen und Spalten zu definieren, dein Code war sehr
militärtauglich :)

Aber lass mal nun gut sein, ich werde das 16er String Problem mal auch noch etwas anschauen, ob da
ein Timing-Problem vorliegt oder was auch immer. Aber die Welt dreht sich ja trotzdem ....

Einfach nochmals viiiiielen Dank! und Grüsse
Thomas
 
Hallo Thomas!

Dann auf ein Letztes! :wink:


Ich habe eben extra noch mal für dich folgendes ausprobiert:

Alle Angaben bei den Strings von 20_Zeichen auf 40_Zeichen erhöht!
Dann habe ich folgenden Text eingegeben:

Code:
   Lcda_cls
   Lcda_ 1 , 1 , "1234567890123456"
   Lcda_ 2 , 1 , "23456789012345674567890123456789"


Das Ergebnis sieht dann in der Realität auch wie erwartet aus:
lcda_32zeichenfolge.jpg

Ist das für dich OK! :cool:

Es funktioniert sogar ein 32 Zeichen langer String und er wird, wie erwartet, auf die nächste displaycontrollerzugehörige Zeile "umgebrochen".


Wie schon geschrieben.....
Ich vermute, es liegt einfach nur an der Geschwindigkeit.
Dein Display wird damit wohl nicht klar kommen.

An deiner Stelle würde ich den I2C-Bus nicht über 100k einstellen und die Pausenzeiten in meinen Routinen schrittweise erhöhen!
Wie schon erwähnt....
Wenn dein Display nur mit einem WAITMS 500 nach dem INIT arbeitet (das ist das 500fache von meinem) dann würde ich die anderen Pausenwerte in den Subroutinen einfach mal drastisch erhöhen!
Mal sehen, was dann passiert. :cool:

Wäre schön, wenn ich eine Rückmeldung bekommen könnte, wenn du das Problem irgendwann einmal beseitigen konntest.


Grüße in die Berge,
Cassio
 
Hallo Cassio

Schon komisch, dass bei deinen Selbau-Displays die Sache funktioniert. Ich habe meinen selbstbau PCF2LCD
Adapter an 6 verschiedene Displays angeschlossen, immer das gleiche Resultat bezüglich der 16er-Problematik.
Da hatte es auch ein paar Displays darunter, die ich nicht sooo günstig erworben habe :) ....

Habe mal in der Routine LCDA alle Befehle vor "Ascii_zeichen(5) = &H00 + Hbl" als Kommentar markiert. Wenn
ein CLS vorher erfolgt, wird ja von Position 1 an angezeigt. Das Problem war das gleiche. Habe in der Schlaufe
den Wait auf 1 Sekunde!! erhöht, keine Verbesserung. Könnte es nicht sein, dass irgendwie mit der Zahl 16 dann
deine Zusammengestellten Werte eine andere Bedeutung bekommen und als Befehl anstatt als Zeichen
interpretiert werden?

Aber eben, vielleicht kommen wir mal noch drauf.....

Wohne nicht sooo extrem in den Bergen, habe aber gute Sicht auf Eiger, Mönch und Jungfrau :)

Freundliche Grüsse
Thomas
 
Habe mal in der Routine LCDA alle Befehle vor "Ascii_zeichen(5) = &H00 + Hbl" als Kommentar markiert. Wenn
ein CLS vorher erfolgt, wird ja von Position 1 an angezeigt.


Hallo Thomas!

Warum hast du denn das "Ascii_zeichen(5) = &H00 + Hbl" mal testweise entfernt? :hmmmm:
Das ist aber kein CLS Signal! :wink:

Das Problem liegt ja nicht an Charakter 16, weil du den ja einzeln fehlerfrei ansteuern kannst.
Außerdem wird immer nur die Startadresse einer "Zeichenkette" übertragen.
Der Displaycontroller zählt dann bei jedem Zeichen von allein weiter.


Es gäbe allerdings noch eine Möglichkeit....
Schau doch mal ins Datenblatt (von den nicht soooo günstigen), oder stelle es hier am Besten mal ein, ob du beim INIT vielleicht etwas anderes angeben musst.
Die INIT-Sequenz habe ich selber mal rausgesucht.... aber vielleicht passt es ja doch nicht überall. :hmmmm:

Probiere doch mal folgendes INIT bei dir:
Code:
$nocompile


' #############################################################################
'Lcd_init:                                                   'Sub zum Initialisieren beider Displaycontroller
Init(1) = &H00 + Hbl
Init(2) = &H00 + Hbl
I2csend Lcd_arduino , Init(1) , 2
Waitms 50

Init(1) = &H34 + Hbl
Init(2) = &H30 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           
Waitms 4
I2csend Lcd_arduino , Init(1) , 2                          
Waitms 1
I2csend Lcd_arduino , Init(1) , 2                          
Waitms 1
Init(1) = &H24 + Hbl
Init(2) = &H20 + Hbl
I2csend Lcd_arduino , Init(1) , 2                        
Waitms 1

I2csend Lcd_arduino , Init(1) , 2
Init(1) = &H84 + Hbl
Init(2) = &H80 + Hbl
I2csend Lcd_arduino , Init(1) , 2                         
Waitms 1

Init(1) = &H04 + Hbl
Init(2) = &H00 + Hbl
I2csend Lcd_arduino , Init(1) , 2
Init(1) = &H84 + Hbl
Init(2) = &H80 + Hbl
I2csend Lcd_arduino , Init(1) , 2                       
Waitms 1

Init(1) = &H04 + Hbl
Init(2) = &H00 + Hbl
I2csend Lcd_arduino , Init(1) , 2
Init(1) = &HC4 + Hbl
Init(2) = &HC0 + Hbl
I2csend Lcd_arduino , Init(1) , 2                      
Waitms 1

Init(1) = &H04 + Hbl
Init(2) = &H00 + Hbl
I2csend Lcd_arduino , Init(1) , 2
Init(1) = &H14 + Hbl
Init(2) = &H10 + Hbl
I2csend Lcd_arduino , Init(1) , 2                           
Waitms 500

End Sub


Das INIT verwendet zum Beispiel Kent Andersson in seiner LIB.
Ich habe sie jetzt aber zur Ansteuerung der Arduino-LCD`s eben umgeschrieben.

Auf einen Versuch mehr oder weniger kommt es ja nun auch nicht mehr an. :cool:


Grüße,
Cassio
 
Guten Abend Cassio

Leider war ich durch die Feierlichkeiten meines runden Geburtstags etwas vom "Hobby" abgelenkt, und konnte
erst heute deine neue INIT-Routine testen. Das doofe vorab: Keine Verbessung in der 16er-Problematik.

Ich hab ALL Befehle vor "Ascii_zeichen(5) = &H00 + Hbl" entfernt. Ich möchte einfach den Programmteil
herausfinden, in welchem das Problem mit den 16Zeichen-Strings entsteht. Wenn nur die Startposition
gesetzt wird und dan squenziell jedes Zeichen nach dem andern angezeigt wird, sollten doch in jedem
Fall ein paar Zeichen sichtbar werden, das war meine Überlegung. Das Display weiss doch noch gar nicht,
wie viele Zeichen angezeigt weden sollen, wenn die For-Next Schleife beginnt. Ich hab ja den Wait in der
Schleife bis zu 1 Sekunde verlängert, aber da wird gar kein einziges Zeichen angezeigt bei einem String
>15 Zeichen. Welcher Teil in der Anzeige-Routine bringt das Display also dazu, GAR KEIN Zeichen
anzuzeigen? Das war meine Frage... :)

Viele Grüsse
Thomas
 
Hallo Thomas!

Du hast das Prinzip scheinbar noch nicht verstanden.

Wenn du EIN Zeichen auf "Lcda_1 , 1" schreibst, wird die Startadresse für das Zeichen übermittelt UND die ASCII-Nummer des Zeichens.

Wenn du z.B. aber DREI Zeichen ab "Lcda_ 1 , 1" anzeigen lassen möchtest, dann wird wieder nur die ERSTE Startadresse an das Display geschickt und danach die DREI ASCII-Nummern für die Zeichen.
Das Display zählt beim Eintreffen jedes neuen Zeichens dann automatisch weiter, so dass die Zeichen hintereinerander auf dem LCD erscheinen.
Mehr passiert da also nicht!

Du kannst daher auch nichts in den I2C-Subroutinen ändern, weil sonst der ganze Ablauf nicht mehr passen würde!

Schade ist, dass du scheinbar nicht ein Display besitzt, das auch jemand von uns im Schrank liegen hat.
Ein einfaches und günstiges Displays das funktioniert, wäre z.B. das HIER !


Tja, wenn das andere INIT nun auch nicht funktioniert, du aber auch keine Datenblätter, Scope-Bilder, reale Fotos oder Analyzer Messungen liefern kannst, dann kann ich dir leider nicht weiterhelfen!
Vielleicht solltest du dir mal einen LA wie DIESEN HIER zulegen.
Damit könntest du uns allen dann mal zeigen, was dein I2C-Bus wirklich übermittelt und was dein Display direkt für Daten erhält.
Alles Andere ist ab jetzt wohl "Kaffeesatz lesen". :cool:


Grüße,
Cassio
 
Guten Abend Cassio

Hmm, denke, dass ich das Prinzip schon begriffen habe. Eben gerade weil die Startadresse nur ein Mal gesetzt wird und dann
die weiteren Zeichen schön der Reihe nach angezeigt werden, sollte doch was zu sehen sein, egal wie lang der String ist.

Die Displays sind ja auch nicht sooo günstig, und wie gesagt, ich habe da viiiiele verschiedene Typen auf Lager, mit allen
das selbe Erscheinungsbild. Könnte dir ja eins in eine Tüte stecken und zusenden :) .... Da diese Dinger ja zu Hunderten
an "normale" Arudino-Kunden verkauft werden, sollte da ja nicht ein generelles Problem vorliegen.

Aber eben, es ist ja kein Weltsproblem, aber eben, es ist wie mit jedem Problem, dass man(n) einfach nicht in den Griff
kriegt, es beschäftigt einem....

Enorm dankbare Grüsse
Thomas
 
Aber eben, es ist ja kein Weltsproblem, aber eben, es ist wie mit jedem Problem, dass man(n) einfach nicht in den Griff
kriegt, es beschäftigt einem....


Hallo Thomas!

Natürlich beschäftigt es einen, sonst hätte ich mich der Sache ja auch nicht noch einmal angenommen. :wink:

Wie aber schon erwähnt.....
Deine Problembeschreibungen beruhen nur auf ein paar Zeilen Text zu deinen Versuchen und Gedanken.
Es wäre schon lange hilfreich gewesen, mal reale Daten sehen zu können!
Wenn man ein Problem bzw. Fehler analysieren möchte, dann muss man eben auch etwas zum Analysieren haben. :cool:
Das mindeste wäre also ein LA oder ein DSO.
Ohne diese Geräte sind alle Überlegungen eben nur Theorie und ziehen die Fehlersuche in die Länge!

Obendrein wäre das ein oder andere Datenblatt, das genau zur Hardware gehört (und keine Vergleichstype), sehr interessant gewesen.


Vielleicht findest du ja den "Fehler" noch, wenn es dich einfach nicht los lässt. :wink:

Grüße,
Cassio
 
Hallo!

Hm, nun ja.... einfach ein paar Pins im Programm ändern ist leider nicht so einfach wie du dir es gerade denkst. :wink:
Ich kann mir aber nicht vorstellen dass Pollin eine andere Belegung hat, so dass kein Programm von mir passt. :hmmmm:

Dann lade ich mir mal das Datenblatt runter und schau mir das mal an.

Bis später....
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)