2.5 Timer
In diesem Abschnitt werden die Grundlagen zu Timer0, Timer1 und Timer2 behandelt. Eine tiefergehende Einführung findet dabei u.a. DIC Wahlfach statt.
2.5.1 Allgemeines
2.5.3 Timer0
Grundlagen
Timer0 ist ein 8-bit Timer/Counter, d.h. er hat insgesamt 256 Zustände (2 hoch 8 -> 0-255). Der aktuelle Zählerstand ist im Register TCNT0 gespeichert. Der Zähler wird mit einer einzustellenden Taktfrequenz betrieben. Diese wird von der CPU Frequenz mitteles eines Prescalers (dt. Vorteiler) abgeleitet. Der Prescaler kann dabei verschiedene Werte annehmen (1, 8, 64, 256, 1024). Der Prescaler wird im Register TCCR0 eingestellt. Alternativ kann der Timer auch im External Clock Source Modus betrieben werden, wobei der Takt von einem externen Signal abgeleitet wir (z.B. von einem Sensor, einer Taste, einem anderen Mikrocontroller etc.). Dies kann sowohl auf die fallende als auch auf die steigende Flanke erfolgen. Der Modus wird im Register TCCR0 eingestellt. Zudem gibt es die Möglichkeit, verschiedene Interrupts zu erzeugen (z.B. bei Überlauf des Zählers).
Der Timer kann in verschiedenen Modi betrieben werden, die im folgenden beschrieben werden.
Prescaler (Vorteiler)
TBD
Duty Cycle (Tastverhältnis)
Das Tastverhältnis (Duty Cycle) gibt das Verhältnis von High- zu Low-Zeit eines Rechtecksignals an. Es wird in Prozent angegeben und berechnet sich wie folgt:

Das Tastverhältnis kann dabei von 0% (immer Low) bis 100% (immer High) eingestellt werden.
Neben dem Tastverhältnis ist auch die Frequenz des Signals wichtig, d.h. die Wiederholungsrate des Signals. Diese gibt an, wie oft das Signal pro Sekunde wechselt.
Mit dem Tastverhältnis kann die Leistung eines Signals gesteuert werden. Diese wird z.B. bei der Ansteuerung von Motoren, LEDs oder anderen Aktoren verwendet.
Unterschied Counter (Zähler)/Timer
Timer
- Timer werden verwendet, um Zeitintervalle zu messen.
- Sie arbeiten, indem sie Taktimpulse von einer konstanten Taktquelle zählen. Die Rate, mit der diese Taktimpulse auftreten, ist bekannt, was es ermöglicht, präzise Zeitintervalle zu messen.
- Ein Timer kann verwendet werden, um bestimmte Aktionen nach einem festgelegten Zeitraum auszuführen, wie z.B. das Auslösen eines Interrupts oder das Ändern des Zustands eines Ausgangs.
Zähler
- Zähler werden verwendet, um die Anzahl von Ereignissen zu messen.
- Sie zählen Eingangsimpulse, deren Frequenz oder Auftreten variabel und nicht notwendigerweise konstant oder bekannt ist.
- Ein Zähler kann zum Beispiel dazu verwendet werden, zu ermitteln, wie oft ein bestimmter Vorgang oder ein externes Ereignis stattgefunden hat.
Ein Timer kann also als spezialisierte Form eines Zählers betrachtet werden, bei dem die Ereignisse, die gezählt werden, Taktimpulse einer bekannten Frequenz sind. Im Gegensatz dazu kann ein allgemeiner Zähler für eine Vielzahl von Eingangsimpulsen verwendet werden, deren Rate nicht vorher festgelegt ist.
Timer Modi
Der Timer0/Counter0 hat vier verschiedene Modi, die im folgenden beschrieben werden.
Normal Mode
Der Normal Mode ist der einfachste Mode. Dabei zählt der Timer fortlaufend von 0 bis 255, es kommt zum Überlauf auf 0, der Timer zählt weiter hoch. Der Überlauf kann dazu verwendet werden, um z.B. eine bestimmte Zeit zu messen.
Aufgrund der geringen Auflösung des Zählers, ist die Zeit bis zum Überlauf stark begrenzt. Softwaretechnisch kann hier z.B. die Anzahl der Überläufe gezählt werden, um eine längere Zeit zu messen.what
CTC Mode (Clear Timer on Compare)
Im CTC Mode wird der Zähler auf einen bestimmten Wert gesetzt, wenn der Zähler diesen Wert erreicht, wird ein Interrupt ausgelöst.
Der CTC Mode kann verwendet werden um ein Rechtecksignal zu erzeugen. Dies wird erreicht, indem ein Ausgang beim Erreichen des OCR-Wertes getoggelt wird (entweder manuell oder über den Compare Output toggle mode).
Dabei berechnet sich die Frequenz mit der folgenden Formel:
N ... Prescaler Wert

