Timer1 Capture wird nicht ausgeführt.

Gast #1340970
Lesenswert?

Hallo,

Ich habe einen Atmega8 und bekomme den Capture des Timer1 einfach nicht 
zu Laufen:

Ich habe die Register folgendermaßen konfiguriert:

  TCCR1B = 0b1101;
  OCR1A = 780;
  TIMSK = 0b10000;

  sei();

Und im AVR-GCC folgende ISR-Funktion:
ISR(TIMER1_CAPT_vect)

aber irgendwie springt er mir nicht in die ISR...

Kann mir jemand helfen?
Gast #1341007
Lesenswert?

Was daran liegen sollte, daß WGM10..13 nicht korrekt gesetzt werden. 
Wenn TCCR1A nicht gesetzt ist, dann gibt's den Mode überhaupt nicht.

Register binär statt mit symbolischen Namen zu setzen ist auch nicht 
wirklich übersichtlich...
Gast #1341008
Lesenswert?

Jup sorry hab ich jetzt auch bemerkt ;)

        TCCR1B |= (1 << WGM12) | (1<<CS12) | (1<<CS10);
  OCR1A = 780;
  TIMSK = (1 << OCIE1A);

Aber WGM 10, 11 und 13 müssen doch 0 sein, damit das überhaupt geht 
oder?
Gast #1341015
Lesenswert?

Hab gerade den Debug einfach mal ne Weile laufen lassen: Irgendwie 
springt der mir erst nach ca. 255 ms in die Routine;

Mit 16MHz Prescaler von 1024 und 65535 ist das auch der Fall, aber warum 
springt er mir nicht schon bei 780 rein?
Gast #1341083
Lesenswert?

> Aber WGM 10, 11 und 13 müssen doch 0 sein, damit das überhaupt
> geht oder?

Stimmt, mein Fehler, zu weit unten in der Tabelle gekuckt...

Da das nicht Dein vollständiger Code ist, kann man nur raten. Wenn der 
TCCR1B noch nicht beschrieben wurde, so ginge TCCR1B |= , ansonsten 
würde ich lieber:
1
TCCR1B = (1 << WGM12) | (1<<CS12) | (1<<CS10);
schreiben.
Gast #1341136
Lesenswert?

Also rumgedreht hab ichs, aber er geht mir trotzdem erst nach 255 ms in 
den ersten Interrupt...

Beim zweiten sind es dann meine 45ms wie ich eingestellt hab!
Also das wusst ich net das das so ist...

Kann man das irgendwie umgehen, dass das direkt übernommen wird ohne 
Puffer?
Gast #1341206
Lesenswert?

Im CTC-Modus ist OCRA1 nicht gepuffert.

>Mit 16MHz Prescaler von 1024 und 65535 ist das auch der Fall, aber warum
>springt er mir nicht schon bei 780 rein?

Was machst du denn in deinem Programm noch alles zwischen 
Timer-Initialisierung und sei()?

Oliver

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren