I2c LC-Display ansteuern *erledigt*

Der chaotische Hauptfaden

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

Antworten
Burga
Beiträge: 89
Registriert: Di 13. Aug 2013, 02:43
Wohnort: Odenthal

I2c LC-Display ansteuern *erledigt*

Beitrag von Burga »

Hossa,

bin gerade dabei ein LC-Modul mit i2c Schnittstelle mit einem Atmega8 zu verheiraten. Dummerweise gibt´s in Bascom keine passende lib also muss ich mir selbst eine schreiben.
Der i2c IC ist ein Portexpander und hört auf den Namen PCF8574T.

Und hier meine Frage: Muss ich nach jedem abgesetzten Byte ein "Enable" triggern und vorallem muss das Enable Byte dann auch die vorher übertragenen Bits wieder beinhalten? Ich meine theoretisch sollten ja alle Pins gleichzeitig geschaltet werden.

Bitte helft mir mein Kopf raucht schon vom Nibbles drehen
Zuletzt geändert von Burga am Di 13. Aug 2013, 17:05, insgesamt 1-mal geändert.
Benutzeravatar
Heaterman
Beiträge: 3990
Registriert: Fr 28. Jun 2013, 10:11
Wohnort: Am Rand der Scheibe, 6 m unter NN

Re: I2c LC-Display ansteuern

Beitrag von Heaterman »

Das Schreiben auf den PCF8574 besteht doch eigentlich nur aus:

Code: Alles auswählen

I2start
I2cwbyte Pcf8547_schreib_adresse
I2cwbyte &Bxxxxxxxxx
I2cstop
Es gibt für I2C-LCD bei MSC eine App-Note: 118 mit einer I2C-LCD-Lib: LCD.i2c.lib
Burga
Beiträge: 89
Registriert: Di 13. Aug 2013, 02:43
Wohnort: Odenthal

Re: I2c LC-Display ansteuern

Beitrag von Burga »

Danke für die schnelle Antwort Heaterman.

Die Appnote habe ich gelesen und ausprobiert. Funzt aber leider nicht da mein Display anders an den Portexpander angeschlossen ist.
(Gibt auch eine Version der Library in der man die Belegng anpassen kann, funzt aber ebenso nicht.)

Es geht um den Enable-Pin auf der Display Seite, der mit einem Pin des Port Expanders verbunden ist. Dieser taucht ja in dem Datenbyte auf welches ich an den Expander schicke.

Bei einem direkt verdrahtetem Display würd ich etwas in dieser Art machen :

Code: Alles auswählen

'8-Bit mode
config Porta =output
config Portb=output
' Angenohmen Portb.0 wäre die Enableleitung
<-- Display init spar ich mir-->
Dim i as integer
dim welteroberungsstring as string *10

welteroberungsstring="Hallo Welt"
for i = 1 to 10
  porta=mid(welteroberungsstring, i, 1) 'Ein Zeichen des Strings ausgeben
  set Portb.0 'enable setzen
  nop:nop:nop ' drei Zyklen warten
  reset Portb.0 ' enable löschen
next
Bei I2c über den Portexpander schicke ich aber das enable Flag zusammen mit den Daten im selben Byte, daher stellt sich mir die Frage ob ich die Daten nochmal extra in das Byte packen muss. Vielleicht denk ich hier auch zu wirr
Benutzeravatar
flogerass
Beiträge: 1145
Registriert: Mo 12. Aug 2013, 17:46
Wohnort: Nord-Östlich von Ulm

Re: I2c LC-Display ansteuern

Beitrag von flogerass »

Hab ich das richtig verstanden, dass das ein Display im 4bit mode ist, das parallel an einem i2c=>parallel-Wandler hängt?
Dann musst du immer den kompletten neuen Zustand übertragen:
Daten => Daten mit Enable => 00
Burga
Beiträge: 89
Registriert: Di 13. Aug 2013, 02:43
Wohnort: Odenthal

Re: I2c LC-Display ansteuern

Beitrag von Burga »

Ja hast Du richtig verstanden, I2C-Portexpander-4Bit-Display
Mein Problem hat sich mehr oder minder gerade von selbst gelöst. Gut das mit dem Enable zu wissen, es gibt ja durchaus weitere IC die eine Enable Leitung haben und die man darüber ansteuern möchte.

Was ist passiert und wie schaut die Lösung aus :

Ich wollte ursprünglich das LCD erstmal nur per i2c ansprechen, um überhaupt erstmal zu sehen ob es funktioniert, darauf zielte meine Frage.
Da ich so schnell keine Antwort erwartet habe, war ja mitten in der Nacht, hab ich mir die LCD Routinen von Bascom angeschaut und darüber das Display initialisiert, die paar Bits konnte ich ja auch einmal statisch umsortieren. Bei der nachfolgenden Testausgabe habe ich dann festgestellt das jeweils das Low und High nibble der Daten vertauscht wurden und nach einer Möglichkeit gesucht mich in die Ausgaberoutine zu klinken und diese dann einfach per SWAP-Befehl zu tauschen und siehe da: In der neuen Bascomversion gibt es die beiden Compilerdirektiven "$lcdputdata=label" und "$lcdputdata=label" die einem vor dem Senden am R24 Register rumspielen lassen(enthält das zu sendende Byte).

Vielen Dank!
Antworten