Ich komm mir langsam doof vor. Ich habe folgenden Code auf einem
Atmega32u4, kompiliert mit dem avr-gcc unter Arch Linux.
1 | #include <avr/power.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <stdbool.h>
|
4 |
|
5 | ISR(TIMER1_COMPA_vect){
|
6 | // set PE6 to high
|
7 | PORTE |= (1<<PE6);
|
8 | }
|
9 |
|
10 | #define CTC_MATCH_OVERFLOW ((F_CPU / 1000) / 8)
|
11 | void init(void){
|
12 | // deactivate clock divider -> 16 MHz
|
13 | clock_prescale_set(clock_div_1);
|
14 |
|
15 | // setup Timer1A to trigger every millisecond
|
16 | // set to CTC-Mode
|
17 | TCCR1B |= (1 << WGM12);
|
18 | // set to clock CPU/64
|
19 | TCCR1B |= (1 << CS11) | (1 << CS10);
|
20 | // set match to 250 -> 1 ms (16000k / (64 * 250) -> 16000k / 16000 -> 1k)
|
21 | OCR1A = 250;
|
22 | // enable compare-match interrupt
|
23 | TIMSK1 |= (1 << OCIE1A);
|
24 |
|
25 | // enable interrupts
|
26 | sei();
|
27 |
|
28 | // set PE6 to output
|
29 | DDRE |= (1<<PE6);
|
30 | }
|
31 |
|
32 | int main(void){
|
33 | while(true){
|
34 |
|
35 | }
|
36 | }
|
Nach meiner Rechnung sollte der Interrupt einmal pro millisekunde
auslösen, trotzdem leuchtet die LED an PE6 nicht auf. Diese LED ist fest
auf dem Board verlötet und funktioniert zuverlässig wenn sie direkt
(nicht per Interrupt) angesteuert wird.
Wahrscheinlich habe ich wieder mal was banales übersehen aber ich komm
nicht drauf wo das Problem liegt.
Der Controller ist auf einem kleinen dev-board ähnlich dem Arduino
Pro-Micro, spezifisch
http://shackspace.de/wiki/doku.php?id=project:tinymega
Der Code oben ist eine starke vereinfachungen meines eigentlichen Codes,
wird zum debugging aber genau so verwendet.