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.
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.Ä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)Bauteil | Bestellnummer | Menge | Einzelpreis | Gesamtpreis |
Widerstand 68R | SMD 1/4W 68 | 8 | 0,10 € | 0,80 € |
Widerstand 1k | SMD 1/4W 1,0k | 5 | 0,10 € | 0,50 € |
Widerstand 10k | SMD 1/4W 10k | 1 | 0,10 € | 0,10 € |
Kerko 22p | NPO-G1206 22P | 2 | 0,05 € | 0,10 € |
Kerko 100n | X7R-G1206 100N | 2 | 0,05 € | 0,10 € |
Quarz 14,7456MHz | 14,7456-HC49U-S | 1 | 0,18 € | 0,18 € |
Transistor BCX 19 | BCX 19 SMD | 5 | 0,07 € | 0,35 € |
Controller AtTiny2313 | ATTINY 2313 SO | 1 | 1,05 € | 1,05 € |
Stiftleiste | SL 2X10G 2,54 | 1 | 0,07 € | 0,07 € |
Kontaktbuchse | SPL 20 | 1 | 0,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.
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
' ****************************************************** ' * 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.Download: dotmatrix.exe