Fast PWM Mode
Der Fast PWM Mode ist ein Modus, bei dem der Zähler von 0 bis 255 zählt und dann wieder auf 0 zurücksetzt. Dies führt zu einer asymmetrischen PWM.
Anwendungsbeispiele: Einfache LED-Dimmer, Servoansteuerung, Schaltnetzteile
Die Frequenz der PWM berechnet sich dabei wie folgt:

Das zugehörige Timingdiagramm sieht wie folgt aus:

Die Frequenz der PWM muss dabei an den zu steuernden Verbraucher angepasst werden. Bei einer LED ist z.B. die Frequenz im Bereich größer 100 Hz mehrere kHz sinnvoll, da das menschliche Auge dann das Flackern nicht mehr wahrnimmt. Bei Motoren ist eine Frequenz von 20kHz sinnvoll, da hier die Motoren nicht mehr hörbar sind. Bei Servos ist eine Frequenz von 50Hz Standard.
Phase Correct PWM Mode
Der Phase Correct PWM Mode ist ähnlich dem Fast PWM Mode, jedoch wird hier der Zähler in beide Richtungen gezählt (0-255-0). Dies führt zu einer symmetrischen PWM. Aufgrund des symmetrischen Zählens, ist die Frequenz in etwa halb so hoch wie im Fast PWM Mode.
Anwendungsbeispiele: Motorsteuerung, Tonerzeugung
Die Frequenz der PWM berechnet sich dabei wie folgt:

Das zugehörige Timingdiagramm sieht wie folgt aus:

N ... Prescaler Wert
fclk_I/O ... Frequenz der CPU (z.B. 12 MHz für MEGACARD)
2.5.4 Timer1
Unterschiede zu Timer0
ICP Mode
Port D, Bit 6 hat als alternative Funktion ICP1 (Input Capture Pin für Timer 1). Das Input Capture Register (ICR1) kann den Timer/Counter Wert zu einem externen (flankengetriggerten) Ereignis speichern.
Beispiel (ICP)
Im folgenden Beispiel wird mit Timer 0 ein Signal erzeugt, welches am Ausgang PB0 ausgegeben wird.
Dieses Signal wird mit PD6 verbunden, wo mit Timer 1 die Periodendauer/Frequenz des Signals bestimmt wird und auf dem Display ausgegeben wird.
Die Periodendauer/Frequenz wird dabei mit folgenden Formeln bestimmt:

Allgemeines zur Zeitmessung
Im bisherigen Beispiel haben wir nur betrachtet, wie die Zeit zwischen zwei (steigenden) Flanken berechnet werden kann. Dabei war zu beachten, dass der Zähler nicht überläuft, sprich die Periodendauer nicht länger ist als 2^16 Taktzyklen (Timer1). Für z.B. die Implementierung einer Stopuhr ist dies nicht ausreichend. Im folgenden werden allgemeine Hinweise gegeben, was bei einer Zeitmessung/Stoppuhr beachtet werden muss.
Problem 1: Überlauf des Zählers
Der maximale Zählerwert ist begrenzt durch die Bitbreite des verwendeten Timers (8 bzw. 16 bit).

Als allgemeine Formel zum berechnen der Anzahl der ticks zwischen START und STOP kann verwendet werden:

Problem 2: Zwischenzeit
Der Timer kann für die Messung der Zwischenzeit nicht angehalten werden da dies eine Fehlzeit ergeben würde.
Als Lösung können Schattenregister verwendet werden (Double Buffered Register).
Weitergehende Informationen finden sich z.B. hier
Problem 3: Datentypen
Für die Speicherung von langen Zeitmessugen müssen Datentypen mit großen Wertebereichen gewählt werden, z.B. uint32_t oder uint64_t. Siehe auch Kapittel Datentypen im Modul C-Programmierung.
2.5.5 Timer 2
Timer2 hat im Wesentlichen die gleichen Modi wie Timer0 und ist ebenfalls ein 8-bit Timer/Counter mit leichten Abweichungen (z.B. andere Prescaler). Wie bei Timer1 (ICP Mode, insbesondere für Zeitmessung) wird im folgenden für Timer2 nur auf eine Besonderheit eingegangen: die Möglichkeit einen Real Time Counter/Clock (RTC) zu implementieren.
Bei setzen des Bits AS2 im ASSR Register, wird Timer2/Counter2 asynchron vom Eingang TOSC1 getaktet. Dabei wird ein Quarz twischen den Pins TOSC1 und TOSC2 angeschlossen. Der interne Oszillator ist dabei optimiert für die Verwendung eines 32.768 kHz Quarzes. Diese Quarze sind typisch für Uhrenanwendungen da:
- Günstig herzustellen
- Niedrigerer Stromverbrauch (wg. niedriger Frequenz)
- Teilbar um z.B. 1Hz Signal zu erzeugen
So ergibt z.B. ein Prescaler von 128 bei einem 8-bit Zähler einen Zählerüberlauf jede Sekunde.
Details finden sich im Datenblatt im Abschnitt Asyncrhonous Operation of the Timer/Counter2.

Die folgende Application Note AVR Application Note 134 beschreibt, wie man eine RTC für einen AVR implementieren kann.