13.11.2. Asynchroner Betrieb von Timer/Counter2
Wenn der Timer/Counter2 im asynchronen Modus betrieben wird, sind einige Dinge zu beachten:
• Ein Umschalten zwischen dem synchronen und dem asynchronen Modus wird den Inhalt der Register TCNT2, OCR2 und TCCR2 zerstören. Um dies zu verhindern kann folgende sichere Vorgehensweise gewählt werden:
1. Sperren der Timer/Counter2 Interrupts durch Löschen der OCIE2 und TOIE2 Bits.
2. Wechseln der Taktquelle durch Setzen des AS2 Bits auf den neuen Wert.
3. Schreiben neuer Werte in die Register TCNT2, OCR2 und TCCR2.
4. Bei Wechsel in den asynchronen Modus: Warten bis Update Busy Flags gelöscht sind.
5. Löschen der Timer/Counter Interrupt Flags.
6. Freigeben der Interrupts wenn notwendig
• Der Oszillator ist für die Verwendung eines 32,768 kHz Uhrenquarzes optimiert. Das Anlegen eines externen Taktes an den TOSC1 Pin kann zu Fehlfunktionen des Timer/Counter2 führen. Die Frequenz des CPU Haupttaktes muss mindestens vier mal so groß sein wie die Frequenz des Oszillators.
• Wenn in die Register TCNT2, OCR2 und TCCR2 geschrieben wird, wird der Wert zunächst in die temporären Register transferiert und nach zwei positiven Flanken an TOSC1 in die Register übernommen. Man sollte keine neuen Werte schreiben, bevor nicht der Inhalt der temporären Register in das Zielregister übernommen wurde. Jedes der drei Register hat sein eigenes temporäres Register, was bedeutet, dass beispielsweise ein laufender Schreibprozess des TCNT2 durch einen Schreibvorgang in das OCR2 Register nicht gestört wird. Um zu überprüfen, ob ein Transfer in das Zielregister abgeschlossen ist, wurde das Asynchronous Status Register ASSR implementiert.
• Wenn ein Powe-save Modus eingeschaltet wird, nachdem ein Schreiben in die TCNT2, OCR2 und TCCR2 Register durchgeführt wurde, muss gewartet werden, bis der Schreibvorgang abgeschlossen ist, wenn Timer/Counter2 benutzt wird, um den Baustein aufzuwecken. Andernfalls geht die CPU in den Sleep Modus bevor die neuen Werte effektiv werden. Dies ist besonders wichtig, wenn der Output Compare 2 Interrupt zum Aufwecken des Bausteins verwendet wird, da die Output Compare Funktion ausgeschaltet wird, während in das OCR2 oder TCNT2 Register geschrieben wird. Wenn der Schreibzyklus nicht beendet wird und die CPU in den Sleep Modus geht, bevor das OCR2UB Bit wieder Null ist, wird der Baustein niemals einen Compare Match Interrupt auslösen und der Baustein demzufolge nicht aufwachen.
• Wenn der Timer/Counter2 verwendet wird, um den Baustein aus dem Power-save Modus aufzuwecken, sind einige Vorsichtsmaßnahmen notwendig, wenn wieder in einen solchen Modus gewechselt werden soll: Die Interruptlogik benötigt einen TOSC1 Taktzyklus um resetet zu werden. Wenn die Zeit zwischen dem Aufwecken und dem Wiedereintritt in den Sleep-Modus kürzer ist als ein TOSC1 Zyklus, dann wird kein Interrupt auftreten und der Baustein wird nicht aufgeweckt werden können. Wenn man im Zweifel ist, ob die Zeit vor dem Wiedereintritt in den Power-save oder Erweiterten Standby Modus ausreicht, kann der folgende Algorithmus verwendet werden, um sicherzustellen, dass TOSC1 einen Taktzyklus durchgeführt hat:
1. Schreiben eines Wertes in TCNT2, OCR2 oder TCCR2
2. Warten, bis das dazugehörige Busy-Flag auf Null geht
3. Einschalten des Power-save oder Erweiterten Standby Modus
• Wenn der asynchrone Modus ausgewählt wurde, läuft der 32,768 kHz Oszillator für Timer/Counter2 immer, außer im Power-down und im Standby Modus. Nach einem Power-on Reset oder dem Aufwachen aus dem Power-down oder im Standby Modus benötigt der Oszillator ca eine Sekunde um sich zu stabilisieren. Der Anwender ist also angehalten, mindestens eine Sekunde zuwarten, bevor der Timer/Counter2 nach dem Power-up oder dem Aufwachen aus dem Power-down oder dem Standby Modus benutzt wird. Der Inhalt aller Timer/Counter2 Register kann als ungültig betrachtet werden nach dem Aufwachen aus dem Power-down oder dem Standby Modus, aufgrund des unstabilen Taktsignals während des start-up, unabhängig davon, ob der Oszillator oder ein Taktsignal am TOSC1 Pin benutzt wird.
• Beschreibung des Aufwachens aus dem Power-save oder erweiterten Standby Modus wenn der Timer asynchron getaktet wird: Wenn eine Interruptbedingung auftritt, startet der Aufwachprozess mit dem folgenden Zyklus des Timertaktes. D.h der Timer hat mindestens schon um eins weitergezählt, bevor der Prozessor den Wert des Zählers lesen kann. Nach dem Aufwachen wird die MCU für vier Taktzyklen angehalten, führt die Interruptroutine aus und setzt die Ausführung mit dem Befehl fort, der nach dem SLEEP Befehl kommt.
• Das Lesen des TCNT2 Registers kurz nach dem Aufwachen aus dem Power-save kann zu unkorrekten Resultaten führen. Da TCNT2 durch den asynchronen TOSC Takt getaktet wird und das Lesen des TCNT2 durch ein Register erfolgt, dass mit dem internen I/O Takt synchronisiert wird. Die synchronisation wird an jeder steigenden Flanke des TOSC1 durchgeführt. Wenn das Auswachen aus dem Power-save Modus erfolgt und der I/O Takt wieder aktiv wird, wird so lange der alte Wert von TCNT2 gelesen, bis die nächste steigende Flanke des TOSC1 aufgetreten ist. Die Phase des TOSC Taktes ist nach dem Aufwachen aus dem Power-save Modus nicht vorhersehbar, weil sie von der Aufwachzeit abhängt. Es wird folgende Vorgehensweise empfohlen, um das TCNT2 auszulesen:
1. Schreiben eines Wertes in TCNT2, OCR2 oder TCCR2
2. Warten, bis das dazugehörige Busy-Flag auf Null geht
3. Lesen des TCNT2
• Im asynchronen Operationsmodus dauert die Synchronisation der Interruptflags für den asynchronen Timer drei Prozessortakte plus einen Timertakt. Der Timer hat daher mindestens um eins weiter gezählt bevor der Prozessor den Zählerwert auslesen kann, der zum Setzen des Interruptflags geführt hat. Der Output Compare Pin wechselt mit dem Timertakt und ist nicht mit dem Prozessortakt synchronisiert.