Das Dot-Matrix-Modul

Ziel dieses Projektes war es ein Display herzustellen, mit dem man eine Laufschrift darstellen kann.
Ein relativ bekanntes IC zum realisieren einer Dot-Matrix-Ansteuerung ist der MAX7219. Dieser ist allerdings relativ teuer, so dass hier ein Mikrocontroller zum Einsatz kommt. So betragen die Gesamtkosten eines kompletten Moduls inklusive LED-Matrix weniger als ein einzelner MAX7219. Die Module sind so programmiert, dass sie endlos kaskadierbar sind wenn die Spannungsversorgung einen entsprechenden Strom liefern kann. Die Platine wurde so klein gehalten, dass sie hinter das LED-Modul passt. Zur Kaskadierung wird einfach der Ausgang(TX) eines Moduls an den Eingang(RX) des folgenden Moduls angeschlossen. (Die Module werden von rechts nach links gezählt.)


Schaltplan

Die Steuerung übernimmt ein Atmel AtTiny2313 bei dem jeder einzelne Anschlusspin genutzt wird. Wie man im Schaltplan erkennen kann, wird das Display im Multiplex betrieben. Im Moment ist sind die Controller für Spaltenmultiplex programmiert, d.h. es sind maximal acht Leds einer Spalte gleichzeitig aktiv. Durch Umprogrammierung ist allerdings auch ohne Weiteres ein Zeilenmultiplex möglich.

Schaltplan

Platine

Die Platine wurde mit dem Layoutprogramm EAGLE erstellt. Mit dem, für die private Nutzung kostenfreien, ULP von www.matwei.de ist es möglich 3D-Bilder der Platine zu erzeugen. Dieses ULP erzeugt eine Datei, welche mit dem ebenfalls kostenfreien Programm POV-Ray in ein 3D-Bild gerendert werden kann.

Leiterseite Bestückungsseite

Ätzvorlage für 6 Platinen auf einer Europakarte
(Achtung: Diese ist bereits gespiegelt, sodass sie direkt auf eine Folie gedruckt werden kann!!!)

Bauteilliste

(Reichelt Preise Stand: 31.01.2010)
BauteilBestellnummerMengeEinzelpreisGesamtpreis
Widerstand 68RSMD 1/4W 6880,10 €0,80 €
Widerstand 1kSMD 1/4W 1,0k50,10 €0,50 €
Widerstand 10kSMD 1/4W 10k10,10 €0,10 €
Kerko 22pNPO-G1206 22P20,05 €0,10 €
Kerko 100nX7R-G1206 100N20,05 €0,10 €
Quarz 14,7456MHz14,7456-HC49U-S10,18 €0,18 €
Transistor BCX 19BCX 19 SMD50,07 €0,35 €
Controller AtTiny2313ATTINY 2313 SO11,05 €1,05 €
StiftleisteSL 2X10G 2,5410,07 €0,07 €
KontaktbuchseSPL 2010,34 €0,34 €
Summe:3,59 €

Dazu kommen noch das Dot-Matrix Modul und ein paar Drähte.
Das Modul gab es vor einiger Zeit bei Pollin, wird aber anscheinend nicht mehr angeboten.


Bestückung

Auf der Kupfer abgewandten Seite sind zwei Drahtbrücken und das Quartz (8Mhz) angebracht.
Die ISP-Schnittstelle wird, auch wenn ungewöhnlich, auf der Leiterseite aufgelötet (siehe Bild oben).
Damit man das Dot-Matrix Modul auch mal wechseln kann, wurde es nicht direkt eingelötet, sondern über Kontaktbuchsen eingesteckt.

Bestückungshilfe


Programmierung

Um neue Programme schnell in den Controller programmieren zu können, wurde eine ISP-Schnittstelle mit der Atmel-Standardbelegung auf die Platine integriert. Das Programm wurde mit dem Compiler BASCOM-AVR geschrieben. Die Demoversion hat lediglich die Einschränkung, dass der erzeugte Code maximal 2kB groß sein darf.

Quellcode: (Syntax highlighted mit
G
e
S
H
i
mit Anpassungen für BascomAVR von mir)
      '     ******************************************************
      '     *     5*8 Dot Matrix Multiplexing mit AtTiny2313     *
      '     *           Ein- und Weitergabe über UART            *
      '     *               © by Stefan Weigert                  *
      '     ******************************************************
 
      '     Belegung:   PortB.0 bis PortB.7 Zeilen-Dots mit Vorwiderstand
      '                 Portd.2 bis Portd.6 auf Spalten-Transistoren mit Basisvorwiderstand
      '                 PortA.1 und PortA.2 Quarz mit je 22pF
      '                 PortA.2 Resetschaltung
      '                 PortD.0 RX der UART
      '                 PortD.1 TX der UART
 
 
      $regfile = "attiny2313.dat"                           'Controller festlegen
      $crystal = 14745600                                   'Taktfrequenz in Hz vorgeben
      $baud = 9600                                          'Baudrate festlegen
 
      On Urxc Datenempfang                                  'Bei Empfang eines Asciizeichens über UART zur ISR Datenempfang springen
      Enable Urxc                                           'Interrupt freischalten
 
      Ddrb = &B11111111                                     'PortB.0 bis PortB.7 = Ausgänge
      Ddrd = &B1111110                                      'PortD.0 = Eingang PortD.1 bis PortD.6 = Ausgänge
 
      Dim Spaltenwert(5) As Byte                            'Array definieren (Spaltenwert(1) bis Spaltenwert(5)
      Dim Spalte As Byte                                    'Variable Spalte definieren
      Dim Pinoffset As Byte                                 'Variable Pinoffset definieren
                                                               ' (nötig da die Spalten nicht beginnend von PortD.1 angeschlossen sind
      Dim N As Byte
      Dim M As Word
 
