LCD 4x20 SainSmart I2C und ATtiny2313 USI

Dieses Thema im Forum "Hardware" wurde erstellt von Oskar01, 1. April 2018.

  1. Oskar01

    Oskar01 Mitglied

    Registriert seit:
    24. März 2008
    Beiträge:
    265
    Zustimmungen:
    0
    Punkte für Erfolge:
    16
    Sprachen:
    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:

    #1 Oskar01, 1. April 2018
    Zuletzt bearbeitet: 1. April 2018
  2. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.963
    Zustimmungen:
    45
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    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...
     
  3. Janiiix3

    Janiiix3 Aktives Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    1.278
    Zustimmungen:
    8
    Punkte für Erfolge:
    38
    Sprachen:
    C
    @LotadaC
    Was macht deine "ATtiny Datenbank" ? Da wurde schon lange nichts mehr aktualisiert?
     
  4. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.963
    Zustimmungen:
    45
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    Jaja... Zeit und Motivation (gerade bei dem Wetter) und so...
    P.S.: die Aktualisierung vom September kennst Du aber schon, oder?
     
    #4 LotadaC, 3. April 2018
    Zuletzt bearbeitet: 3. April 2018
  5. Janiiix3

    Janiiix3 Aktives Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    1.278
    Zustimmungen:
    8
    Punkte für Erfolge:
    38
    Sprachen:
    C
    Ne, habe ich noch nicht gesehen. Sind die markierten neu dazu gekommen?
     
  6. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.963
    Zustimmungen:
    45
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    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...
     
  7. Janiiix3

    Janiiix3 Aktives Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    1.278
    Zustimmungen:
    8
    Punkte für Erfolge:
    38
    Sprachen:
    C
    Was genau sind das für welche?

    Und was ist denn neu an den X-Core Familien? Bin da leider nicht so auf den neusten Stand..
     
  8. LotadaC

    LotadaC Sehr aktives Mitglied

    Registriert seit:
    22. Januar 2009
    Beiträge:
    2.963
    Zustimmungen:
    45
    Punkte für Erfolge:
    48
    Sprachen:
    BascomAVR, Assembler
    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...
     
  9. Janiiix3

    Janiiix3 Aktives Mitglied

    Registriert seit:
    28. September 2013
    Beiträge:
    1.278
    Zustimmungen:
    8
    Punkte für Erfolge:
    38
    Sprachen:
    C
    Könnte man einen eigenen Post zu aufmachen. Das ist echt krass wie viele es aufeinmal von den Tiny´s gibt..
     
  • Über uns

    Unsere immer weiter wachsende Community beschäftigt sich mit Themenbereichen rund um Mikrocontroller- und Kleinstrechnersysteme. Neben den Themen Design von Schaltungen, Layout und Software, beschäftigen wir uns auch mit der herkömmlichen Elektrotechnik.

    Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  • Coffee Time

    Unser makerconnect-Team arbeitet hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und unser eigener makerconnekt-Server regelmäßig gewartet wird. Wir nehmen das Thema Datensicherung und Datenschutz sehr ernst und sind hier sehr aktiv, auch sorgen wir uns darum, dass alles Drumherum stimmt!

    Dir gefällt das Forum und die Arbeit unseres Teams und du möchtest es unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft, unser Team freut sich auch über eine Spende für die Kaffeekasse :-)
    Vielen Dank!
    Dein makerconnect-Team

    Spende uns! (Paypal)
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren und die Seite optimal für dich anzupassen. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden