Upline: Infos & Dokus Elektronik

Übung ATMEL-µC mit vollgrafischem LCD Teil 1


ATMega8515 und DataVision DG12864-12

Das hier vorgestellte Beispiel ist sehr einfach gehalten und sollte auch einem Laien erste Gehversuche zur Verwendung eines grafischen LCDs an einem Atmel-Mikrocontroller ermöglichen.

Komponenten

  • µC ATMega8515
  • herausgeführte Ports, 8 LEDs, 8 Taster, ideal: Testboard
  • grafisches LCD mit 128x64 Pixeln und Controller T6963c (z.B. DataVision DG12864-12)
  • Spannungsquelle -5V/GND/+5V oder alternativ nur Netzteil für das Testboard und -5V aus Spannungsinverter beziehen
  • PC zur Programmierung des µC in Bascom und entsprechend eAnschlußkabel
  • 10- bzw. 20-polige Kabel, 2 Buchsen mit 2x5 Kontakten (z.b. COM-Port-Kabel aus älteren PCs oder Floppykabel ohne die Buchsen)
  • Lötzubehör und 2-3h Zeit

Schaltung und Besonderheiten

Testboard für Atmel Controller und grafisches Display Ich habe ein einfaches Testboard verwendet, welches über jeweils 8 LEDs und Taster verfügt. Weiterhin werden dort alle Ports herausgeführt, die Programmierung ist bequem über ein SPI-Interface mgl. und eine 5V-Spannungsversorgung ist ebenfalls integriert. Sicher, dies ist nicht unbedingt notwendig, man spart sich aber die Lötarbeiten auf einer Lochrasterplatine. Da mir in früheren Tests aufgefallen war, daß dieses kleine Testboard bei den Schaltern eine zum STK500 umgekehrte Logik verwendet, müßte dies bei Verwendung des Standardboards STK500 wahrscheinlich durch kleine Anpassungen im Quelltext berücksichtigt werden. Beim Test ist das u.a. am Status von PortD erkennbar, welcher in der letzten Displayzeile ausgegeben wird und 0 sein sollte. Das Display wurde Mitte 2005 einige Wochen bei Pollin pollin.de für ca. 8€ angeboten. Vergleichbare Displays kosten sonst ca. 45-50€ (z.B. bei Reichelt reichelt.de). Am Display war ein Flachbandkabel angebracht, welches nur über eine sehr schlecht verarbeitbare integrierte Metallfolie die Kontakte zur Verfügung stellte. Beim Auslöten dieser ist unbedingt darauf zu achten, daß man die stark abgewinkelten Lötösen nicht hochbiegt, da die scheinbar sehr schwache Kupferbeschichtung der Platine sonst in den Kontaktstellen abgerissen wird, was ich bei einem meiner beiden Displays leider zu spüren bekam. Die Reparatur mit Silberleitlack oder Kupferlackdraht ist bei den sehr kleinen Leitungsabständen und einem SMD-Rastermaß von 0.8mm sehr mühsam ...
Da das hier verwendete gLCD-Display eine externe negative Kontrastspannung erfordert und diese in der Regel nicht gegeben ist, muß man sie aus der 5V-Spannung erzeugen. Hierzu gibt es einige Schaltungsvorschläge im Netz, empfehlenswert ist die auch auf der von Pollin angebotenen PC-Vorschaltplatine verwendete Schaltung mit einem MC34063. Verwendet man direkt diesen Bausatz, so genügt das Einlöten der dafür nötigen Bauteile und der Anschluß der Versorgungsspannung aus der µC-Schaltung (z.B. Pin 9/10 der Portstecker). Die negative Spannung wird dann direkt an das Display zurückgeführt. Auch verwendbar sind Spannungsinverter wie der ICL 7660, den man bereits für 0,60€ bekommt und der zusätzliche Schaltungsaufwand ist auch relativ gering. Auf keinen Fall an 5V verwendbar ist eine Schaltung mit dem bekannten Timerbaustein 555! Dieser erzeugt aus 5V nur ca. -2,5V, was zwar für das init (erkennbar an 2 schwarzen Pixelreihen) des Displays genügt, anschließend aber nicht mehr zur Darstellung von Text/Grafik ausreicht. Die 555er Schaltung könnte evtl. verwendet werden, wenn sie an einer anderen Spannungsversorgung (>5V) betrieben wird, da viele andere 555er Schaltungen mit bedeutend höheren Spannungen arbeiten. Dies habe ich allerdings nicht getestet. Schaltungsvorschläge findet man u.a. auch bei Polin im Downloadbereich - die Datenblätter/Treiber zu diversen LCDs enthalten diese Schaltungen.
Der weitere Aufbau ist sehr einfach: ich habe ein 20-poliges Flachbandkabel (altes Floppykabel) an das Display angelötet und das andere Ende entsprechend verbunden. Hierzu nimmt man die 8 Datenleitungen (Pin 10-17) und die LED-Hintergrundbeleuchtung (Pin 19/20) und drückt auf das freie Ende eine 2x5-polige Buchse (bei Reichelt "PFL 10" für 0,09€). Hierbei muß lediglich auf die Reihenfolge geachtet werden, standardmäßig ist ein Portsockel wie folgt belegt: Pin 0-7 sind die Portpins, Pin 9 ist Gnd und Pin 10 liegt auf +5V. Pin 1-4 (2xGnd, +5V, -5V) habe ich an die Vorschaltplatine gelötet, welche Gnd und +5V aus der zweiten 2x5-poligen Buchse des Controlports bezogen hat. Von den anderen 8 Pins des Controlports werden nur 6 benötigt und zwar für die Pins 5-9 und 18 des Displays. Die Reihenfolge ist hierbei egal und muß nur entsprechend im Source angepaßt werden. Ich habe Pin 5-9 des Displays an Pin 2-6 des Controlports und Pin 18 an Pin 7 gelegt. Die Pins 0 und 1 dieses Ports stehen also für beliebige Erweiterungen noch zur Verfügung. Man sollte dafür dann auch gleich noch 2 Drähte in die Buchse legen, da ein späteres Hinzufügen nicht ohne Zerstörung der Plastikbuchse mgl. ist.
Somit ist die Schaltung fertig, man muß lediglich die Portbuchsen auf die entsprechenden Steckerleisten stecken und kann mit dem Testen beginnen.

