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


von AVR Beginner (Gast)


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:
1
#define TICKER_FREQ 50
2
void init_timeslice()
3
   {
4
   TCNT1 = 0;
5
   OCR1A = F_CPU/(64*TICKER_FREQ)-1; // set divider for clock ticker
6
   TCCR1A = 0; //no output, CTC mode 
7
   TCCR1B = 0b00001011; //CTC mode, prescaler 64   
8
   TIMSK  = 0b00010000; // allow Timer 1 output compare A interrupt
9
   sei();
10
   }
Die Interrupt-Service Routine sieht so aus:
1
ISR(TIMER1_COMPA_vect)
2
   {
3
     ...
4
5
   sei();
6
   }

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

von Falk B. (falk)


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

von Stefan B. (stefan) Benutzerseite


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.

von AVR Beginner (Gast)


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!

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.