> Danke, aber mehr als Codeschnipsel kann ich nirgends finden.
Gewöhn dich daran.
Du wirst nie ein fertiges Programm finden, welches genau das macht was
du willst. Du wirst immer aus Codeschnipseln die für dich relevante
Information extrahieren müssen um diese dann für deinen konkreten Fall
anzuwenden.
Timer sind eigentlich ganz einfach!
So ein Timer ist eine Hardwareeinheit, die still und leise vor sich
hinzählt. Nicht mehr und nicht weniger. Das ist die Basisfunktionalität
auf der alles andere beruht.
Wie schnell macht sie das?
Dazu braucht es einen Taktgeber, der im Normalfall der gleiche Takt ist,
der auch deine restliche CPU antreibt. Also die Systemfrequenz. Da das
aber oftmals einfach zu schnell ist, gibt es den Vorteiler, der den
Systemtakt um einen bestimmten Faktor runterteilt. Ist dein Systemtakt
zb 1Mhz, dann bewirkt ein Vorteiler von 8, dass der Timer mit 125kHz
zählt (125kHz bedeutet in dem Fall: der Timer zählt in einer Sekunde
zumindest theoretisch von 0 bis 124999)
Wann legt so ein Timer los?
Ganz einfach: sobald ein Vorteiler zugewiesen wird (es gibt auch einen
Vorteiler von 1 und es gibt einen Vorteiler von 0, was 'kein Vorteiler'
bedeutet)
Welche Vorteiler es gibt und welche Bits in welchem Register gesetzt
werden müssen um einen auszuwählen, steht im Datenblatt des Prozessors.
Damit kannst du den Timer schon mal starten und stoppen. Vorteiler
ungleich 0 gesetzt -> der Timer zählt. Vorteiler auf 0 -> der Timer
zählt nicht.
Natürlich kann so ein Timer nicht endlos zählen. Als 8 oder 16 Bit
Einheit gibt es natürlich eine Obergrenze bis zu der er kommt. Eine 8
Bit Einheit kann physikalisch bedingt nun mal nicht höher zählen als bis
255. Was macht der Timer dann? Nichts spezielles, es gibt einen Überlauf
und er beginnt wieder bei 0.
Anstelle von 0 bis 124999 zu zählen, zählt der Timer also ständig nur
von 0 bis 255 und generiert dabei laufend Überläufe.
Wieviele denn?
Ganz einfach: Wie oft muss men denn von 0 bis 255 zählen, damit man in
Summe 125000 Zählvorgänge gemacht hat? 125000 / 256 = 488.28125 mal
Der Timer generiert also bei 1Mhz Systemtakt und einem Vorteiler von 8,
genau 488.2815 Überläufe in der Sekunde. Aber abgesehen davon, zählt er
immer noch munter vor sich hin. Immer von 0 bis 255
Jetzt wär das alles ein bischen witzlos, wenn der Timer einfach nur vor
sich hinzählt. Der soll ja auch was machen!
Na, zb. kann der Timer dir ein Signal geben (einen Interrupt), wenn er
bestimmte Zählerstände erreicht hat. Und da kommen jetzt die ganzen
Timer-Modi ins Spiel. Im Grunde ist jeder dieser Modi einfach nur eine
andere Anweisung für den Timer, dass er bei unterschiedlichen
Zählerstanden was machen soll.
Zb. wurden oben schon mal die Überläufe angesprochen. Es gibt einen
Interrupt, den man genau an dieses Überlauf-Ereignis anhängen kann. Wird
dieser Interrupt ausgelöst (weil der Timer einen Überlauf fabriziert
hat), so wird eine spezielle Funktion in deinem Programm aufgerufen, in
der du dann machen kannst was du willst. Und jetzt kommt der Clou! Wir
wissen ja, wie oft diese Funktion aufgerufen wird! Nämlich 488.28125 mal
in der Sekunde. Haben wir ja grade ausgerechnet, wie oft so ein Überlauf
in der Sekunde stattfindet.
Damit hast du aber in deinem Programm eine konstante Zeitbasis, die nur
vom Quarz abhängt und mit der du Dinge ausführen lassen kannst.
Es gibt noch andere Modi. Zb. den CTC Modus. In dem Modus kannst du dem
Timer sagen, er soll nicht bis 255 zählen, sondern gibst ihm eine
Obergrenze deiner Wahl vor. Wenn du ihm als Obergrenze zb. 124 vorgibst,
dann wird der CTC-Interrupt bei 1Mhz und einem Vorteiler von 8 genau
1000 mal in der Sekunde aufgerufen. 1Mhz und Vorteiler 8 bedeutet
wieder, dass in einer Sekunde 125000 Zählvorgänge ablaufen. Und mann
muss 1000 mal von 0 bis 124 zählen, damit man ebenfalls 125000
Zählvorgänge absolviert hat.