Bei Bedarf (andere Hardware) müßten im unten aufgeführten Quelltext folgende Parameter angepaßt werden:
  • Controllertyp (ATMega8515, unproblematisch durch andere 40-Füßer ersetzbar)
  • Quarzfrequenz (4 MHz)
  • Displayauflösung bzw. Controllertyp (128x64, T6963c)
  • PortA (Datenport für Display)
  • PortB (8x LED)
  • PortC (Controlport für Display, auch auf Reihenfolge der Leitungen achten!)
  • PortD (8x Taster)
Weiterhin sollte die Spannungsversorgung beobachtet werden, das Display hat einen recht beachtlichen Strombedarf, der zur restlichen Schaltung hinzukommt! Da bei mir der 7805er Regler sehr heiß wurde, habe ich diesen etwas vom Board abgehoben, um die durch die Platine bedingte Wärmedämmung zu reduzieren. Außerdem setzte ich noch einen kleinen Kühlkörper auf den sehr heißen Glättungselko.

Software

Programmieren der AVR RISC Mikrocontroller mit BASCOM-AVR, Claus Kühnel Die Software wurde in Bascom geschrieben, einem Basiccompiler, den es für verschiedene Mikrocontrollertypen gibt. Eine auf 4 kByte Flashspeichernutzung beschränkte Demoversion kann man sich kostenfrei beim Hersteller MCS Electronics mcselec.com herunterladen. Der Compiler ist etwas eigenwillig, trotz allem ist er für viele Projekte hervorragend geeignet. Evtl. schreibe ich irgendwann noch eine kleine Einführung in diese Sprache und die kleinen Tücken des Compilers, vorerst empfehle ich hier nur das Durcharbeiten des vorgestellten Sourcecodes und die ausgiebige Nutzung der Bascom-Hilfe. Gerade kleine Beispielprogramme wie das hier vorgestellte, kann man sich bei fleißiger Nutzung des Hilfesystems zu großen Teilen per Copy&Paste zusammenbauen ... Sehr empfehlenswert sowohl für den Einstieg als auch weitergehende Dinge ist das Buch "Programmieren der AVR RISC Mikrocontroller mit BASCOM-AVR" Programmieren ... mit BASCOM-AVR bei Buch24.de von Claus Kühnel.
Ein Hinweis noch: die Parameter von "Config Graphlcd" müssen alle in einer Zeile stehen, ich habe nur um das vertikale Scrolling in dieser Seite zu verhindern, einen Zeilenumbruch eingefügt.
'Programm nutzt 128x64-Pixel-Display für Ausgaben
$regfile = "m8515.dat"
$crystal = 4000000
$baud = 9600
Config Portb = Output                                       'LEDs
Config Portd = Input                                        'Taster
Config Graphlcd = 128 * 64 , Dataport = Porta , Controlport = Portc , Wr = 2 ,
Rd = 3 , Ce = 4 , Cd = 5 , Reset = 6 , Fs = 7 , Mode = 6       'PortA/C für LCD
Dim A As Byte , B As Byte , D As Byte

Cls
Gosub Textout
Gosub Lineout
Waitms 200
Showpic 0 , 0 , Prote
Waitms 200
Cls Text
Waitms 200
Cursor Off

Do
 B = B + 1
 Portb = B
 D = 128 * Pind.7
 A = 64 * Pind.6
 D = D + A
 A = 32 * Pind.5
 D = D + A
 A = 16 * Pind.4
 D = D + A
 A = 8 * Pind.3
 D = D + A
 A = 4 * Pind.2
 D = D + A
' A = 2 * Pind.1         'weggelassen, da Taster defekt ;)
' D = D + A
 D = D + Pind.0

 If D = 1 Then Cls
 If D = 4 Then Gosub Textout
 If D = 5 Then Cls Text
 If D = 8 Then Gosub Lineout
 If D = 9 Then Cls Graph
 If D = 16 Then Showpic 0 , 0 , Prote
 If D = 32 Then
  Pset 0 , 0 , 1
  Pset 0 , 5 , 10
  Pset 0 , 10 , 255
  Pset 0 , 15 , 1
 End If
 If D = 64 Then
  Pset 1 , 0 , 1
  Pset 1 , 5 , 1
  Pset 1 , 10 , 1
  Pset 1 , 15 , 1
 End If
 If D = 128 Then
  Pset 124 , 0 , 1
  Pset 125 , 5 , 1
  Pset 126 , 10 , 1
  Pset 127 , 15 , 1
 End If
' If D = 48 Then Display On     'funzt beim DG12864-12 nicht -> µC macht Reset
' If D = 96 Then Display Off

 Locate 8 , 1 : Lcd "PortB=" : Lcd B : Lcd "  "
 Locate 8 , 12 : Lcd "PortD=" : Lcd D : Lcd "  "
 Waitms 200
Loop

End                                                         'end program

Textout:
 Locate 1 , 1 : Lcd "ATMega8515@4MHz"
 Locate 2 , 1 : Lcd "gLCD 128x64 T6963c"
 Locate 3 , 1 : Lcd "PortD belegt: 1,4,5,"
 Locate 4 , 1 : Lcd " 8,9,16,32,64,128"
 Return

Lineout:
 Line(0 , 26) -(127 , 26) , 1
 Line(0 , 29) -(126 , 29) , 255
 Line(0 , 32) -(125 , 32) , 1
 Line(1 , 35) -(125 , 35) , 1
 Return

Prote:                                                      'das pic ...
 $bgf "prote.bgf"
Bei der Grafik ist man auf 2 Farben beschränkt. Bascom enthält einen Converter in dieses mir zuvor nicht bekannte bgf-Format. Wer für erste Tests keine eigene Grafik erstellen möchte, kann auch mit meiner Testgrafik experimentieren.

Ergebnis

Einen Teil der Testausgaben kann man in dem oben verlinkten Foto schwach erkennen.
  • Schriftgröße 8x8 ist besser lesbar, dafür aber nur 128/8=16 Zeichen pro Zeile, deshalb von mir nicht verwendet
  • bei 6x8-Font Ausgabefehler (Spalte 1 um 1 Zeile nach oben verschoben in Spalte 126 sichtbar, selbiges für die Spalten 2 und 127)