Pfad:AVR-DE => Anwendungen => ATtiny24-Experimentierboard mit LCD
tn24_lcd_Experimentierboard klein Anwendungen von
AVR-Einchip-Prozessoren AT90S, ATtiny, ATmega und ATxmega
Experimentierboard mit einem ATtiny24/44/84 und einer LCD
Logo

Experimentierboard mit einem ATtiny24/44/84 und einer LCD

Diese Seite als PDF (20 Seiten, 1,1 MB)

tn24_lcd Experimentierboard Wer für kleine Controlleranwendungen eine LCD und dafür bis zu vier Ein- und Ausgänge des Prozessors benötigt, ist mit dieser Lösung gut bedient:

0 Überblick

  1. Hardware
  2. Aufbau
  3. Software

1 Hardware

1.1 Schaltbild

tn24_lcd Schaltbild Bei der Schaltung können wahlweise ein ATtiny24, ein ATtiny44 oder ein ATtiny84, bzw. die entsprechenden A-Typen, verwendet werden. Die A-Typen unterscheiden sich nur im Strombedarf, die Zahlentypen im verfügbaren Flash- und EEPROM-Speicher.

Der Abblockkondensator von 10 oder 100 nF (Keramik) und der Reset-Pull-Up-Widerstand von 10 k sind Standard.

Der sechspolige Pfostenstecker dient der Verbindung mit den externen Bauteilen (z. B. auf einem Breadboard). Er enthält Pins für die Versorgungsspannung (VCC, GND) und für die frei verwendbaren I/O-Pins PA0 bis PA3.

Der ISP6-Pfostenstecker dient der Programmierung des ATtiny in der fertigen Schaltung. Die Programmierung kann mit angeschlossener LCD erfolgen.

Die LCD ist mit einer standardisierten 16-poligen Pfostenbuchse angeschlossen. Wenn die verwendete LCD über keine Hintergrundbeleuchtung verfügt, bleiben die Pins 15 und 16 unbeschaltet und der 220 Ω-Widerstand kann entfallen. Benötigt die Hintergrundbeleuchtung einen höheren Strom, kann der Widerstand nach der Formel
R (Ohm) = 1.000 * (UB - ULED) / I (mA)

berechnet und entsprechend verringert werden.

1.2 Stückliste

Die benötigten elektronischen Teile sind in der Stückliste zusammengestellt. Die LCD ist nicht enthalten, da diese vom vorgesehenen Verwendungszweck abhängt. Für einfache Anwendungen (z. B. ein Voltmeter oder einen Frequenzzähler) kann eine einzeilige LCD ausreichen, für vielseitige Verwendung ist eine weiß/blaue 4*20-LCD angemessen. Die LCD kann jederzeit gewechselt werden, es müssen nur die beiden Zeilen in der LCD-Include-Routinen mit der Größe (cLcdLines, cLcdColumns) sowie die gewünschten Ausgabepositionen geändert und neu assembliert werden. Die in der Stückliste angegebenen Preise entsprechen dem Stand von Januar 2018.

tn24_lcd Stückliste

1.3 Verwendungen

Mögliche Anwendungen sind in den Kapiteln 11 bis 14 des Mikroprozessorkurses dargestellt. Dort sind beschrieben:
  1. hier ein 8- und ein 16-Bit-Einschaltzähler,
  2. hier ein Infrarot-Fernsteuerempfänger mit diversen Analysetools, ein ATtiny13-Fernsteuersender und ein ATtiny24-IR-Datenempfangsauswerter,
  3. hier ein Frequenzzähler für Digital- und niedrig-amplitudige Analogspannungen sowie für ein Induktivitätsmessgerät,
  4. hier ein Messgerät für Spannungen bis 20 V für Ströme bis mehreren Ampere Gleichstrom, und für Temperaturen.
Die dort beschriebenen Anwendungen sind ohne weitere Änderungen auf dem Experimentierboard tn24_lcd lauffähig (siehe die dort jeweils angegebenen Assembler-Quelldateien mit der zugehörigen Include-Datei Lcd4Busy.inc).

Seitenanfang 1 Hardware 2 Aufbau 3 Software


2 Aufbau

2.1 Gedruckte Platine

tn24_lcd Platine tn24_lcd Bestückungsplan Die Bauteile finden auf einer 40*50 mm großen einseitigen Platine Platz. Drei Brücken sind mit Draht zu bestücken.

2.2 Mechanischer Aufbau

tn24_lcd LCD-Stiftleiste von unten tn24_lcd LCD-Stiftleiste von oben Die LCD-Anschlüsse werden wie in den Bildern zu sehen mit Stiftleisten bestückt und, falls sie durchkontaktiert sind, von oben her verlötet. Falls keine Durchkontaktierung vorhanden ist, wird die Stiftleiste mit der langen Stiftseite von unten in die Löcher geführt, die Stifte von der Unterseite her verlötet und dann das Plastikteil der Stiftleiste sukzessive in Richtung der Lötungen verschoben. Mutige können das Plastikteil auch ganz entfernen, allerdings mit der Gefahr, dass Stifte verbiegen können.



Die Stiftleiste passt dann perfekt in die Buchsenleiste auf der Platine. Das hat den Vorteil, dass die LCD jederzeit durch einen anderen Typ ausgetauscht werden kann.

Seitenanfang 1 Hardware 2 Aufbau 3 Software



3 Software

Für die Ansteuerung der LCD werden gleich zwei Versionen bereitgestellt:
  1. Eine universelle Version, die alle Anschlussarten von LCDs beherrscht, auch 8-Bit-Versionen, und
  2. eine speziell an diese Hardware angepasste Version, die nur diese 4-Bit-Version mit dem ATtiny24 in dieser Schaltung beherrscht.
Vorbemerkung: Alle hier vorgestellte Software verwendet umfangreich die ".if"-, ".ifdef"-, ".else"- und ".endif"-Direktiven in Assembler. Versuche also niemals die Software mit einem Assembler zu übersetzen der diese Direktiven nicht beherrscht. Für alle, die noch mit einem steinalten Assembler unterwegs sein sollten: gavrasm beherrscht das.

3.1 Universelle Version lcd.inc

Um Schluss zu machen mit den diversen unterschiedlichen Versionen von LCD-Routinen, die alle mehr oder weniger dasselbe machen, aber sich nur geringfügig unterscheiden, wurde die universelle Version lcd.inc entwickelt. Sie ist hier detailliert beschrieben. Was sie alles kann:

3.1.1 Standard-Parametersatz für tn24_lcd

Hier ist der Standard-Parameter-Satz für die tn24_lcd auf die vorliegende Hardware angepasst (Kopie aus lcd.inc, an vorliegende Hardware angepasst):

; Standard-Parameter-Satz der Einstellungen
.equ clock = 1000000 ; Taktfrequenz Prozessor in Hz
; LCD-Groesse:
  .equ LcdLines = 4 ; Anzahl Zeilen (1, 2, 4)
  .equ LcdCols = 20 ; Anzahl Zeichen pro Zeile (8..24)
; LCD-Ansteuerung
  .equ LcdBits = 4 ; Busbreite (4 oder 8)
  ; Wenn 4-Bit-Ansteuerung:
    .equ Lcd4High = 1 ; Busnibble (1=Oberes, 0=Unteres)
  .equ LcdWait = 0 ; Ansteuerung (0 mit Busy, 1 mit Warteschleifen)
; LCD-Datenports
  .equ pLcdDO = PORTA ; Daten-Ausgabe-Port
  .equ pLcdDD = DDRA ; Daten-Richtungs-Port
; LCD-Kontrollports und -pins
  .equ pLcdCEO = PORTB ; Control E Ausgabe-Port
  .equ bLcdCEO = PORTB2 ; Controll E Ausgabe-Portpin
  .equ pLcdCED = DDRB ; Control E Richtungs-Port
  .equ bLcdCED = DDB2 ; Control E Richtungs-Portpin
  .equ pLcdCRSO = PORTB ; Control RS Ausgabe-Port
  .equ bLcdCRSO = PORTB0 ; Controll RS Ausgabe-Portpin
  .equ pLcdCRSD = DDRB ; Control RS Richtungs-Port
  .equ bLcdCRSD = DDB0 ; Control RS Richtungs-Portpin
; Wenn LcdWait = 0:
  .equ pLcdDI = PINA ; Daten-Input-Port
  .equ pLcdCRWO = PORTB ; Control RW Ausgabe-Port
  .equ bLcdCRWO = PORTB1 ; Control RW Ausgabe-Portpin
  .equ pLcdCRWD = DDRB ; Control RW Richtungs-Port
  .equ bLcdCRWD = DDB1 ; Control RW Richtungs-Portpin
; Wenn Dezimalausgabe benoetigt wird:
  ;.equ LcdDecimal = 1 ; Wenn definiert: einbinden
; Wenn Hexadezimalausgabe benoetigt wird:
  ;.equ LcdHex = 1 ; Wenn definiert: einbinden
; Wenn nur Simulation im SRAM:
  ;.equ avr_sim = 1 ; 1=Simulieren, 0=Nicht simulieren
;

Der so erstellte Parametersatz enthält keine Dezimal- und Hexadezimal-Ausgaberoutinen. Falls gewünscht einfach das Semikolon dieser beiden Zeilen entfernen.

3.1.2 Standard-Routinen der Include-Datei

Die zur Verfügung gestellten Routinen sind im Kopf von lcd.inc folgendermaßen gelistet:

; ***********************************************
; *  L C D   I N T E R F A C E  R O U T I N E N *
; ***********************************************
;
; +-------+----------------+--------------+
; |Routine|Funktion        |Parameter     |
; +-------+----------------+--------------+
; |LcdInit|Initiiert die   |Ports, Pins   |
; |       |LCD im einge-   |              |
; |       |stellten Modus  |              |
; +-------+----------------+--------------+
; |LcdText|Gibt den Text im|Z=2*Tabellen- |
; |       |Flash ab Zeile 1|  adresse     |
; |       |aus             |0x0D: Naechste|
; |       |                |      Zeile   |
; |       |                |0xFF: Ignorie-|
; |       |                |      re      |
; |       |                |0xFE: Textende|
; +-------+----------------+--------------+
; |LcdSram|Gibt den Text im|Z=SRAM-Adresse|
; |       |SRAM aus        |R16: Anzahl   |
; +-------+----------------+--------------+
; |LcdChar|Gibt ein Zeichen|R16: Zeichen  |
; |       |aus             |              |
; +-------+----------------+--------------+
; |LcdCtrl|Gibt Kontrollbe-|R16: Befehl   |
; |       |fehl aus        |              |
; +-------+----------------+--------------+
; |LcdPos |Setzt Ausgabe-  |ZH: Zeile 0123|
; |       |position        |ZL: Spalte 0..|
; +-------+----------------+--------------+
; |LcdSpec|Erzeugt Spezial-|Z: 2*Tabellen-|
; |       |zeichen         |   adresse    |
; +-------+----------------+--------------+
; | S C H A L T E R   L C D D E C I M A L |
; +-------+----------------+--------------+
; |LcdDec2|Gibt zwei Dezi- |R16: Binaer-  |
; |       |malstellen aus  |     zahl     |
; +-------+----------------+--------------+
; |LcdDec3|Gibt drei Dezi- |R16: Binaer-  |
; |       |malstellen aus  |     zahl     |
; +-------+----------------+--------------+
; |LcdDec5|Gibt fuenf Dezi-|Z: Binaerzahl |
; |       |malstellen aus  |   16 Bit     |
; +-------+----------------+--------------+
; |    S C H A L T E R   L C D H E X      |
; +-------+----------------+--------------+
; |LcdHex2|Gibt zwei Hexa- |R16: Binaer-  |
; |       |dezimalen aus   |     zahl     |
; +-------+----------------+--------------+
; |LcdHex4|Gibt vier Hexa- |Z: Binaerzahl |
; |       |dezimalen aus   |   16 Bit     |
; +-------+----------------+--------------+
;

Gegenüber der Include-Datei tn24_lcd_busy.inc (siehe nächstes Kapitel) sind einige Umbenennungen vorgenommen worden, die Anpassung von Quellcode von dieser auf die lcd.inc dürfte aber kaum größeren Aufwand verursachen, so dass ich empfehle von dieser auf die universelle Version umzustellen.

3.1.3 Belegter Speicher

