Ich rechne das immer "Anders 'rum" ;)
@ 8MHz braucht der Prozessor für einen Takt: 1/8MHz = 0,125µs
Mit einem Prescaler von 64, zählt der Timer nur jeden 64ten Takt, also 0,125µs x 64 = 8µs braucht der Timer um den Zähler um eins zu erhöhen.
Nun kannst Du deine benötigte Endzeit (10ms = 10.000µs) durch die 8µs teilen, die der Timer pro Schritt braucht, also:
10.000/8 = 1250 Timerschritte..
Um also auf 10ms zu kommen, muss dein Timer mit Prescaler 64 @8MHz bis 1250 zählen.. wenn er nur bis 255 kommt (8Bit) gibts vielleicht 2 Möglichkeiten das Problem zu lösen:
1) du zählst in der CTC-ISR eine Variable hoch (die alle CTC-Matches zählt), so dass du insgesamt 1250 Schritte zusammenbekommst. Anzuraten wäre in diesem Fall ein CTC-Wert in OCRA2 von 250, so dass du mit 5 mal hochzählen recht genau hinkommst (für die ISR und den Code da drin gehen aber nochmal ein paar Takte drauf, die man mit nem angepassten OCR2 in der Runde 4 abfangen könnte, aber das nur auf Anfrage ;)).
Also zB:
2) oder du nimmst nen anderen Prescaler, so dass der Timer mit seinen maximal möglichen 255 allein hinkommt, ohne Zählvariable..Code:volatile uint8_t n=0;
ISR "CTC"
{
n++;
if (n==5)
{
n=0;
... was auch immer nach 10ms auch ausgeführt werden soll
}
}
Hängt aber davon ab, was du als Prescaler noch einstellen kannst.
zB. reicht ein Prescaler von 256 noch nicht aus, wie du nachrechnen kannst, da: 10.000µs/(0,125µs x 256) = 312,5 > 256! - was das max. Mögliche im 8Bit Timer ist..
Prescaler von 512 oder mehr wäre nötig?!
3) Oder aber du findest dich damit ab und verringerst die ISR-Aufruf Zeit auf den durch die 256-OCR2-Grenze gegebenen Wert von 8,192ms...
Dann brauchst Du auch OCR2 nicht setzen, sondern kannst gleich den "Count bis 0xFF Modus" des Timers nutzen ;)
4) Noch eine weitere Möglichkeit wäre natürlich den Takt des Prozesors zu senken ;)
Grüße
0tes_Gesetz
