Hi,
ich verzweifle hier mit meinem ATMega32 Timer :(
Fuses bzgl. Quarz sollten Passen (mach ich z. B. _delay_ms(500) und
messe das mit dem Oszi an einem Ausgang) stimmt alles.
Hier mein Code (nur die relevanten Auszüge - ich will via CTC alle eine
Sekunde die Var "xx" inkrementieren):
1 | #define F_CPU 16e6
|
2 |
|
3 | //INCLUDEs
|
4 | #include <avr/io.h>
|
5 | ...
|
6 | #include <avr/interrupt.h>
|
7 |
|
8 | volatile uint32_t xx = 0;
|
9 | uint8_t yy = 0;
|
10 |
|
11 | ...
|
12 |
|
13 | int main (void)
|
14 | {
|
15 | //Timer2
|
16 | TCCR2 = (1<<WGM01); // CTC Modus
|
17 | TCCR2 |= (1<<CS02) | (1<<CS00); // Prescaler 1024
|
18 | OCR2 = 625-1;
|
19 | TIMSK |= (1<<OCIE2); //Compare Interrupt erlauben
|
20 | sei(); //global Interrupts aktivieren
|
21 |
|
22 | //Definition ein und Ausgänge
|
23 | ....
|
24 |
|
25 | while(1)
|
26 | {
|
27 | //hier toggelt ein Pin zum Test und Messen mit dem Oszi, nur leider viel zu schnell
|
28 | }
|
29 | }
|
30 |
|
31 | ISR (TIMER2_COMP_vect)
|
32 | {
|
33 | if (++yy == 25)
|
34 | {
|
35 | yy = 0;
|
36 | if (++xx > 86399) //irgendwann von vorne beginnen
|
37 | xx = 0;
|
38 | }
|
39 | }
|
Ich bekomme keine Fehlermeldung, nur stimmt das Timing leider nicht.
Ich rechne so:
16MHz / 1024 (Prescaler) = 15625Hz
Ich lasse jetzt bis 624 (625-1) zählen.
15625Hz / 625 = 25Hz >> sollte die ISR also 25mal in der Sekunde
aufrufen.
Nun noch die Hilfsschleife, die nur jeden 25sten durchlauf meine Var
"xx" inkrementiert (und bei erreichen eines max. Wertes wieder NULL
setzt)
Oder habe ich einen Denkfehler??
DANKE