Hi,
Seit einiger Zeit sind 4x20 Text-LCDs populär, die mit I2C-Bus angesteuert werden.
Leider findet man im Netz so gut wie nichts an für den Einsteiger brauchbaren Assemblerprogrammen zur Ansteuerung. Die meisten Libraries setzen überdies voraus, dass die Ansteuer-MCU eine Harware-TWI- bzw. I2C-Schnittstelle aufweist. So ist es nicht verwunderlich, dass ich bis jetzt nichts Passendes für den ATtiny2313 gefunden habe.
Deswegen möchte ich hier von meinen Experimenten berichten
und das 4x20 LCDisplay SainSmart2004 mit I2C-Huckepack-Portadapter mit PCF8574 vorstellen, das allen Unkenrufen zum Trotz von einem ATtiny2313 angesteuert werden soll.
Obwohl jeder die für das Flashen der ATMEL-MCUs nötige SPI-Schnittstelle kennt, ist weniger bekannt, dass hierbei dieselbe USI genannte Schnittstelle benutzt wird, die man auch zur I2C- oder Three-Wire-Schnittstelle umkonfigurieren kann.
Im vorgestellten Ansteuerprogramm wird von dieser Möglichkeit beim ATtiny2313 Gebrauch gemacht.
Für die Inbetriebnahme dieser I2C-LCDs müssen aber noch einige Dinge abgeklärt werden:
Die Kommunikation erfolgt nämlich nicht eindimensional von einem Ausgangsport zum Eingangsport des Endgeräts ohne Feedback, ob die Daten auch da angekommen sind, wo sie hin sollen, wie das bei den meisten LCD-Initialisierungen (mit Ausnahme unter Verwendung der Busyflagabfrage) der Fall ist, sondern ein Master muss auf die Antwort eines ausgewählten Slaves warten, bevor mit der Datenübertragung begonnen werden kann.
Dabei wird beim Start das Senden der korrekten Port-Slave-Adresse nötig.
Die Informationen im Netz stiften dazu einige Verwirrung.
Aber es ist ganz einfach:
Die Adressen werden von den Herstellern meistens im 7-Bit-Format angegeben.
Die zu sendenden Steuerbefehle besitzen aber ein 8-Bit-Format, das zu der 7-Bit-Adresse das Read/Write-Bit hintanstellt. Somit rutscht die Adressenangabe eine Stelle nach links, was einer Multiplikation mit 2 gleichkommt. Beim Schreiben ist das R/W-Bit Null.
Beispiel:
Herstellerangabe Adressbereich für den Portadapter PCF8574:
hex 20 bis hex 27, 0b0100000..... 0b0100111
shifted left 0b01000000..... 0b01001110
ergibt:
hex 40 bis hex 47
und für den PCF8574A gilt dann:
hex 38 bis hex 3F 0b0111000..... 0b0111111
shifted left 0b01110000..... 0b01111110
ergibt:
hex 70 bis hex 7E.
Letztere Adressen werden als Konstanten in das TWI-Programm eingesetzt.
Man hat 7 Slave-Adressen zur Auswahl. Diese können über die Lötpads A0,A1,A2 ausgewählt werden. Dabei bedeutet offengelassen eine logische Eins und verlötet (nach GND) Eine Null.
Diese Adressen sind die drei niederwertigen Bits in obigem Beispiel.
Beispiel:
A0=0, A1=0, A2=1 ->hex 24 oder als Adressenstring hernach: hex 48
Das LCD selbst arbeitet nach dem HD44780-Standard, und der Portadapter hat demnach das Pinout:
Vss, Vdd, V0, RS, R/W, Ena, D0, D1 ,D2, D3, D4, D4, D6, D7, A, K
0V +5V adj. RS R/W Ena n.c. n.c. n.c n.c B4 ………..B7 Backlight LED
Dadurch, dass D0 bis D3 nicht belegt sind, erkennt man sofort, dass das Display nach der I2C-Konvertierung nur über den Vierbitmodus angesprochen werden kann.
Besonderheit ist noch, dass Pin Bit D0 nicht extern direkt angesteuert werden kann, somit offen gelassen werden soll. Ist die Hintergrundbeleuchtung aktiv, setzt der Portadapter diesen Pin selber auf Eins. Die Anoden und Katoden der Hintergrundbeleuchtung (Pin A, Pin K) sollten ebenfalls nicht extern beschaltet werden, denn die Ansteuerung der Hintergrundbeleuchtiung erfolgt nach Initialisierung ebenfalls softwaremäßig. Der zugehörige Befehl dazu lautet hex 08.
Ist die I2C- bzw. TWI-Routine funktionsbereit, die Adressen im Programm richtig eingegeben, wird man vielleicht enttäuscht feststellen, dass die meisten herkömmlichen LCD-Initialisierungsprogramme nicht funktionieren.
Das liegt daran, dass die entscheidenden Funktionsbits „Register Select“, „Read/Write quer“ und „Enable“ nicht als separate Portpins herausgeführt sind.
Die Lösung liegt darin, die LCD-Routinen so umzuschreiben, dass alles als Achtbit-Steuerwort über I2C gesendet werden kann.
Beim Enable-Bit zum Beispiel muss also zweimal gesendet werden, anstelle Portbit zu setzen, nops einzufügen und Portbit wieder zu löschen.
Durch Bit-maskierende Veroderung (mit „ori“ -> Setzen auf „immer Eins“ ) oder Ver-undung (mit „andi“-> Setzen auf „immer Null“) kommt man dem Ziel schon näher.
Viel Spass!
Geht nicht...gibt's nicht.
beste Ostergrüße
Euer Oskar01
P.S.: Die USI-Schnittstelle ist für größere Master-Slave-Bussysteme mit mehreren Slaves etc. eigentlich nicht vorgesehen wegen fehlender Slewrateanpassung, Noise Cancelling etc., siehe Datenblatt Seite 142. Aber für ein einziges Display über 10 cm Leitung anzusteuern, reicht es allemal.
Seit einiger Zeit sind 4x20 Text-LCDs populär, die mit I2C-Bus angesteuert werden.
Leider findet man im Netz so gut wie nichts an für den Einsteiger brauchbaren Assemblerprogrammen zur Ansteuerung. Die meisten Libraries setzen überdies voraus, dass die Ansteuer-MCU eine Harware-TWI- bzw. I2C-Schnittstelle aufweist. So ist es nicht verwunderlich, dass ich bis jetzt nichts Passendes für den ATtiny2313 gefunden habe.
Deswegen möchte ich hier von meinen Experimenten berichten
und das 4x20 LCDisplay SainSmart2004 mit I2C-Huckepack-Portadapter mit PCF8574 vorstellen, das allen Unkenrufen zum Trotz von einem ATtiny2313 angesteuert werden soll.
Obwohl jeder die für das Flashen der ATMEL-MCUs nötige SPI-Schnittstelle kennt, ist weniger bekannt, dass hierbei dieselbe USI genannte Schnittstelle benutzt wird, die man auch zur I2C- oder Three-Wire-Schnittstelle umkonfigurieren kann.
Im vorgestellten Ansteuerprogramm wird von dieser Möglichkeit beim ATtiny2313 Gebrauch gemacht.
Für die Inbetriebnahme dieser I2C-LCDs müssen aber noch einige Dinge abgeklärt werden:
Die Kommunikation erfolgt nämlich nicht eindimensional von einem Ausgangsport zum Eingangsport des Endgeräts ohne Feedback, ob die Daten auch da angekommen sind, wo sie hin sollen, wie das bei den meisten LCD-Initialisierungen (mit Ausnahme unter Verwendung der Busyflagabfrage) der Fall ist, sondern ein Master muss auf die Antwort eines ausgewählten Slaves warten, bevor mit der Datenübertragung begonnen werden kann.
Dabei wird beim Start das Senden der korrekten Port-Slave-Adresse nötig.
Die Informationen im Netz stiften dazu einige Verwirrung.
Aber es ist ganz einfach:
Die Adressen werden von den Herstellern meistens im 7-Bit-Format angegeben.
Die zu sendenden Steuerbefehle besitzen aber ein 8-Bit-Format, das zu der 7-Bit-Adresse das Read/Write-Bit hintanstellt. Somit rutscht die Adressenangabe eine Stelle nach links, was einer Multiplikation mit 2 gleichkommt. Beim Schreiben ist das R/W-Bit Null.
Beispiel:
Herstellerangabe Adressbereich für den Portadapter PCF8574:
hex 20 bis hex 27, 0b0100000..... 0b0100111
shifted left 0b01000000..... 0b01001110
ergibt:
hex 40 bis hex 47
und für den PCF8574A gilt dann:
hex 38 bis hex 3F 0b0111000..... 0b0111111
shifted left 0b01110000..... 0b01111110
ergibt:
hex 70 bis hex 7E.
Letztere Adressen werden als Konstanten in das TWI-Programm eingesetzt.
Man hat 7 Slave-Adressen zur Auswahl. Diese können über die Lötpads A0,A1,A2 ausgewählt werden. Dabei bedeutet offengelassen eine logische Eins und verlötet (nach GND) Eine Null.
Diese Adressen sind die drei niederwertigen Bits in obigem Beispiel.
Beispiel:
A0=0, A1=0, A2=1 ->hex 24 oder als Adressenstring hernach: hex 48
Das LCD selbst arbeitet nach dem HD44780-Standard, und der Portadapter hat demnach das Pinout:
Vss, Vdd, V0, RS, R/W, Ena, D0, D1 ,D2, D3, D4, D4, D6, D7, A, K
0V +5V adj. RS R/W Ena n.c. n.c. n.c n.c B4 ………..B7 Backlight LED
Dadurch, dass D0 bis D3 nicht belegt sind, erkennt man sofort, dass das Display nach der I2C-Konvertierung nur über den Vierbitmodus angesprochen werden kann.
Besonderheit ist noch, dass Pin Bit D0 nicht extern direkt angesteuert werden kann, somit offen gelassen werden soll. Ist die Hintergrundbeleuchtung aktiv, setzt der Portadapter diesen Pin selber auf Eins. Die Anoden und Katoden der Hintergrundbeleuchtung (Pin A, Pin K) sollten ebenfalls nicht extern beschaltet werden, denn die Ansteuerung der Hintergrundbeleuchtiung erfolgt nach Initialisierung ebenfalls softwaremäßig. Der zugehörige Befehl dazu lautet hex 08.
Ist die I2C- bzw. TWI-Routine funktionsbereit, die Adressen im Programm richtig eingegeben, wird man vielleicht enttäuscht feststellen, dass die meisten herkömmlichen LCD-Initialisierungsprogramme nicht funktionieren.
Das liegt daran, dass die entscheidenden Funktionsbits „Register Select“, „Read/Write quer“ und „Enable“ nicht als separate Portpins herausgeführt sind.
Die Lösung liegt darin, die LCD-Routinen so umzuschreiben, dass alles als Achtbit-Steuerwort über I2C gesendet werden kann.
Beim Enable-Bit zum Beispiel muss also zweimal gesendet werden, anstelle Portbit zu setzen, nops einzufügen und Portbit wieder zu löschen.
Durch Bit-maskierende Veroderung (mit „ori“ -> Setzen auf „immer Eins“ ) oder Ver-undung (mit „andi“-> Setzen auf „immer Null“) kommt man dem Ziel schon näher.
Viel Spass!
Geht nicht...gibt's nicht.
beste Ostergrüße
Euer Oskar01
P.S.: Die USI-Schnittstelle ist für größere Master-Slave-Bussysteme mit mehreren Slaves etc. eigentlich nicht vorgesehen wegen fehlender Slewrateanpassung, Noise Cancelling etc., siehe Datenblatt Seite 142. Aber für ein einziges Display über 10 cm Leitung anzusteuern, reicht es allemal.
Anhänge
Zuletzt bearbeitet: