Forum: Mikrocontroller und Digitale Elektronik Atmega32u4 Timer1 interrupt löst nicht aus


von Tobias E. (m1k3y)


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.

von void (Gast)


Lesenswert?

init() wird nicht aufgerufen...

von Tobias E. (m1k3y)


Lesenswert?

void schrieb:
> init() wird nicht aufgerufen...

Danke, manchmal sieht man vor lauter Bäumen den Wald nicht mehr.

von void (Gast)


Lesenswert?

Gern geschehen...

von Mitlesa (Gast)


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.

von Tobias E. (m1k3y)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.