Hallo,
ich habe folgendes Problem. Wenn ich waitForFinish(20) für zB 20ms
Verzögerung aufrufe, dann stoppt mein Programm. Selbst die LED im
Timer-Interrupt blinkt nicht mehr. Ohne waitForFinish() blinkt die LED
ganz normal. Kann mir jemand helfen warum das so ist? Ich komme nicht
mehr weiter. Selbst Debuggen hat mir nicht groß geholfen.
Vielen dank.
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include "drvTimer.h"
|
4 |
|
5 | #define DELAY_IN_MS 150
|
6 | #define ENABLE_COUNTER 1
|
7 | #define DISABLE_COUNTER 0
|
8 | volatile int16_t timer_blink = 0;
|
9 | volatile int16_t delayCounter = 0;
|
10 | volatile uint8_t enableCounter = DISABLE_COUNTER;
|
11 |
|
12 | void initTimer(void)
|
13 | {
|
14 |
|
15 | TCC0.CTRLA = TC_CLKSEL_DIV1024_gc; // Presacler 1024
|
16 | TCC0.CTRLB = 0x00; // select Modus: Normal
|
17 | TCC0.PER = 32; // Zähler Top-Wert 1000 Hz
|
18 | TCC0.CNT = 0x00; // Zähler zurücksetzen
|
19 | TCC0.INTCTRLA = 0b00000011; // Interrupt Highlevel
|
20 | timer_blink = DELAY_IN_MS;
|
21 |
|
22 | }
|
23 |
|
24 |
|
25 |
|
26 | void setEnableCounter(uint8_t enable)
|
27 | {
|
28 | enableCounter = enable;
|
29 | }
|
30 |
|
31 |
|
32 |
|
33 | uint8_t getEnableCounter(void)
|
34 | {
|
35 | return enableCounter;
|
36 | }
|
37 |
|
38 |
|
39 |
|
40 | void waitForFinish(uint8_t enableTime)
|
41 | {
|
42 | delayCounter = enableTime;
|
43 | setEnableCounter(ENABLE_COUNTER);
|
44 | while(enableCounter);
|
45 | }
|
46 |
|
47 |
|
48 |
|
49 | ISR(TCC0_OVF_vect)
|
50 | {
|
51 |
|
52 | timer_blink--;
|
53 |
|
54 | if(timer_blink <= 0)
|
55 | {
|
56 | PORTC.OUTTGL = PIN1_bm;
|
57 | timer_blink = DELAY_IN_MS;
|
58 | }
|
59 |
|
60 | if(enableCounter)
|
61 | {
|
62 | delayCounter--;
|
63 |
|
64 | if (delayCounter <= 0)
|
65 | {
|
66 | enableCounter = DISABLE_COUNTER;
|
67 | }
|
68 | }
|
69 |
|
70 | }
|