mikrocontroller.net

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


Autor: Tobias E. (m1k3y)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich komm mir langsam doof vor. Ich habe folgenden Code auf einem 
Atmega32u4, kompiliert mit dem avr-gcc unter Arch Linux.

#include <avr/power.h>
#include <avr/interrupt.h>
#include <stdbool.h>

ISR(TIMER1_COMPA_vect){
  // set PE6 to high
  PORTE |= (1<<PE6);
}

#define CTC_MATCH_OVERFLOW ((F_CPU / 1000) / 8) 
void init(void){
  // deactivate clock divider -> 16 MHz
  clock_prescale_set(clock_div_1);

  // setup Timer1A to trigger every millisecond
  // set to CTC-Mode
  TCCR1B |= (1 << WGM12);
  // set to clock CPU/64
  TCCR1B |= (1 << CS11) | (1 << CS10);
  // set match to 250 -> 1 ms (16000k / (64 * 250) -> 16000k / 16000 -> 1k)
  OCR1A = 250;
  // enable compare-match interrupt
  TIMSK1 |= (1 << OCIE1A);

  // enable interrupts
  sei();

  // set PE6 to output
  DDRE |= (1<<PE6);
}

int main(void){
  while(true){

  }
}


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.

Autor: void (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
init() wird nicht aufgerufen...

Autor: Tobias E. (m1k3y)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void schrieb:
> init() wird nicht aufgerufen...

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

Autor: void (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gern geschehen...

Autor: Mitlesa (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
  PORTE ^= (1<<PE6);

Dann kann man das Togglen per Oszilloskop beobachten.

Autor: Tobias E. (m1k3y)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.