LCD 4x20 SainSmart I2C und ATtiny2313 USI

Oskar01

Mitglied
24. März 2008
267
0
16
Köln
Sprachen
  1. Assembler
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.
 

Anhänge

  • SainSmart2004_ATtiny2313_.asm
    13,4 KB · Aufrufe: 7
  • SainSmart2004_ATtiny2313_.jpg
    SainSmart2004_ATtiny2313_.jpg
    97,3 KB · Aufrufe: 16
  • SainSmart2004_I2C_adaptor.jpg
    SainSmart2004_I2C_adaptor.jpg
    122,8 KB · Aufrufe: 16
Zuletzt bearbeitet:
allen Unkenrufen zum Trotz von einem ATtiny2313 angesteuert werden soll
Da gibt's nichts zu unken. Wenn es ein kleiner klassischer AVR sein soll, bleibt ja kaum 'ne Alternative.

Von den klassischen (=SPI) AVR ist mir nur der ATtiny48/88 mit echtem (Master-fähigem) TWI bekannt.
ATtiny441/841, 1634 und 828 bieten zwar auch ein HW-TWI, aber nur mit Slave-Fahigkeit. Meiner Meinung nach kann man da auch nichts mit Software erweitern.

Bei den TPI-Tinies gibt's mit dem ATtiny20 und 40 auch Kandidaten mit nur-Slave-mode.

Lediglich die neuen X0- und X1-Core Tinies (=UPDI) besitzen alle 'ne komplette HW-TWI (wobei sich hier die Ansteuerung komplett von anderen HW-TWIs unterscheiden soll -> Bibliotheken)

Wenn's also ein kleiner klassischer Tiny sein soll, geht entweder USI oder Software.

Ich bin beim durchgehen des USI in den Datenblättern auf diverse Unstimmigkeiten beim Buffering des USI-Datenregisters gestoßen. Bei einigen Controllern existiert ein USI-Buffer-Register, in das das empfangene Byte aus dem USIDR (Empfangsregister) kopiert wird, bei anderen gibt es das nicht. In vielen Datenblättern waren dann typisch C&P-Fehler drin (also zB bei den Features der Hinweis, daß der Empfang nicht gepuffert ist, aber deutlich erkennbare USIBR im Blockschema/Register Summary etc...)
Jedenfalls hab ich diesbezüglich bei Atmel nachgefragt - in meiner Übersicht sind die gepufferten Controller mit 1+ in der USI-Spalte gekennzeichnet, die ungepufferten mit 1-.
Der ATtiny2313 besitzt also kein Buffer-Register, der neuere ATtiny2313A/4313 hingegen schon.
Das Buffering interessiert Dich bei 'nem Master natürlich weniger als bei 'nem Slave...
 
@LotadaC
Was macht deine "ATtiny Datenbank" ? Da wurde schon lange nichts mehr aktualisiert?
 
Ne, habe ich noch nicht gesehen. Sind die markierten neu dazu gekommen?
 
OT:
Nein, nicht wirklich. Ursprünglich hatte ich immer "zusammengehörende" Controller blockweise zusammengefaßt, und die Hintergrundfarbe zwischen grau und weiß gewechselt. Später habe ich die TPI-Tinies separat hervorheben wollen -> Hellblau (der Tiny40 gehört da auch noch hin). Die ganz neuen X-Cores (UPDI-Tinies) sind wiederum 'ne eigene Familie -> orange... Für die beiden X-Core-Familien (X-0 und X-1) wird aber noch'ne eigene Übersicht kommen - die sind innerhalb ihrer "AVR-Komponentenbaukasten-Struktur" eh übersichtlicher und in sich einheitlicher... (bisher zumindest). Die klassischen Tinies sind eher historischer Wildwuchs.
Ausgangspunkt für die Übersicht war, mir selbst 'n Überblick über die Tinies zu verschaffen - welcher welche Hardware bietet, welcher sich für welche Anwendung eignet usw...
(Um zu einer gegebenen Aufgabe einen passenden Tiny zu suchen. Die üblichen parametrischen Suchen helfen da wegen "Pinkollisionen" nicht immer weiter)
Klar kannst Du auch vieles mit'nem potenten Mega/XMega erschlagen, aber manchmal ist ein kleiner einfach zu verlötender SOIC/TSSOP besser geeignet als ein TQFP, QFN oder gar BGA. 'N schönen Größenvergleich zwischen Mega (jajaokok, is'n DIP) und Tiny (jajaokok is'n WLCSP) findest Du hier...
 
Was genau sind das [TPI-Tinies] für welche?
Das war meiner Meinung nach ein Ansatz für 'ne komplett neue Tiny-Familie. Programmierbar über ein neues Interface mit nur zwei Leitungen (und Reset) -> TPI. Es existieren nur 16 statt 32 Rechenregister. Der Flash und weitere nichtflüchtige Speicherbereiche (LockBits, ConfigurationBits, CalibrationBits, Device-IDBits) sind in den SRAM remapped/können wie SRAM gelesen werden.
Die Controller starten immer mit internem Oszillator (mit vorgeteiltem Takt) - dafür kann die Clocksource zur Laufzeit gewechselt werden (also nicht nur der Prescaler, sondern auch die Source selbst.).
Die Ansteuerung der PullUps erfolgt nicht mehr über Datenrichtungs- und Portregister - stattdessen gibt es ein entsprechendes Pullup-Enable-Register.
Maximaler externer Takt ist 12MHz, intern können sie 8MHz.
Die konventionellen Tinies besitzen gegenüber den Megas ja bereits einen "reduzierten Kern" (also auch die Instruktionen betreffend) - die TPIs sind nochmals reduziert.
Derzeit besteht die Familie aus Tiny4/5/9/10, Tiny20, Tiny40, Tiny102 und Tiny104. Beim Tiny441/841 und Tiny1634 lassen sich einige ... Sachen finden, die ...ähnlich sind (beides SPI-Tinies, aber ... entwicklungstechnisch irgendwo dazwischen entstanden...)
Meiner Meinung(!!) nach wird in der Linie auch nichts neues mehr kommen - insbesondere wegen der...
Die sind genau das.
Angepaßte, abgespeckte XMega-Module in kleinen Controllern. Mit non-X-typischen Taktfrequenzen und Spannungen. Unter Assembler muß man da ... recht stark umdenken, aber hardwaretechnisch sind die verlockend. Das jetzt auch hier auszuführen wird allerdings (viel) zu weit gehen (hab da auch noch keinen richtigen Überblick gesammelt) - wir haben ja Oskars Thread schon genug zugespammt...
 
Könnte man einen eigenen Post zu aufmachen. Das ist echt krass wie viele es aufeinmal von den Tiny´s gibt..
 

Ü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)