Pfad: Home => AVR-Übersicht => Anwendungen => ATtiny mit Quarz => Sekundengeber   This page in English: Flag EN Logo
Tiny XTAL oscillator 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

1-Sekunden-Takt mit Quarz und ATtiny25 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

Quarzauswahl für Sekunden-Oszillator 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:
  1. 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.
  2. Nun wird die CKDIV8-Fuse gelöscht.

    Löschen der DIV8-Fuse

    Nun blinkt die Minuten-LED acht Mal schneller.
  3. Nun kann die Fuse für den externen Low-Frequency-Quarz gesetzt werden.

    Setzen der Quarz-Fuse

    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.

Die Ports nach dem Init Das sind die drei Ports nach dem Initiieren: alle sind Ausgang und alle sind auf Low.

Der Timer beim ersten Compare-Match-Interrupt
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.

Zeiten beim ersten Compare-Match
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.

Erster Port-Pin-Wechsel Mit der nächsten Instruktion, SBI PINB,0, wechselt die Polarität des Port-Pins PB0. Erster Port-Pin-Wechsel in der Scope-Ansicht Und auch das Scope hat den Wechsel schon bemerkt.

Und die nächste Instruktion verringert noch die Anzahl an Halb-Sekunden.

Zweiter Port-Pin-Wechsel Zweiter Port-Pin-Wechsel in der Scope-Ansicht 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.

Dritter Port-Pin-Wechsel Dritter Port-Pin-Wechsel in der Scope-Ansicht Das ändert sich erst mit dem dritten Wechsel: erwartungsgemäß ist die Frequenz 1,000 Hz und die Pulsweite 50%.

30 Port-Pin-Wechsel in der Scope-Ansicht Nach ganzen 30 solcher Wechsel bequemt sich auch der Minutenausgang auf Eins.

60 Port-Pin-Wechsel Nach 60 Sekunden ist die Minute komplett.

Bilder und Video vom Gerät

Hier geht's zum Video.

Bild vom Sekundenquarz 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.

Bild vom Sekundenquarz mit LEDs Um zu kontrollieren, dass das Ganze funktioniert, habe ich ein paar LEDs hinzu gebaut.

6 Verwendung des Moduls

Denkbar ist vieles mit dieser Hardware.

Schaltbild einer CMOS-Uhr 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.

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