Datumsanzeige mit DCF 77 (2) – Enter the Matrix

Die Schaltung des Funkkalenders ist ziemlich minimalistisch und besteht im wesentlichen aus dem Mikrocontroller AT Mega16 plus einigen Transistoren.

Zentrales Element der Anzeige sind die Leuchtdioden der Kalendertafel und der 7-Segment-Anzeige. Angesteuert werden diese kleinen roten Lichtquellen in einer Multiplexschaltung, d.h. die LEDs sind nicht einzeln mit einer Leitung direkt den Mikrocontroller angeschlossen, sondern in einer Matrix in Zeilen und Spalten organisiert.

image

Strom kann durch die LED jeweils in Pfeilrichtung fließen. Legt man nun eine Zeile (Row) Masse (Minus), so kann man die LEDs dieser Zeile leuchten lassen, indem man an den entsprechenden Spalten (Columns)  eine Stromquelle einschaltet.

image

Multiplex ist wie Daumenkino

Wenn man nun sehr schnell nacheinander die einzelnen Zeilen auf Masse legt (immer nur eine gleichzeitig natürlich) und die entsprechenden Spalten einschaltet, kann man mit nur 8×2 = 16 Leitungen 8^2 = 64 LEDs ansteuern.

Damit die Anzeige nicht flimmert, ist eine entsprechende Ansteuerfrequenz nötig. Meine 16 Zeilen wollte ich zuerst im 1kHz-Takt ansteuern, d.h. pro Sekunde würden die LEDs 1000/16 = 62,5 mal aufleuchten – das erwies sich aber als recht unruhig. Eine Verdoppelung auf 2kHz / 125 Hz brachte Ruhe  (eine weitere Erhöhung würde nur die Umschaltverluste erhöhen und die Schaltung ungewollt zum Mittelwellenstörsender machen).

Zeilen und Spalten

Die Spalten selbst werden direkt vom Mikrocontroller angesteuert, allerdings über einen sogenannten Vorwiderstand, der den Strom begrenzt – LEDs können nämlich gar nicht (die meisten roten) oder nur mit Einschränkungen (andere Farben) direkt an eine Spannungsquelle angeschlossen werden, weil sonst der Strom leicht viel zu hoch würde.

Das “Verbinden” der Spalten mit Masse geschieht über einen Transistor. Wenn an dessen Basis, die (auch über einen Vorwiderstand) mit dem Mikrocontroller verbunden ist, eine Spannung (über 0,7V) angelegt wird, dann schaltet der Transistor die LED (bzw. bis zu 8 LEDs einer Zeile – hier nicht abgebildet) gegen Masse.

image

So zumindest das Prinzip. In der tatsächlichen Schaltung habe ich aus Platzgründen die Transistoren und ihrer Basisvorwiderstände durch fertige ICs ersetzt. Die Wirkungsweise ist aber dieselbe.

Da der Ausgang eines Mikrocontrollers nur 20mA liefert, ergibt sich wegen des Taktverhältnisses von 1:16 eine LED-Helligkeit wie mit nur 1,25 mA Gleichstrom. Die modernen hocheffizienten Leuchtdioden liefern dabei aber (bei den 7-Segment-Anzeigen) eine durchaus ausreichende bzw. (bei den Kalender-LEDs) sogar noch eine sehr große Helligkeit.

Software

Der Mikrocontroller enthält einen Zeitgeber, der so programmiert ist, dass er das laufende Programm alle 500 Mikrosekunden unterbricht (nennt sich Interrupt) und ein spezielles kleines Programm (Interrupt-Handler) startet. Dies schaltet die Zeile um eins weiter (bzw. fängt nach der letzten wieder mit der ersten an) und die gibt für die Zeile passenden Muster für die Spalten aus. Das dauert nur wenige Mikrosekunden. Dann wird die Programmausführung an der unterbrochenen Stelle fortgesetzt. Die jeweils anzuzeigenden Muster werden direkt aus dafür bestimmten Speicherzellen gelesen und müssen natürlich von einem anderen Programmteil dort abgelegt werden.

Nicht geheim – die Kodierung

Da jede Zeile (nicht ganz zufällig) aus 8 Spalten besteht braucht man für die Darstellung der LEDs einer Zeile genau 8bit = 1Byte. Ein Byte stellt eine Zahl zwischen 0 und 255 dar. In binärer Schreibweise steht dabei jedes Bit der Zahl genau für eine LED. Bei einer “1” leuchtet die LED, bei einer “0” bleibt sie dunkel.

Im Kalenderblock hat jede Zeile nur 7 (Wochentage, Tage) oder 6 (Monate) LEDs. Das niederwertigste (unterste) Bit lässt dabei jeweils die linke LED leuchten.

image

Die obere leuchtende Zeile muss demnach mit 0000 1000 (binär) = 8 (dezimal) kodiert sein, die untere mit 0000 0010 (binär) = 2 (dezimal).

Bei den 7-Segmentanzeigen entspricht eine Spalte einem Segment einer Anzeige und eine Zeile einer “Ziffer”. Die 7 Segmente werden mit Buchstaben von a-g bezeichnet plus dem Dezimalpunkt “dp”. Das Segment “a” ist dabei dem niederwertigstem Bit zugeordnet und “dp” dem höchstwertigem.

image

Um eine Ziffer anzuzeigen, muss also ein passendes Bitmuster ausgegeben werden. Die “3.” in der Anzeige müsste also als 1100 1111 (binär) = 207 (dezimal) ausgegeben werden. Dafür legt man eine kleine Tabelle an, die für die Ziffern 0 bis 9 die entsprechenden Muster enthält und im Programm abgefragt wird.

Da sich jedes Segment einzeln ansteuern lässt, können natürlich auch andere Muster angezeigt werden. Man mag es heute kaum glauben, aber die ersten Computer haben so auch Buchstaben dargestellt – wobei man beim Lesen schon etwas Fantasie braucht Zwinkerndes Smiley

Dieser Beitrag wurde unter Mikrocontroller/Arduino abgelegt und mit , verschlagwortet. Setze ein Lesezeichen auf den Permalink.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.