Pfad: Home => AVR-DE => Anwendungen => RGB-Dünne-Berg-Uhr m16
RGB-Anzeige 15:39:13 AVR-Anwendungen

RGB-Dünne-Berg-Uhr mit ATmega16
Hardware, Aufbau, Anwendung und Software für die BCD-Uhr
Logo

RGB-Dünne-Berg-Uhr mit ATmega16

... als Kontrast zu Dicke-Tal-Uhren, hier mit Vielfarben zum Auswählen.
  1. Eigenschaften
  2. Hardware
  3. Aufbau
  4. Software
Diese Seiten als PDF (32 Seiten, 806 KB).

1 Eigenschaften der RGB-Uhr mit ATmega16

Die Hardware-Eigenschaften der beschriebenen RGB-Uhr: Ein kurzes Video mit der Uhr:



Seitenanfang Eigenschaften Hardware Aufbau Software

2 Hardware

2.1 Anzeigen-Teil

Schaltbild RGB-Anzeigenteil Dies ist der Anzeigenteil der Uhr. Er besteht aus 20 RGB-Leds mit gemeinsamer Anode und zwei 16-poligen Buchsenleisten, die den Anzeigenteil mit dem Controllerteil verbinden.

Die Ansteuerung der Leds erfolgt mit Multiplexen. Je ein Drittel der Zeit sind die Stunden-, Minuten- und Sekunden-Leds aktiviert. Dazu sind die Anoden zusammengeschaltet, sie werden von je einem PNP-Transistor auf hohes Spannungspotenzial gezogen. Jeweils für zwei LEDs ist eine Anodenleitung an der Buchsenleiste vorgesehen, um den Strom an jedem Anodenpin der Buchsenleiste auf maximal 6*20 = 120 mA zu begrenzen. Das ergibt insgesamt 11 Anodenleitungen (drei für die sechs Stunden-Anoden, je vier für die sieben Minuten- und Sekunden-Anoden.

Die drei Leds jeder Leuchtdiode sind in drei gemeinsamen Kathoden-Leitungen zusammengeführt. Die drei niedrigsten Leds der Einer-Anzeige sind miteinander verbunden und bilden die drei Signale C0R, C0G und C0B. Sie werden vom Controller auf niedriges Potenzial gezogen, wenn sie über den aktiven Multiplexzyklus an sein sollen. Sieben Dioden (vier mit den Einern, drei mit den Zehnern bei Minuten und Sekunden, zwei bei Stunden) mit je drei Farben bilden zusammen 21 gemeinsame Kathodenleitungen. Zusammen mit den elf Anodenleitungen sind 32 Pins an den beiden 16-poligen Buchsenleisten belegt.

LED-Spannungen in Abhängigkeit vom Strom Das hier sind die Spannungen der drei Leds in Durchlassrichtung bei unterschiedlichen Strömen zwischen 0,5 und 30 mA. Die Kurven verlaufen sehr unterschiedlich. Bei der roten Led ist die Spannung am niedrigsten, sie steigt mit dem Strom auch nur gering an. Die grüne Led hat bei Strömen bis 5 mA eine niedrigere Spannung als die blaue, steigt aber mit dem Strom steiler an und überholt die blaue, die weniger steil ansteigende Spannungen aufweist. Die Werte sind wegen Exemplarstreuungen ungenau.

Die Näherungsgeraden wurden aus den Spannungen bei Strömen ab 15 mA errechnet.

2.2 Prozessorteil

Schaltbild Prozessorteil Dies ist der Prozessorteil mit dem ATmega16. Er steuert mit dem I/O-Port A fünf Farbkathoden an, mit I/O-Port C weitere acht und mit I/O-Port D die letzten acht. Die Stromsteuerung der Led-Kathoden erfolgt durch Widerstände, die sich aus den unterschiedlichen Durchlassspannungen der drei Farben ergeben (siehe unten). Die Kathoden-Portpins sind aktiv niedrig.

Die Ströme durch alle Leds bei einer Multiplex-Periode summieren sich im GND-Pin des Prozessors. Um den Strom aus dem GND-Pin des ATmega16 auf die laut Datenblatt maximal zulässigen 200 mA (PDIP-Packung) zu begrenzen, wurde der Strom durch die einzelnen Leds auf 20 mA festgelegt. Bei der Darstellung der Zahl 57 sind jeweils fünf Leds eingeschaltet. Würden zur Farbkombination zwei Farben eingeschaltet, ergeben sich 10 Led-Ströme. Aus dem Maximalstrom durch den GND-Pin ergibt sich die Auslegung auf 20 mA pro Farbe. Würden hingegen alle drei Farben der Leds eingeschaltet (weiß), ergäben sich 15 zu treibende Led-Farben und der Strom müsste auf 200 mA / 15 = 13,3 mA pro Farbe einer Led begrenzt werden. Das geht auch noch, ohne dass die Leds beim Dreier-Multiplexen zu schwach werden. Die Led-Treiber-Widerstände wären dann entsprechend zu vergrößern.

Die drei Anoden werden von den drei I/O-Portpins PB0 (Stunden), PB1 (Minuten) und PB2 (Sekunden) mittels den PNP-Transistoren vom Typ BD440 angesteuert, deren Basisstrom mit Widerständen von 1K begrenzt wird. Die Anoden-Portpins sind ebenfalls aktiv low (Null = An).

Die beiden Tasten zur Zeiteinstellung sind an die Portpins PB3 und PB4 angeschlossen. Beide sind durch interne Zuschaltung der Pull-Up-Widerstände ebenfalls aktiv low.

Das Potentiometer von 100k teilt die Betriebsspannung und ist mit seinem Schleifer an den AD-Wandler-Eingangspin ADC0 angeschlossen.

An den XTAL-Pins ist ein 4 MHz-Quarz mit zwei 18 pF-Anschwingkondensatoren angeschlossen. Dieser ist per Fuse-Umstellung als Taktquelle einzuschalten (siehe unten). Es können auch andere Quarze verwendet werden, dann muss die Taktung im Quellcode in der Konstante clock entsprechend angepasst werden.

Die Portpins PB5, PB6 und PB7 bedienen die ISP6-Schnittstelle, über die der Prozessor in der Schaltung programmiert werden kann.

Anzahl Leds gleichzeitig eingeschaltet Dies ist die Anzahl an Leds, die während des Dauers einer Sekunde über einen ganzen Tag lang angeschaltet sind. Die teilweise Einschaltung durch Multiplexen reduziert diese Anzahl, so dass die maximal gleichzeitig eingeschalteten Leds bei allen Kombinationen auf 10 beschränkt bleibt.

Stromlast zwischen 23 und 24 Uhr Die Widerstände, wie sie im Schaltbild eingezeichnet sind, legen den Strom auf 20 mA pro Led-Farbe fest. Die Maximalströme durch die Leds treten am Ende des Tages, zwischen 23 und 24 Uhr auf. Das Bild zeigt die sehr unterschiedlichen Strombelastungen in diesem Zeitraum.

Maximal tritt einmalig eine Stromspitze von 173 mA über eine Sekunde lang auf (10 Leds sind gleichzeitig an). Das Datenblatt legt einen Maximalstrom durch den GND-Pin von 200 mA für die PDIP-Packung fest, die 10*20 mA bzw. die durchschnittlichen 173 mA halten diese Grenze ein.

Minutenschnitte des Stroms Für die Netzteillast sind neben dem Maximalstrom auch noch die über längere Zeiträume gemittelte Belastung wichtig, da sie die Wärmelast von Trafo und Spannungsregler bestimmen. Das Diagramm zeigt die Minutendurchschnitte über den gesamten Tag.

Im Schnitt bleiben die Minutenlasten bei unter 100 mA, nur am Stundenende treten kurzzeitig Ströme über 100 mA auf. Diese kurzzeitigen Spitzen sind für die thermische Leistung irrelevant.

2.3 Netzteil

Netzteil fuer 8x8-RGB Das Netzteil muss folgende Eigenschaften besitzen:
  1. Es muss stabile 5 V liefern, da der Strom durch die LEDs über strombegrenzende Widerstände von dieser Spannung abhängt.
  2. Da jeweils maximal 5 Leds mit maximal zwei Farben (10 Einzel-Leds) und maximal 20 mA Strom pro Led an sein können, muss es kurzzeitig einen Strom von maximal 200 mA verkraften. Bei 7,5 V Trafospannung sind das 1,5 VA, daher kommt der nächsthöhere Verfügbare, ein 3,6 VA zum Einsatz.
  3. Der Spannungsregler muss ein 7805 sein, mit maximal ca. 1 W ist ein kleiner Kühlkörper von 20 K/W ausreichend.
Im Schaltbild ist so ein Standard-Netzteil mit einem 2*7,5 V-Trafo mit seiner Dimensionierung zu sehen. Die beiden Dioden sind 1N4001.

Netzteilspannung ohne Last Das hier simuliert das dargestellte Netzteil ohne angeschlossene Last (siehe die Power-Supply-Software hier). Die Spannung am Elko bleibt ohne Last bei deutlich unter 16 V, deshalb kommen die Elkos mit einer Spannungsbelastbarkeit von 16 V aus.

Netzteilspannung bei 220 mA Maximallast Das hier ist die Netzteilspannung bei 220 mA Last, der Maximallast wührend der höchsten Multiplexphase. Es besteht ausreichend Lastreserve und der Elko ist großzügig dimensioniert.

Das Netzteil wurde mit einer Dauerlast von 280 mA getestet. Die 5V-Spannung ist absolut stabil, die Temperaturen von Trafo und 7805 bleiben im Rahmen. Erst bei größeren Strömen von über 500 mA bricht die geregelte Spannung ein.

Seitenanfang Eigenschaften Hardware Aufbau Software

3 Aufbau

Sowohl die Prozessor- als auch die Anzeigeplatine sind auf beidseitig kaschiertem Lochraster aufgebaut, damit die beiden mit den zwei Stecker-/Buchsen-Leisten umgekehrt aufeinander gesteckt werden können und die Verdrahtung der Stecker- bzw. Buchsenleiste von der Bestückungsseite her erfolgen kann.

3.1 LED-Platine

Bestückung der Anzeigeplatine Die 20 RGB-Leds sind auf einer 66*66 mm-Platine angebracht, die mit vier Schrauben M2,5 von der Innenseite des Gehäuses her die Leds in den 5 mm-Bohrungen halten.

Die vier Anschlussdrähte der Leds sind abgebogen und auf seitenversetzten Bahnen des Lochrasters angeordnet, damit die Leds seitliche Stabilität erhalten und nicht abknicken können. Die Plus-Zeichen zeigen die Mittelpunkte der 5 mm-Bohrungen auf der Frontplatte an.

Am besten baut man die Led-Platine so auf. Zunächst bohrt man die 5 mm-Bohrungen, weitet sie um etwa einen halben mm auf, damit die Leds leicht eingeführt werden können und etwas Spiel haben. Dann bohrt man auch die vier M2,5-Befestigungslöcher in die Frontplatte und befestigt darin vier M2,5x20-Schrauben. Dann steckt man eine Reihe mit 6 oder 7 Leds lose auf die Platine und führt sie mit den vier Verschraubungen in die Löcher der Frontplatte ein. Dann entfernt man überstehenden Led-Anschlussdraht und lötet die Lötstellen der sechs bzw. sieben Leds der Anzeigestelle.

Nacheinander bestückt man so Stunden-, Minuten- und Sekunden-Leds und stellt dabei sicher, dass sie in die gebohrten Löcher der Frontplatte passen. Abschließend lötet man die beiden 16-poligen Buchsenleisten von der Bestückungsseite her ein und verdrahtet die Leds gemäß Schaltplan.

Die Verdrahtung der Buchsenleiste erfolgt dabei folgendermaßen. Von der Lötseite her schiebt man einen verzinnten Kupferlackdraht durch das dem Pin benachbarte Rasterloch und knickt diesen mit der Pinzette etwa vier mm lang um 90° ab. Nach dem Einlöten des Pins lötet man den abgeknickten Draht an die Lötstelle.

3.2 Prozessor-Platine

Bestückung der Prozessorplatine Die Belegung der 65*55 mm großen Prozessorplatine mit den Komponenten zeigt das Bild.

Da die Prozessorplatine wird mit ihren 32 Steckpins auf die Led-Platine von hinten aufgesteckt wird, mit der Komponentenseite nach oben und in umgekehrter Richtung, ändert sich die Belegung und Nummerierung der Steckpins entsprechend.

Die beiden 16-poligen Steckerleisten werden nach unten hin bestückt. Dazu wird, wie bei der Anzeigenplatine auch, jeweils ein Pin festgelötet und ein am Ende verzinnter Kupferlackdraht von unten her eingeführt, die oberen vier mm des Drahts um 90° abgewinkelt und mit der Lötstelle des Pins verlötet.

Sind die Stromversorgungsleitungen, die 40-polige Fassung des ATmega16, die Led-Widerstände, die Anodentreibertransistoren und die beiden Pfostensteckerleisten bestückt und verdrahtet, kann man die Led-Platine anstecken und die korrekte Led-Verdrahtung testen, indem man auf der ATmega16-Fassung nacheinander die Anodentreiberpins 1, 2 und 3 auf GND legt und die entsprechenden Kathodenanschlusspins PA3 bis PA7, PC0 bis PC7 sowie PD0 bis PD7 ebenfalls mit GND verbindet. Die Leds 0 bis 5 (Stunden) bzw. 0 bis 6 (Minuten, Sekunden) sollten dann in der Reihenfolge blau - grün - rot leuchten.

Sind die Stromversorgung, der Quarz mit den beiden Kondensatoren, der Resetwiderstand, die ATmega16-Fassung und der ISP6-Stecker bestückt und verdrahtet, kann mit dem Programmiergerät versucht werden, die Erkennungsbits aus dem ATmega16 auszulesen und die Quarzfuse im Prozessor zu aktivieren (siehe unten). Gelingt beides, kann man den Quellcode mit eingeschaltetem High-Speed-Modus (die entsprechende Quellcode-Zeile mit cAccel auf einen höheren Wert als Eins stellen und neu assemblieren/brennen). Der geht dann mit Vielfach-Speed einen Tag durch, z. B. mit 8 in drei Stunden oder mit 64-fach-Speed in 22,5 Minuten.

Weitere in der Software vorgesehene Fehlerdiagnosen für die Hardware sind im Kapitel Software näher beschrieben.

3.3 Netzteil-Platine

Bestückung des Netzteils Das Netzteil wird auf einer 70x50 mm großen Lochrasterplatine aufgebaut.

3.4 Gehäuseeinbau

Gehäuseeinbau Dem Einbau der Einzelkomponenten in ein 150*75*45 mm großes Standard-Plastikgehäuse steht nun nichts mehr entgegen.

Gehäuseeinbau Prozessor Dank der 32 Pins der Stecker-/Buchsen sitzt die Prozessorplatine huckepack auf der Anzeigenplatine und braucht keine eigene Befestigung.

Nicht vergessen: Unter dem 7805-Kühlkörper und über dem Trafo müssen noch Lüftungslöcher in das Gehäuse gebohrt werden, damit die heißen Teile Luft kriegen.

3.5 Gehäusebeschriftung

Die Vorderseite des Gehäuses kriegt noch eine passende Beschriftung, die Rückseite ein Typenschild. Entsprechende Vorschläge finden sich in der Open-Office-Grafikdatei, die auch alle Schaltbilder und Layouts enthält.


Seitenanfang Eigenschaften Hardware Aufbau Software

4 Software

4.1 Downloads

Die Software gibt es hier im Assembler-Format und hier zum Anschauen im Browser.

Zu der Uhr gibt es noch folgende zusätzliche Dokumente zum Download:

4.2 Assemblieren des Quellcodes

Vor dem Assemblieren sollte noch einmal kontrolliert werden, dass im Quellcode keine Debugging-Schalter gesetzt sind (siehe unten).

Zum Assemblieren wird ein Assembler benötigt, der .IF-Direktiven beherrscht. Der ATMEL-Assembler 2 beherrscht das. Wer sich scheut, 900 MB ATMEL-Studio-Software herunterzuladen und zu installieren oder wer kein Windows-Betriebssystem hat, ist mit meinem Assembler gavrasm besser und einfacher bedient. Wie damit mit einem 64-Bit-Betriebssystem assembliert wird, findet sich für Windows hier und für Linux hier. Wer ein ganz anderes Betriebssystem (32-Bit, Mac-OS, etc.) hat, kann sich den Quellcode von gavrasm herunterladen und mit Free Pascal was Eigenes selbst kompilieren.

Der assemblierte Maschinencode sollte nach dem Assemblieren als .hex-Datei im gleichen Verzeichnis herumliegen.

4.3 Flashen, Fuses

Der Hexcode muss dann in den Flashspeicher des ATmega16 geschrieben werden. Das geht mit einem AVR-Brenner und der entsprechenden Software.

Fuses ATmega16 Werkseinstellung Fuses ATmega16 für Quarz und JTAG aus Vor oder nach dem Flashen müssen noch die Fuses des ATmega16 geändert werden, sonst läuft die Uhr im 96-Stunden-Modus und ein Led-Bit geht nicht. Die entsprechenden Fuses sind im rechten Bild markiert.

4.4 Funktionsweise der Software

Die folgenden Einzelkapitel stellen die grundlegenden Funktionen der Software dar.

4.4.1 Hardware-Diagnosen

Als Hilfe bei der Inbetriebnahme der Uhr können die folgenden Diagnosehilfen benutzt werden. Sie werden eingestellt, indem im Kopf der Quelldatei die entsprechenden Konstanten mit Yes versehen werden. Dabei macht es wenig Sinn, gleichzeitig mehrere Optionen anzuschalten, da sich diese teilweise gegenseitig ausschließen. Nach der Änderung jeweils neu assemblieren und die Flashdatei brennen.
  1. "cAccel": Mit diesem Parameter kann die Uhr um den Faktor N beschleunigt werden. Mit N = 8 achtfach, mit N = 100 hundertfach, mit 144 der Tag im Schnelldurchlauf in 10 Minuten.
  2. "dbg_leds": Nacheinander werden alle Leds in der Reihenfolge jeweils für eine Sekunde lang eingeschaltet. Damit können falsch verdrahtete Leds festgestellt werden.
  3. "dbg_adc": Der gemessene ADC-Wert wird als Stunde zwischen 0 und 23 dargestellt. Das zeigt an, ob das Poti korrekt funktioniert und richtig herum angeschlossen ist.
  4. "dbg_key": Wenn Tasten gedrückt sind, gehen die roten Leds Stunden-Zehner (Taste 1) bzw. Stunden-Zwanziger (Taste 2) an.

    Taste 1 gedrückt Taste 2 gedrückt Ist keine der Tasten gedrückt, bleiben alle Leds dunkel.
  5. "dbg_moni_xxx": Die Inhalte des Registers xxx werden an den Sekunden-Leds ausgegeben.
  6. "dbg_colbal": Schnell nacheinander werden alle Leds auf weiß eingestellt, jeweils nur eine der 20 Lampen ist eingeschaltet.

    Weissabgleich Die Lampen sollten alle etwa gleich weiß leuchten.
Für die endgültige Version müssen alle Schalter wieder auf No und cAccel=1 umgestellt und neu assembliert werden.

4.4.2 Zeitsteuerung

Die Zeitsteuerung funktioniert folgendermaßen. Der quarzgesteuerte Takt von 4 MHz wird im Timer/Counter 1 durch 16.000 geteilt (Prescaler = 1, 15.999 im Compare-Port A). Daraus ergibt sich eine Frequenz von 250 Hz, mit der der Compare-Match-A-Interrupt ausgelöst wird. Das Register rDivSec zählt von 250 an abwärts. Erreicht es Null, wird die Flagge bSec gesetzt, ihre Behandlung erfolgt außerhalb des Interrupts.

Ferner werden mit jedem Compare-Match-A-Interrupt die Stunden-, Minuten- und Sekunden-Bits der Led-Kathoden an den Multiplex-Ports ausgegeben und der entsprechende Anodentreiber eingeschaltet. Ist die Uhr im Zeit-Einstellmodus, wird statt der Uhrzeit die eingestellte Zeit ausgegeben und die aktive Stelle (Stunde, Minute oder Sekunde) blinkt im Sekundenrhythmus mit voreingestellter Impulsdauer (Konstante BlinkPeriod).

Außerhalb des Interrupts bewirkt die gesetzte Sekundenflagge bSec, dass die Zeit um eine Sekunde erhöht wird. Die Zeit wird in binärer Form in den Registern rHour, rMinute und rSecond gehandhabt. Mehr zum Handling von Datum und Uhrzeit mit AVRs findet sich übrigens hier.

Die Werte für die drei Kathodenports und dem Anodenport liegen in einem Puffer ab sRgb im SRAM. Die Ausgabe erfolgt reihum mit dem Zeigerregister Y (YH:YL), ist das Ende des Puffers erreicht beginnt Y wieder am Anfang. Die Umwandlung der binären Zeit in Led-Kathoden-Bits ist hier beschrieben.

4.4.3 AD-Wandler-Steuerung als weitere Taktquelle

Unabhängig von diesem Timer erfolgt die Ermittlung des Potentiometerwertes durch den AD-Wandler. Dieser wird mit 4 MHz / 32 = 125 kHz getaktet. Er benötigt 13 Takte pro Wandlung. Der gemessene Wert wird im Registerpaar rAdcH:rAdcL aufsummiert, bis 64 Messungen erfolgt sind (Zähler in rAdcCnt). Dann wird das MSB der Messwertsumme in das Register rAdcRes kopiert und die Flagge bAdc gesetzt, deren weitere Behandlung außerhalb des ADC-Complete-Interrupts erfolgt. Dies ist mit einer Frequenz von 4.000.000 / 32 / 13 / 64 = 150,24 Hz der Fall, so dass alle 6,656 ms die Flagge erscheint.

Die Taktung ist allerdings etwas ungenauer als beim TC1-CTC, da zwischen dem AD-Complete-Interrupt und dem Neustart des AD-Wandlers durch die zwischenzeitlich ausgeführten Instruktionen der Interrupt-Service-Routine etwas Verzögerung eintritt.

Die Flagge bAdc bewirkt die Helligkeitsregelung und die Tastensteuerung zur Einstellung der Zeit und ist im Detail hier näher beschrieben.

4.4.4 Multiplexen

Multiplexpuffer im SRAM Damit der Multiplextakt immer die drei darzustellenden RGB-Kombinationen der Multiplex-Bits darstellen kann, sind diese im SRAM in einem 12 Byte umfassenden Puffer abgelegt. In der Reihenfolge Stunden - Minuten - Sekunden sind dazu die drei Bytes der Kathodenbits (Null = Kathode angeschaltet, Eins = Kathode ausgeschaltet) für die Ports A, C und D abgelegt. Die Leds 0 bis 3 stellen die Einer, 4 bis 6 (Stunden: 5) die Zehner-BCD-Bits dar. Die Farbzuordnung der einzelnen Bits zu den Kathoden ist jeweils in der Reihenfolge Blau - Grün - Rot angeordnet, so wie die Portbits jeweils an die RGB-Leds angeschlossen sind.

Den drei Kathodenbytes folgt jeweils das Anodenbyte für Port B. Die drei Anoden für Stunden, Minuten und Sekunden sind ebenfalls invertiert (Anode an = Null, Anode aus = Eins). Da sich diese drei Bytes nicht ändern werden sie beim Initiieren einmalig an die drei Positionen im SRAM abgelegt.

4.4.5 Umwandlung der binären Zeit in Multiplex-Bits

Farbkodierung Dies ist die Farbkodierung im Register rCol. Die drei untersten Bits sind alle Eins, wenn die Farbansteuerung abgeschaltet ist (Stunde/Minute/Sekunde = 0) oder wenn ein darzustellendes BCD-Bit Null ist. In den Stufenfolgen 6/12/18 (bei Stunden) bzw. 15/30/45 (bei Minuten und Sekunden) wechseln jeweils die Farben der Leds. Die Farbzuordnung gilt jeweils für alle sechs (Stunden) bzw. sieben (Minuten, Sekunden) Leds in gleicher Weise.

Die Farbe wird festgestellt, indem das eingelesene Byte jeweils mit dem Vergleichswert im Register rCmp verglichen wird. Dies wird zu Beginn der Umwandlung auf sechs eingestellt. Als Grundfarbe wird in rCol blau eingestellt (0b0000.0110 = 6). Ist das Zeitbyte kleiner als dieser Wert, wird diese Farbe verwendet. Wenn nicht, wird die nächste Farbe eingestellt (grün). Der Vergleichswert wird verdoppelt. Ist der Zeitwert auch größer oder gleich zu diesem Vergleichswert, wird die Farbe auf rot umgestellt. Dann wird durch Addieren der Hälfte des verdoppelten Vergleichswertes mit drei Viertel verglichen. Erreicht oder Überschreitet der Zeitwert auch diese Vergleichsschwelle, wird violett eingestellt (rot plus blau).

Die Vergleichsschwelle in rCmp wird danach für Minuten- und Sekunden-Vergleiche auf 15 eingestellt.

Umwandlung binär in BCD Um die Zeit jeweils in BCD dazustellen, müssen binäre Stunden, Minuten und Sekunden im Vielzweckregister rmp in BCD im Register rBcd umgewandelt werden. Dazu kommt der nebenstehend abgebildete Algorithmus zur Anwendung.
  1. Zunächst wird rBcd auf Minus 0x10 eingestellt, so dass sich beim ersten Addieren von -0x10 Null ergibt.
  2. Im nächsten Schritt wird -0x10 zu rBcd addiert und die höhere BCD-Ziffer um Eins erhöht (beim ersten Mal zu Null).
  3. Dann werden von der Eingangszahl in rmp 10 abgezogen. Führt dies nicht zu einem gesetzten Übertragsbit, wird der Schritt so lange wiederholt, bis es gesetzt ist.
  4. Durch Addieren von 10 zu rmp (Subtrahieren von -10) wird die letzte Subtraktion wieder rückgängig gemacht.
  5. Die BCD-Einer in rmp werden mit den BCD-Zehnern in rBcd verodert und die Umwandlung ist beendet.


Umwandlung der Farben in Multiplex-Bits So funktioniert das Zusammenstellen der Multiplex-Bits aus den Farben in rCol. Dazu wird ein Puffer in den Registern R2:R1:R0 angelegt und mit Nullen befüllt. Ein Bit-Zähler in rmp wird auf 7 eingestellt.

Dann beginnt das Einschieben der Farbbits. Dazu wird eine Kopie von rCol im Register rColCopy angelegt und drei mal links geschoben. Das in der Carry-Flagge befindliche Farbbit wird dann jeweils in die Register R2:R1:R0 von rechts her eingerollt.

In der Darstellung sind die ersten beiden Einrollvorgänge dargestellt. Sind alle sieben Einrollvorgänge absolviert, wird der Puffer in R2:R1:R0 an der aktuellen Position im Register XH:XL in das SRAM geschrieben.

Umwandlung der Binärzeit in Mux-Bits Das ist der gesamte Algorithmus der Umwandlung der binären Zeitinformation ab dem Register ZH:ZL (zeigt zu Beginn auf die Position sDisp, kann sowohl auf eine SRAM-Position als auch ein Register mit Stunden/Minuten/Sekunden zeigen).

  1. Es beginnt mit dem Einlesen des Bytes, auf das ZH:ZL zeigt.
  2. Durch Vergleich mit dem Vergleichswert in rCmp wird wie oben dargestellt der Farbwert ermittelt.
  3. Der eingelesene Zeitwert wird dann wie oben dargestellt in BCD im Regiter rBcd umgewandelt.
  4. Dann werden die sieben BCD-Bits ermittelt, als Farbbits in den Puffer R2:R1:R0 geschoben und in das SRAM kopiert. Das Addieren von 1 im Zeiger XH:XL überspringt das Anodenbyte.
  5. Sind alle drei Zeitbytes behandelt, ist der Algorithmus beendet.
Der gesamte Algorithmus benötigt bei 4 MHz Takt ca. 150 µs, also deutlich kürzer als ein Multplex-Durchgang oder auch ein AD-Wandler-Durchgang andauert.

4.4.5 Einstellung der Zeit

Ist die Flagge bAdc gesetzt, sind ca. 6,6 ms vergangen.

Algorhythmus der AD-Wandler-Steuerung Bedingt durch die vielfältigen Funktionen, die in die AD-Wandler-Flaggenbehandlung eingebunden sind, ergibt sich ein umfangreicher Algorhythmus. Noch einfach gestaltet sich der Ablauf solange die Zeiteinstellung nicht aktiv ist: das MSB der AD-Wandler-Summe (0..255) wird mit 250 multipliziert und das 16-Bit-Resultat durch vier geteilt (0..15.937). Dieser Wert wird in den Compare-B-Port des Timers TC1 geschrieben. Der Compare-B-Interrupt bewirkt bei jedem Eintreten, dass die Anodentreiber-Ausgänge vorzeitig abgeschaltet werden. Ist der Wert groß, erfolgt die Abschaltung spät im CTC-Zyklus und die Leds sind hell (z. B. 15.937 / 16.000 = 99,6% Helligkeit). Ist der Wert niedrig, sind die Leds die meiste Zeit aus (z. B. 0 = 1 / 16.000 = 0,006% Helligkeit).

Abschließend wird noch abgefragt, ob die Taste 1 gedrückt ist und die Zeiteinstellung eingeleitet werden soll. Falls ja (Eingangspin ist aktiv low), wird die Flagge bTSet aktiviert und die beiden Flaggen bTSetM, bTSetS und bTSetO gelöscht und die Eingabe von Stunden erfolgt. Das MSB der AD-Wert-Summe wird mit 24 multipliziert und dieser Stundenwert in das Eingaberegister für Stunden geschrieben. Danach wird das Prellschutz-Register rBounce auf seinen Anfangswert gesetzt. Es bewirkt, dass jeder weitere Tastendruck ignoriert wird, solange dieses nicht auf Null heruntergezählt worden ist.

Ist beim Vorliegen der MSB-Summe das Bit bTSet gesetzt, wird zunächst geprüft, ob der Prellschutzzähler auf Null steht. Ist dies nicht der Fall, werden die Tasten 1 und 2 abgefragt. Sind beide inaktiv (11, inaktiv high), wird der Zähler abwärts gezählt. Ist eine der beiden Tasten noch immer gedrückt, beginnt die Prellschutzperiode erneut von vorne.

Ist die Prellschutzperiode erfolgreich absolviert, wird das Bit rTSetO abgefragt. Dieses ist entweder gesetzt, wenn die letzte Stelle (Sekunden) fertig eingegeben ist und Taste 2 gedrückt war oder wenn die Rückwärtstaste 2 während der Eingabe der Stunden gedrückt war. In beiden Fällen war abzuwarten, bis die Tasten lange genug losgelassen wurden. Erst danach wird der Eingabemodus durch Rücksetzen des rTSet-Bits verlassen und wieder die aktuelle Zeit angezeigt.

War beim Vorliegen der AD-Wert-Summe das Bit bTSet gesetzt, der Prellschutzzähler rBounce auf Null und bTSetO nicht gesetzt, wird die Taste 1 abgefragt. Ist diese gedrückt (Eingang = 0), dann liegt ein Rückwärtsbefehl vor. Je nachdem, In jedem Fall wird nach diesem Tastendruck der Prellzähler rBounce mit seinem Startwert geladen.

War die Taste 1 nicht gedrückt, wird die Taste 2 abgefragt. Ist diese gedrückt, liegt ein Vorwärtsbefehl vor. Je nachdem, In allen Fällen wird wieder das Prellschutzregister neu gestartet.

Wenn weder Taste 1 noch Taste 2 gedrückt waren, wird im Registerpaar X die aktuelle Eingabeposition (Stunden, Minuten oder Sekunden) eingestellt und die Messwertsumme mit 24 oder 60 multipliziert. Hat sich der Wert geändert, wird er neu geschrieben, in Kathodenbits umgewandelt und angezeigt.

Nicht eingezeichnet ist der Algorhythmus, der das Time-Out der Zeiteinstellung feststellt. Dieser erfolgt mit dem Registerpaar rInpToH:rInpToL, das bei jedem Durchlauf um Eins erhöht wird. Erreicht es durch 16-Bit-Überlauf Null, wird der Eingabemodus direkt und unmittelbar beendet. Jeder Tastendruck setzt diese beiden Register auf ihren Anfangswert. Maximal kann das Timeout auf bis zu sieben Minuten eingestellt werden (Konstante InputTimeOutMinutes).

Seitenanfang Eigenschaften Hardware Aufbau Software


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

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