Forum: Mikrocontroller und Digitale Elektronik Timer1 Capture wird nicht ausgeführt.


von Thorsten001 (Gast)


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?

von Thorsten001 (Gast)


Lesenswert?

Äh sorry meinte natürlich den Compare nicht den Capture!

und hier die ISR(TIMER1_COMPA_vect)...

von MWS (Gast)


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...

von Thorsten001 (Gast)


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?

von Thorsten001 (Gast)


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?

von Jörg G. (joergderxte)


Lesenswert?

Sind die OCxyz Register nicht normalerweise gepuffert (d.h. die Werte 
werden erst beim nächsten Match übernommen)?
Funktioniert dein Code also, wenn du erst OCR1A und dann TCCR1B 
schreibst?

rtfm, Jörg

edit: zuviele Typos

von MWS (Gast)


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.

von Thorsten001 (Gast)


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?

von MWS (Gast)


Lesenswert?

Man könnte für den Timer/Counter einen Preset von 65536 - 780 nehmen 
oder Mode 12 mit ICR1 statt OCR1A. ICR1 und dieser Mode ist nicht 
gepuffert.

von MWS (Gast)


Lesenswert?

Mal nachgelesen, das hier sollte für exakt diese Zweck vorgesehen sein:
1
  TCCR1B = (1 << WGM12) | (1<<CS12) | (1<<CS10);
2
    OCR1A = 780;
3
      TCCR1A |= (1 << FOC1A);
4
        TIMSK = (1 << OCIE1A);
5
  sei();

von Oliver (Gast)


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

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.