Hallo, wollte eine konstante Zeit vom Timer-Interrupt ableiten, nur stimmt irgendwie meine errechnete Zeit mit der realen Zeit nicht überein. Zum Ablauf der Timerinterrupt wird alle 4,096 ms aufgerufen dort wird eine Variable hochgezählt bis die Zeit von 200,704 ms erreicht wurden. Dann wird eine globale Variable auf 60000 (soll 1 Min entsprechen) initialisiert die dann dekrementiert wird und die LED toggelt von grün auf rot. Tatsächlich wird die LED aber nach 6 sekunden auf rot geschaltet und nicht nach 1 min wie ursprüglich berechnet. Woran kann es liegen? Über eine Info würde ich mich freuen.
1 | void init_timer2 (void) |
2 | {
|
3 | TCC1.PER = 2; //Timer top value (overflow at 4µs) |
4 | TCC1.CTRLB = TC_TC1_WGMODE_NORMAL_gc; // Mode: Normal mode |
5 | TCC1.CTRLA = TC_TC0_CLKSEL_DIV1_gc; // Prescaler 1 |
6 | TCC1.INTCTRLA = TC_TC1_OVFINTLVL_LO_gc; //Interrupt modus active priority low |
7 | }
|
8 | |
9 | |
10 | void interrupt_init (void) |
11 | {
|
12 | PMIC.CTRL |= PMIC_LOLVLEN_bm; //Interrupt on |
13 | sei(); //Interrupt enable |
14 | }
|
15 | |
16 | s_IO.ulLaufzeit = 60000; |
17 | |
18 | int main (void) |
19 | {
|
20 | PORTB.DIRSET = PIN2_bm; |
21 | PORTB.DIRSET = PIN3_bm; |
22 | PORTB.OUTSET = PIN3_bm; |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | while (1) |
29 | {
|
30 | if (s_IO.ulLaufzeit == 0) |
31 | {
|
32 | |
33 | PORTB.OUTSET = PIN2_bm; |
34 | PORTB.DIRCLR = PIN3_bm; |
35 | }
|
36 | }
|
37 | }
|
38 | |
39 | |
40 | ISR(TCC1_OVF_vect) |
41 | {
|
42 | static unsigned char ucMsTimer = 0; |
43 | |
44 | |
45 | if ( ucMsTimer >= 49 ) //51 |
46 | {
|
47 | ucMsTimer = 0; |
48 | }
|
49 | else
|
50 | {
|
51 | ucMsTimer++; |
52 | }
|
53 | |
54 | if ( ucMsTimer == 0 ) |
55 | {
|
56 | if (s_IO.ulLaufzeit > 0) |
57 | {
|
58 | s_IO.ulLaufzeit--; |
59 | }
|
60 | }
|
61 | }
|
