Gast
#1525740
Hallo. Ich bin zurzeit dabei mich in die AVR Welt einzuarbeiten. Dabei bin ich auf den Artikel http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Die_Timer_und_Z%C3%A4hler_des_AVR gestoßen. Ich habe das ganze für de n ATMega168 angepasst aud gebe die entsprechenden Werte (ms, s, m und h) auf einem 20x4 Display aus. Es sieht subjektiv betrachtet soweit ok aus. Trotzdem hänge ich an einem Gedanken/Problem fest. Bei mir ist auf dem Board ein 16MHz Quarz drauf. Über den Prescaler von 64 bekommt der Timer 250.000 mal pro Sekunde einen Impuls. Daher soll nach 250 Impulsen ein Compare Interrupt ausgelöst werden (Zeile: OCR0A = 250;). D.h. jede ms gibts einen Compare Int und ein entsprechender Counter kann incrementiert werden. Bedeutet das jetzt, dass der Timer beim 250 Impuls einen Int auslöst, der MilliSek-Counter wird erhöht, dann Zählt der Timer weiter bis 255 und dann fängt er wieder bei 0 an, zählt wieder bis 255 und löst vorher bei 250 wieder einen Compare Int aus. Das würde ja bedeuten, dass sich ein Fehler von 5 Timer-Taken einschleicht, oder? Müsste nicht beim Auslösen den Compare Int das Zählregister des Timers auf 0 zurück gesetzt werden? Ich hatte das testweise mal mit einem Prescaler von 256 probiert und OCR0A = 63. Sah rein subjektiv genauso gut aus(Counter für Sek wurde im Display etwa im SekundenTakt aktualisiert), obwohl hier der Fehler viel größer sein müsste, wenn der Timer bis 255 wiederzählt und dann bei 0 beginnt und wieder bei 63 einen Comp Int auslöst. Hab ich da irgendetwas übersehen? Auszug auf meinem Code:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |