mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit Timer interrupt avr-libc


Autor: AVR Beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich mache gerade meine ersten Versuche mit dem ATMEGA32. Ich habe vorher 
schon mit ATMEGA 162 sowie ATTINY's gearbeitet. Ich wollte einen 
periodischen Timer Interrupt erzeugen auf die folgenden Art:
#define TICKER_FREQ 50
void init_timeslice()
   {
   TCNT1 = 0;
   OCR1A = F_CPU/(64*TICKER_FREQ)-1; // set divider for clock ticker
   TCCR1A = 0; //no output, CTC mode 
   TCCR1B = 0b00001011; //CTC mode, prescaler 64   
   TIMSK  = 0b00010000; // allow Timer 1 output compare A interrupt
   sei();
   }
Die Interrupt-Service Routine sieht so aus:
ISR(TIMER1_COMPA_vect)
   {
     ...

   sei();
   }

Leider funktioniert es weder in der Hardware noch im 
AVR-Studio-Simulator.

Die Interruptroutine wird nie angesprungen, statt dessen macht der 
Controller einen Reset. Die Werte in den Timer-Registern sehen jedoch 
vernünftig aus. Woran könnte das liegen?

Gruss
Mike

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  AVR Beginner (Gast)

>Die Interrupt-Service Routine sieht so aus:

>ISR(TIMER1_COMPA_vect)
>   {
>     ...

>   sei();
>   }

Wie kommst du auf die Idee, sei() habe etwas in einem Interrupt 
verloren? Das kann mal fix ins Auge gehen.

>Controller einen Reset. Die Werte in den Timer-Registern sehen jedoch
>vernünftig aus. Woran könnte das liegen?

Probier mal die Beispiele aus Sleep Mode und Interrupt.

MFG
Falk

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1/ Du bietest ja nur einen Codefetzen an. Die Nachfrage muss dann 
kommen: init_timeslice() wird in main() aufgerufen?

2/ sei() in ISR(TIMER1_COMPA_vect) ist überflüssig.

3/ Sicher bei diesen Anweisungen?
   TCCR1A = 0; //no output, CTC mode
   TCCR1B = 0b00001011; //CTC mode, prescaler 64
   TIMSK  = 0b00010000; // allow Timer 1 output compare A interrupt

Absolute Zuweisungen, also ohne symbolische Namen, kontrolliere ich 
nicht. Beim Übergang von einem zum anderen AVR können sich die absoluten 
Bitwerte ändern (es gibt Beispiele), die symbolischen Namen bleiben aber 
gleich.

Autor: AVR Beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, Fehler gefunden, im AVR-Studio war der falsche Controller 
eingestellt: ATMEGA162 statt ATMEGA32. Daher wurde die Interruptroutine 
an den falschen Vektor gehängt (0x08 statt 0x0E). Jetzt funktioniert es!

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.