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:
Code:
volatile uint8_t n=0;
ISR "CTC"
{
n++;
if (n==5)
{
n=0;
... was auch immer nach 10ms auch ausgeführt werden soll
}
}
2) oder du nimmst nen anderen Prescaler, so dass der Timer mit seinen maximal möglichen 255 allein hinkommt, ohne Zählvariable..
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
Lesezeichen