Startanimation:
 
      For N = 1 To 128
         Portb = N
         For M = 0 To 400
            For Spalte = 2 To 6
               Portd.spalte = 1
               Waitus 50
               Portd.spalte = 0
            Next Spalte
         Next M
         N = N * 2
         N = N - 1
      Next N
 
      For N = 128 To 1 Step -1
         Portb = N
         For M = 0 To 400
            For Spalte = 2 To 6
               Portd.spalte = 1
               Waitus 50
               Portd.spalte = 0
            Next Spalte
         Next M
         N = N / 2
         N = N + 1
      Next N
 
      Waitms 200
 
      For N = 1 To 5
         Spaltenwert(n) = 255
         Spaltenwert(n -1) = 0
         For M = 0 To 400
            For Spalte = 1 To 5
               Pinoffset = Spalte + 1
               Portb = Spaltenwert(spalte)
               Portd.pinoffset = 1
               Waitus 50
               Portd.pinoffset = 0
            Next Spalte
         Next M
      Next N
 
      For N = 5 To 1 Step -1
         Spaltenwert(n) = 255
         Spaltenwert(n + 1) = 0
         For M = 0 To 400
            For Spalte = 1 To 5
               Pinoffset = Spalte + 1
               Portb = Spaltenwert(spalte)
               Portd.pinoffset = 1
               Waitus 50
               Portd.pinoffset = 0
            Next Spalte
         Next M
      Next N
 
      Waitms 500
 
      Portb = 255
      For M = 0 To 4000
         For Spalte = 2 To 6
            Portd.spalte = 1
            Waitus 50
            Portd.spalte = 0
         Next Spalte
      Next M
 
 
Initialisierung:
      While Ischarwaiting() = 1                             'Uart-Puffer definiert löschen
         Spaltenwert(1) = Inkey()
      Wend
 
      For Spalte = 1 To 5                                   '5mal durchlaufen
         Spaltenwert(spalte) = 0                            'und die Spaltenwerte definiert auf 0 gesetzt
      Next Spalte
 
      Enable Interrupts
 
 
Hauptprogramm:
      Do                                                    'Anfang der Endlosschleife
         For Spalte = 1 To 5                                'Multiplexroutine
            Pinoffset = Spalte + 1
            Portb = Spaltenwert(spalte)                     'Asciiwert wird an PortB (Zeilen-Dots) ausgegeben
            Portd.pinoffset = 1                             'passende Spalte wird eingeschaltet
            Waitus 50                                       'Anzeigedauer pro Spalte=50µs bei 5Spalten T=250µs -> ca. 4kHz Bildwiederholfrequenz
            Portd.pinoffset = 0                             'Spalte wird ausgeschaltet
         Next Spalte                                        'nächste Spalte
      Loop                                                  'Ende der Endlosschleife
 
 
Datenempfang:
      Print Chr(spaltenwert(5));                            'der linke Spaltenwert an den nächsten Controller als Asciiwert übergeben (nach links)
      Spaltenwert(5) = Spaltenwert(4)                       'und die schon vorhanden Asciiwerte auf der Anzeige nach links verschoben
      Spaltenwert(4) = Spaltenwert(3)
      Spaltenwert(3) = Spaltenwert(2)
      Spaltenwert(2) = Spaltenwert(1)
      Spaltenwert(1) = Inkey()                              'die ganz rechte Spalte bekommt den neuen Asciiwert
   Return

Das brennfähige Compilat gibt es hier.

Ansteuerung

Für die Ansteuerung wurde ein Terminalprogramm mit Delphi geschrieben, welches einen maximal 1000 Zeichen langen Text an das Display senden kann. Das Programm wandelt die Zeichen in eine 8x5 Matrix um, und sendet die so umgewandelten Zeichen über eine auswählbare RS232 Schnittstelle. Um den Mikrocontroller ansteuern zu können, muss das RS232-Signal natürlich noch auf einen TTL-Pegel gebracht werden. Hier bietet sich ein MAX232 mit Standardbeschaltung an.

Screenshot

Download: dotmatrix.exe