Hallo.
Ich sehe momentan den Wald vor lauter Bäumen nicht mehr.
Mein Timer soll im Sekundentakt hochzählen. Ich verwende dazu den 8-bit
Timer0 des ATMEGA48 und einen Quarz mit 3.6864MHz.
Nun soll der Timer alle 10ms einen Interrupt auslösen und die Variablen
ms, sek und min entsprechend erhöhen.
Nur zählt der Timer nicht im Sekundentakt sondern sek wird nur alle 4-5
Sekunden erhöht.
Folgend habe ich TCNT0 berechnet:
3686400 / 1024 = 3600Hz --> 1/3600 = 2,78e-4 s/Takt
Demnach müssen 36 Takte vergehen bis 10ms vergehen (2,78e-4 * 36 = 0.01)
D.h. TCNT0 muss auch 219 (255-36) gesetzt werden.
Worin könnte hier das Problem liegen?
1 | /*
|
2 | * test.c
|
3 | *
|
4 | * Created: 26.09.2012 17:34:15
|
5 | * Author: Mathias
|
6 | */
|
7 |
|
8 | #define F_CPU 3686400UL
|
9 |
|
10 | #include <avr/io.h>
|
11 | #include <avr/interrupt.h>
|
12 |
|
13 | uint16_t ms;
|
14 | uint16_t sek;
|
15 | uint16_t min;
|
16 |
|
17 |
|
18 | int main(void)
|
19 | {
|
20 | ms = 0;
|
21 | sek = 1;
|
22 | min = 0;
|
23 |
|
24 | DDRB = 0xff;
|
25 |
|
26 | //Timer0 init
|
27 | TCNT0 = 219;
|
28 |
|
29 | TCCR0B |= ((1<<CS02) | (1<<CS00)); //prescaler 1024
|
30 | TIMSK0 |= (1<<TOIE0); //interrupt enable
|
31 |
|
32 |
|
33 | sei();
|
34 |
|
35 | while(1)
|
36 | {
|
37 | PORTB = sek;
|
38 |
|
39 | }
|
40 | return 1;
|
41 | }
|
42 |
|
43 | ISR(TIMER0_OVF_vect)
|
44 | {
|
45 | TCNT0 = 219;
|
46 | ms ++;
|
47 | if(ms == 100){
|
48 | ms = 0;
|
49 | sek++;
|
50 | if(sek == 60){
|
51 | sek = 0;
|
52 | min++;
|
53 | }
|
54 | }
|
55 | }
|