Timer

Die gänigen AVRs haben in der Regel drei Timer von denen zwei jeweils 8 Bit haben und einer 16 Bit. Was ist jetzt eigentlich ein 8 Bit Timer? Im Prinzip ist es recht einfach:

8Bit sind 2^8 = 256. Das heißt, dass der Timer von 0 bis 255 hochzählt und anschließend wieder von neuem anfängt. Wenn der Timer voll ist, kann ein sogenannter Interrupt ausgelöst werden dieser praktisch wie eine Funktion zu betrachten ist. Ein 16 Bit Timer würde bis 65535 zählen und dann wieder von neuem beginnen.

Beispiel

Der Controller wird mit einem 16Mhz Takt versorgt. 16 MHz / 256 = 62,5kHz. Das heißt der Timer läuft 62500 mal die Sekunde über. Da dies für die meisten Anwendungen aber noch zu schnell ist kann man einen Teiler für den Timer setzen der den Systemtakt teilt. Bei einem Teiler von 1024 würde der Timer mit 16MHz / 1024 = 15625Hz takten. Das bedeutet für den Überlauf, dass er jetzt nur n0ch 15625 / 256 = 61,035 mal die Sekunde auftreten würde.

Um z.B. jede Sekunde ein bestimmtes Ereignis aus zu führen sind die Stellen hinter dem Komma doch sehr störend. Da 61 Überläufe des Timers nicht ganz einer Sekunde entsprechen. Der Zähler des Timers entspricht einem Register im AVR das mal auslesen aber auch beschreiben kann. Da gibt es jetzt zwei Möglichkeiten.

  • Wir definieren jedes mal einen bestimmten Startwert, sodass der Timer noch nach 256 Iterationen überläuft sondern schon etwas früher, da er durch den veränderten Startwert nicht bei 0 anfängt zu zählen. Somit könnte man den Timer genau 62 mal die Sekunde überlaufen lassen.
  • Die zweite Möglichkeit wäre den Timer die ersten 61 Male normal zählen zu lassen und und erst für den 62ten Überlauf vorher einen Startwert größer 0 zu Wählen sodass auch genau nach 62 Mal eine Sekunde vergangen ist.

Bei einer Sekunde soll der Timer 62 mal überlaufen. Somit benötigen wir bei einem 8 Bit Timer 62 * 256  = 15872 Takte. Tatsächlich werden aber nur 15625 Takte pro Sekunde ausgeführt. Das Ergibt eine Differenz von 247 Takten die zu viel für eine Sekunde sind.

247 lässt sich nicht eindeutig durch 62 teilen, somit müssten wir bei der ersten Variante verschiedene Startwerte vorgeben. Das ist sehr umständlich. Daher wählen wir die zweite Variante. Nach dem 61ten Überlauf fehlen also noch 256 - 247 = 9 Takte für eine volle Sekunde. Da der Timer von 0 - 255 Zählt müssen wir nach dem 61ten Male den Startwert auf 246 Festlegen. Das bedeutet, dass der Timer nach genau 9 Takten sozusagen "voll" ist.

AVR GCC Code Schnippsel

Der Codeschnippsel ist Beispielhaft für den Timer0 eines Atmega16. Wie die einzelnen Bits in den Registern zu setzen sind, ist im jeweiligen Datenblatt des Mikrocontrollers nach zu lesen.

TIMSK (Timer/Counter Interrupt Mask Register):

Damit wird der Overlow Interrupt aktiviert.

TCCR0 (Timer/Counter Control Register):

Dies startet den Timer mit einem Vorteiler (Prescaler) von 1024. Andere Methoden sowie Vorteiler können ebenfalls dem Datenblatt entnommen werden.

TCNT0 (Timer/Counter Register):

Ist das Register das pro Takt um 1 erhöht wird. In diese Register müsste dann der Startwert geschrieben werden.

Mit dem Makro sei() werden allgemein alle Interrupts aktiviert. Ohne diese Makro läuft der Timer zwar, aber der Interrupt wird nicht aufgerufen.

Diese "Funktion" bzw dieser Interrupt wird nach jedem Überlauf von Timer0 aufgerufen. Die Variable _t0_count zählt die Anzahl der Aufrufe.

Einen Überblick was man noch alles mit den AVR Timern machen kann sowie ausführlichere Informationen findet ihr hier.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload CAPTCHA.