Hallo,
Ich versuche Grad mit einem Atmega32 und einem Quarzoszillator mit
3,276800Hz einen 1Hz Takt zu erzeugen. Dazu benutze ich den 16-bit
timer.
1 | #include <avr/io.h>
|
2 | #include <util/delay.h>
|
3 | #include <avr/interrupt.h>
|
4 | int a;
|
5 |
|
6 |
|
7 | int main(void)
|
8 | {
|
9 | TIMSK = (1<<TOIE1); // enable TCNT1 overflow
|
10 | TCCR1A = 0x00; // normal operation page 148 (mode0);
|
11 | TCNT1=0x0000; // 16bit counter register
|
12 | TCCR1B = 0b00000111; // ----External clock source on T1 pin. Clock on rising edge.
|
13 |
|
14 |
|
15 | DDRD = 0b11111111;
|
16 | DDRB = 0b11111100;
|
17 | DDRA = 0b11111111;
|
18 | DDRC = 0b11111111;
|
19 |
|
20 | sei(); // Global Interrupts aktivieren
|
21 | while(1)
|
22 | {sei();}
|
23 |
|
24 |
|
25 |
|
26 | }
|
27 | ISR(TIMER1_OVF_vect)
|
28 |
|
29 |
|
30 | {
|
31 | a++;
|
32 | if (a==25)
|
33 | {a=0;
|
34 | PORTA ^= ( 1 << PA2); // toggle a2 im sekundentakt
|
35 | }
|
36 | }
|
theoretisch soll es dann mit 3,276800Hz/(2^16)=50Hz die
Interrupt-routine ausgelöst werden und so bei jedem 25. mal pin A2
toggeln.
--> 1Hz
Stattdessen bekomme ich jetzt aber 1/12,.. Hz. Was mach ich denn falsch?