Wie isst man einen Elefanten? - In kleinen Stücken...
Wenn Dir die Formel zu abstrakt und unverständlich ist, dann zerlege die
Aufgabe in so kleine Stücke, dass Du jeden Teil davon nachvollziehen
kannst.
Du hast:
- eine Taktfrequenz,
- einen maximalen Timer-Zählumfang,
- verschiedene Timer-Vorteiler-Stufen.
- eine Wunschvorstellung für das Intervall zwischen den
Interrupt-Aufrufen
Du suchst:
- den optimalen Timer-Vorteiler,
- den Compare-Wert, der bei dem gewählten Vorteiler das gewünschte
Intervall ergibt.
Rein logisch, ohne jede unverstandene Formel, kann man erstmal schaun,
wie groß das gewünschte Intervall ist, wenn man es micht in
Millisekunden, sondern in CPU-Takten betrachtet. Bei 8 MHz CPU-Takt
entspricht eine Millisekunde (bzw. 1 kHz) 8000 Takte.
Du musst also _alle 8000 CPU-Takte einen Interrupt auslösen._
Nun entscheide Dich für einen der verfügbaren Timer und schau Dir dessen
maximalen Zählumfang an.
Ein 16-Bit-Timer kann bis 65535 zählen, 65536 entspricht 0. Damit
könntest Du die 8000 Takte ohne Probleme abzählen, der Timer kann ohne
Vorteiler arbeiten, also direkt die CPU-Takte zählen. Du setzt dazu den
Compare-Wert auf 8000 und wählst (falls vorhanden) den CTC-Mode (Clear
To Compare-match). Das macht natürlich nur Sinn, wenn der Timer keine
anderen Aufgaben zu erledigen hat.
Willst Du den 1ms-Takt aber mit einem 8-Bit-Timer erzeugen, dann hast Du
nur einen Zählumfang von 256 (0 bis 255, 256=0). Damit kannst Du erstmal
keine 8000 Takte abzählen... Da war doch aber noch der Vorteiler, mit
dem man den Timer langsamer laufen lassen kann. Um 8000 CPU-Takte zählen
zu können, bräuchte man einen Vorteiler von 31,25 (8000 durch 256 =
31,25). Den gibt es aber nicht, der nächste verfügbare Vorteiler ist 64.
Teilt man die 8000 Takte durch den Vorteilerwert von 64, dann erhält man
125, das bedeutet, dass der Timer, der ja nur bei jedem 64. CPU-Takt
einen Schritt weiter zählt, _nach jeweils 125 Takten einen Interrupt
auslösen soll_. Hierzu bietet sich (bei neueren AVRs) einer der
Compare-Interrupts an, der oftmals auch mit CTC-Mode ausgestattet ist.
Die Formel macht übrigens nichts weiter, als all diese Zusammenhänge
zusammenzufassen und den Compare-Wert vom Preprozessor ausrechnen zu
lassen. Dies ist eine immense Arbeitserleichterung für den, der die
Zusammenhänge mit links und 40 Fieber beherrscht.
Für den Neuling besteht allerdings bei unbekümmerter Benutzung der
Formel die Gefahr, dass der (im Hintergrund) ermittelte Wert nicht mehr
in den Wertebereich der Ergebnisvariable (hier Byte) passt und dadurch
(oft unbemerkt) unsinnige Werte entstehen. Das könnte einerseits sein,
dass der Wert zu groß wird und die oberen Bits abgeschnitten werden,
andererseits kann der Wert zu klein werden, wodurch die Nachkommastellen
abgeschnitten werden und der Wert ganz schön daneben liegt. Dazu kommt
noch die Tatsache, dass nicht jeder Preprozessor mit Fließkommazahlen
rechnet. Der Preprozessor des AVR-Studios (bei ASM-Programmierung)
rechnet meines Wissens nach z.B. nur mit 32-Bit-Ganzzahlen (long
integer), da würde die Formel wohl nicht das gewünschte Ergebnis
liefern.