Durch die Include-Datei wird folgender Speicher belegt:
VersionUmfang
Worte
Akkumuliert
Minimal version (1 MHz, 8-Bit, Wait-Mode, ohne Dez/Hex) 138-
Wait ==> Busy+9147
1 MHz ==> 20 MHz+20158
8-Bit ==> 4-Bit+44182
LcdDecimal+86224
LcdHex+14152
Maximalversion
(20 MHz, 4-Bit, Busy-Mode,
Dezimal- und Hex-Wandlung
+197335
Die an tn24_lcd angepasste Version hat folglich 200 Worte.

3.2 Spezielle Version tn24_lcd_busy.inc

Hier wird eine universell einstellbare Software für die Ansteuerung der LCD zur Verfügung gestellt, die alle wichtigen Routinen zur Ausgabe von Texten und Zeichen auf der LCD sowie zur Erzeugung eigener Zeichen als Include-Datei zur Verfügung stellt. An zwei Beispielen wird demonstriert, wie die Software an die eigenen Bedürfnisse und Bedingungen angepasst und angewendet werden kann.

3.2.1 Include-Routinen

Die wichtigsten Unterprogramme zur Ansteuerung der LCD im Experimentierboard sind in der Include-Datei zusammengestellt (Link zur HTML-Version). Mit dem Aufruf folgender Unterprogramme werden folgende Aufgaben erledigt:
Vor jeder Verwendung der Routinen ist sicherzustellen, dass

3.2.2 Zahlenumwandlung und -ausgabe-Routinen

Optionale Zahlenausgabe auf der LCD Zusätzlich können Routinen zur Zahlenausgabe in den Formaten Dezimal, Hexadezimal und Binär mit 8 und 16 Bit Länge zur Entwurfszeit mit Hilfe von Schaltern (sLcdDecN, sLcdHexN, sLcdBinN mit N=8 oder N=16) aktiviert werden. Durch Aufruf der Routinen LcdDecN, LcdHexN bzw. LcdBinN werden die Werte im Register rmp (8 Bit) bzw. ZH:ZL (16 Bit) an der aktuellen Position im aufgerufenen Format ausgegeben (bei Dezimalausgabe werden dabei führende Nullen unterdrückt).

Alle Zahlenausgaberoutinen sind mit der Direktive ".ifdef" so programmiert, dass sie nur dann in den erzeugten Hex-Code aufgenommen werden, wenn die Schalter sLcdDecN, sLcdHexN und sLcdBinN (mit N=8 oder 16) gesetzt sind. Bitte beachten, dass einige dieser Schalter auch in der Include-Routine gesetzt werden (z.B. sLcdHex8, wenn sLcdHex16 gesetzt ist. Daher bitte zum Setzen der Schalter sLcdHex8 und sLcdBin8 immer ".set ..." und nicht ".equ ..." verwenden.

Nähere Angaben zu beeinflussten Registern sind in der Include-Datei enthalten. Dabei kennzeichnen "Used" temporär verwendete, aber nach Beendigung der Routine wieder hergestellte Register.

3.2.3 Standardcode ohne Interrupts

Die Quellcodedatei tn24_lcd_lin.asm (HTML-Format hier) demonstriert die Anwendung der optionalen Zahlenausgabe und den Aufruf der LCD-Include-Routinen. Die Datei kann als Formatvorlage für eigene Software verwendet werden. Die darin inkludierte Datei "tn24_lcd_busy_4x20.inc" ist mit den Konstanten cLcdLines=4 und cLcdColumns=20 auf eine vierzeilige LCD eingestellt, der Takt ist mit clock=1000000 auf 1 MHz voreingestellt. Der Code verwendet und demonstriert alle Zahlenausgabe-Routinen.

Spezialzeichen-Ausgabe auf der LCD Die Softwarevorlage demonstriert ferner auch die Ausgabe von speziellen Zeichen, die mit dem Open-Office-Tool bzw. mit dem M$-Office-Tool generiert, als Tabelle in den Quellcode und mit der Routine LcdChars in die LCD geschrieben wurden.

3.2.4 Standardcode mit Interrupts

Für interruptgesteuerte Programm kann die Vorlage tn24_lcd_int.asm (HTML-Format hier) verwendet werden. Sie enthält die Interruptvektoren des ATtiny24. Hierfür wurde tn24_lcd_busy.inc auf eine einzeilige LCD mit 8 Zeichen umgestellt und im Hauptprogramm mit einem Takt von 8 MHz eingestellt (Löschen der CLKDIV8-Fuse). Die Bilder demonstrieren die Initiierung und die Ausgabe von Hexadezimal- und Dezimalzahlen.

1x8-LCD Init 1x8-LCD Zahlenausgabe

3.2.5 Belegter Speicher

Die folgende Tabelle zeigt den Speicherbedarf ohne und mit den verschiedenen Optionen (für den ATtiny24, Flashspeicher 1.024 Worte).

Optionen Ohne Interrupts Mit Interrupts
Worte%Worte%
Keine29729,031530,8
Dezimal38037,139838,9
Dezimal+Hex41440,443242,3
Dezimal+Hex+Bin45244,147045,9
Dezimal+Hex+Bin+Spezialzeichen49047,950849,6


Es verbleibt in allen Fällen noch genügend Flashspeicher für andere Aufgaben.

Seitenanfang 1 Hardware 2 Aufbau 3 Software




Lob, Tadel, Fehlermeldungen, Genöle und Geschimpfe oder Spam bitte über das Kommentarformular an mich.

©2018 by http://www.avr-asm-tutorial.net