Atmega32u4 Timer1 interrupt löst nicht aus

OP #4692409
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
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
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.