Atmega32u4 Timer1 interrupt löst nicht aus

OP #4692409
Lesenswert?

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.
Gast #4692422
Lesenswert?

Tobias E. schrieb:
> Danke, manchmal sieht man vor lauter Bäumen den Wald nicht mehr.

Manchmal gibt es noch mehr Bäume:

Tobias E. schrieb:
> ISR(TIMER1_COMPA_vect){
>   // set PE6 to high
>   PORTE |= (1<<PE6);
> }

In der ISR wird das Bit 6 dauernd auf 1 gesetzt.

Ist wohl nicht Sinn der Sache.

Versuch es mal mit
1
  PORTE ^= (1<<PE6);

Dann kann man das Togglen per Oszilloskop beobachten.
OP #4692429
Lesenswert?

Mitlesa schrieb:
> Tobias E. schrieb:
>> ISR(TIMER1_COMPA_vect){
>>   // set PE6 to high
>>   PORTE |= (1<<PE6);
>> }
>
> In der ISR wird das Bit 6 dauernd auf 1 gesetzt.
>
> Ist wohl nicht Sinn der Sache.

Tatsächlich war das der Sinn der Sache. Die Methode mit dem togglen ist 
mir bekannt und ich hab sogar einen Logic-Analyser hier liegen.

Allerdings ging es erstmal darum ob der Interrupt überhaupt auslöst. 
Dafür war das tatsächlich der einfachst mögliche Code zum debuggen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren