Hallo Leute,
ich setze mich momentan mit Timern auseinander und bin auf folgendes
Problem gestoßen:
Ich habe einen CTC Timer Programmiert und OCR0 auf 50-1 gesetzt.
Da ich einen Quarz von 7,3728MHz verbaut hatte und lediglich eine LED im
1Hz Takt als Test blinken lassen wollte, habe ich mir einfach selber
einen prescaler programmiert:
1 | uint32_t prescale = 0;
|
2 |
|
3 | .
|
4 | .
|
5 | .
|
6 | .
|
7 |
|
8 | if (prescale >=73728)
|
9 | {
|
10 | PORTB ^= (1<<LED);
|
11 | prescale = 0;
|
12 | }
|
prescale wird bei jedem compare match um 1 erhöht.
Als ich das Programm testete, habe ich jedoch festgestellt, das die LED
nicht im exakten Takt zu blinken scheint und ich durch ändern des OCR0
Wertes keine korrekte Frequenzänderung habe...
Nach langen versuchen und ausprobieren entschied ich mich dafür einfach
mal einen "richtigen" prescaler zu verwenden.
Folglich setzte ich das CS02 Bit, um den prescaler von 1024 zu
verwenden.
So sieht der angepasste Code aus:
1 | if (prescale >=73728/1024)
|
2 | {
|
3 | PORTB ^= (1<<LED);
|
4 | prescale = 0;
|
5 | }
|
Nach diesem eingriff funktioniert das Programm komischer weise
einwandfrei und exakt.
Nun frage ich mich trotzdem woran das liegt? Im Grunde ist dies doch das
selbe oder?