Anwendungen von
AVR-Einchip-Prozessoren AT90S, ATtiny, ATmega und ATxmega Sekundenimpulse mit ATtiny und Quarz
ATtiny macht Sekunden, Minuten und Stunden mit Quarz
Fast jeder ATtiny oder ATmega kann mit einem externen Quarz getaktet
werden und liefert dann recht exakte Zeiten. Hier ist eine einfache
Schaltung beschrieben, die Sekunden-, Minuten- und Stundensignale
an den drei freien Ausgängen eines ATtiny25 erzeugt.
1 Schaltbild des Taktgenerators
Das ist dasselbe wie in tinyquarz.html
schon beschrieben, nur hat der ATtiny25 jetzt drei Ausgänge,
an denen die Sekunden, die Minuten und die Stunden ausgegeben werden.
Alle drei Ausgänge haben 50% Pulsweite, d.h. der Sekundenausgang
wechselt alle 0,5 Sekunden, der Minutenausgang alle 30 Sekunden
und der Stundenausgang alle 30 Minuten seine Polarität.
2 Auswahl des Quarzes
Um die geeignete Quarzfrequenz herauszufinden und das Schreiben des Programms
zu vereinfachen, gibt es in der LibreOffice-Calc-Datei
hier das Blatt "quarze_tc0".
Hier kann man aus allen handelsüblichen Quarzen (und üblichen
AVR-Taktfrequenzen) eine auswählen und erhält dafür die
nötigen Infos, die zum Einstellen des Timer/Counters TC0 nötig
sind.
Ausgewählt ist hier ein Uhrenquarz mit 32,768 kHz. Den gibt es im
6*2mm-Rundgehäuse. Seinen Vorteiler stellen wir auf 256 ein, seinen
CTC-Teiler auf 64 (Compare-A-Wert: 63). Dann kriegen wir direkt und ohne
weiteren Software-Teiler alle 0,5 Sekunden lang einen Interrupt.
Der muss einfach die Polarität des Sekundenausganges wechseln, indem
eine Eins auf den PINB-Port 0 geschrieben wird.
Bei den anderen hier abgebildeten Quarzen ist ein zusätzlicher
Software-Teiler nötig. Der kann entweder 8-bittig oder 16-bittig
sein (bei höheren Frequenzen oder wenn nur ein niedrigerer Vorteiler
passend ist). Entsprechend muss der Software-Zähler entweder 8- oder
16-bittig abwärts gezählt werden. Nur wenn der Zähler Null
erreicht, wird das Umkehren des Bits ausgeführt und der Zähler
neu gestartet.
Die Parameter clock, cPresc8, cPrescBits8,
cCtcDiv8, cCompA8 und cSoftCnt8 für die
ausgewählte Taktfrequenz können mit der Maus markiert, mit
Strg-C kopiert und mit Strg-V in den Assembler-Quellcode eingefügt
werden.
Wie man an der Tabelle sieht, kann man nahezu beliebige Quarze verwenden.
Nur ein paar ganz wenige mit exotischen Frequenzen sind ungeeignet.
Um die Belastung des Controllers durch die Interrupts zu minimieren, sind
die Vorteilerwerte und die CTC-Werte in der Tabelle maximiert. Nur wenn
höhere Vorteilerwerte keine ganzzahligen CTC-Werte liefern, sind sie
herabgesetzt. Der Schlafanteil des Controllers liegt in jedem Fall bei
99,0% und höher, der Strombedarf ist daher minimal.
Wer statt des TC0 den TC2 verwenden will, den es in vielen Tiny- und
Mega-Typen noch zusätzlich gibt: der hat ein paar zusätzliche
Vorteilerwerte parat und bei einigen Quarzen kommt man damit auf höhere
Werte.
3 Assembler-Software
Die Software kann im Assembler-Quellcode hier
heruntergeladen oder im Webbrowser hier
angeschaut werden. Um alle Möglichkeiten voll ausschöpfen zu
können, sind viele .if/.endif verbaut. Die braucht man nur, wenn man
einen Quarz einsetzen will, der einen Acht- oder 16-Bit-Teiler benötigt.
Mit dem Uhrenquarz mit 32,768 kHz braucht man die alle nicht. Dafür
muss der verwendete AVR-Brenner und die verwendete Brenner-Software
Taktfrequenzen bis herunter auf 8 kHz beherrschen, was nicht jeder so
einfach kann.
Beim Brennen der Fuses gibt es beim 32kHz-Betrieb einiges zu beachten:
Da sich das ATMEL Studio 4.19 aus unerfindlichen Gründen weigern
wird, Flashes mit weniger als 5kHz Takt zu bechreiben, wird das Programm
mit den Einstellungen für 32kHz VOR der Umstellung der Fuses
assembliert und die Hexdatei mittels ISP auf den Flash geschrieben.
Die Sekunden-LED (sofern eine angeschlossen ist) ist jetzt scheinbar
dauernd an und die Minuten-LED blinkt.
Nun wird die CKDIV8-Fuse gelöscht.
Nun blinkt die Minuten-LED acht Mal schneller.
Nun kann die Fuse für den externen Low-Frequency-Quarz gesetzt
werden.
Nun blinkt die Sekunen-LED und die beiden anderen sind bis auf Weiteres
aus.
Will man das Programm ändern, macht man das Ganze rückwärts:
zuerst auf den internen RC-Oszillator umstellen, das Programm brennen und
dann wieder die Quarz-Fuse setzen.
4 Simulation der Software
Simuliert wird mit avr_sim.
Zunächst der schon beschriebene 32kHz-Quarz.
Das sind die drei Ports nach dem Initiieren: alle sind Ausgang und alle sind
auf Low.
Man beachte, dass der Vorteiler im Zähler schon bei sechs steht. Das sind
die Takte, die für die Auslösung des Interrupts und den Sprung aus
der Vektortabelle in die Service-Routine nötig sind. Die nachfolgenden
Zeiten sind entsprechend dieser Extra-Takte verschoben.
Man beachte, dass der Minutenzähler in R17 auf 60 steht. Das heißt,
dass nach 60-Halbsekunden-Interrupts, also nach 30 Sekunden, der Minutenausgang
torkeln soll. Ähnlich der Stundenzähler in R18: nach 60-Halbminuten,
also nach 30 Minuten geht der Stundenausgang auf Eins.
Mit der nächsten Instruktion, SBI PINB,0, wechselt die Polarität
des Port-Pins PB0.
Und auch das Scope hat den Wechsel schon bemerkt.
Und die nächste Instruktion verringert noch die Anzahl an Halb-Sekunden.
Zu Beginn des nächsten Halb-Sekunden-Interrupts ist eine Sekunde vergangen.
Auch dieser Interrupt wird vom Scope bewerkt. Das Scope traut sich aber noch
nicht, aus den beiden Wechseln alleine schon eine Frequenz zu ermitteln.
Das ändert sich erst mit dem dritten Wechsel: erwartungsgemäß
ist die Frequenz 1,000 Hz und die Pulsweite 50%.
Nach ganzen 30 solcher Wechsel bequemt sich auch der Minutenausgang auf Eins.
So einfach ist die Schaltung auf einem Breadboard aufgebaut. Die ISP-Schnittstelle
ist genauso groß wie der Controller.
Der Quarz ist ein handelsüblicher 32,768kHz-Uhrenquarz.
Um zu kontrollieren, dass das Ganze funktioniert, habe ich ein paar LEDs hinzu
gebaut.
6 Verwendung des Moduls
Denkbar ist vieles mit dieser Hardware.
Aber bevor Du jetzt auf die Idee kommst, mit dem Teil hier eine CMOS-Digitaluhr
anzutreiben: das geht zwar, Du musst einfach nur zwei 60-er-Zähler und
einen 24-Zähler an die drei Ausgänge anschließen. Aber: damit
die Uhr dann korrekt abläuft, müssen die Zähler zu Beginn auf
eine definierte Uhrzeit eingestellt werden, z. B. auf 12:00:00, was mit
vier rücksetzbaren und zwei setzbaren Zählern ("presettable")
ginge. Und die Sechser- und 24-er-Erkennungsmimik erfordert auch noch das eine
oder andere Gatter.
Besser ist es dann, die ganze Uhr mittels eines größeren AVR zu
realisieren, und direkt die Siebensegmentanzeigen mit Multiplex vom AVR aus
anzusteueren. Oder man nimmt einen ATtiny24 und schließt eine stromsparende
LCD-Anzeige, z. B. mit 8 Zeichen, an. Die Hintergrundbeleuchtung kommt mit
einem Bruchteil des Stromverbrauchs einer Siebensegment-Anzeige aus.
Und wie man dazu den Halbsekunden-Interrupt auf ganze Sekunden umstellt,
dürfte auch eine bewältigbare Aufgabenstellung sein.