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?
Äh sorry meinte natürlich den Compare nicht den Capture! und hier die ISR(TIMER1_COMPA_vect)...
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...
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?
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?
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
> 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.
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?
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.
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(); |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.