Hallo,
mit dem AtMega8 messe ich per Input Capture und Timer1 (16bit) die
Periodendauer eines Rechtecksignals, zwischen 4 und 400ms. Das
funktioniert seit längerem einwandfrei.
Nun möchte ich eine zusätzliche Funktion einbauen, welche mir die
Periodendauer um einen gewissen Faktor verlängert. Dafür will ich den
Output Compare Match nutzen und damit PB2/OC1B toggeln. Ich kriege es
allerdings nicht zum laufen. Zwar toggelt PB2 schön, aber mit viel zu
langer Periode. Genau messen kann ich das mit meinem ältlichen
Oszilloskop nicht, habe aber den Eindruck daß der Vorgang beim
Timerüberlauf kommt. Ein Compare Match findet also nicht statt, was auch
dadurch bestätigt wird daß ich beliebiges in OCR1B schreiben kann, ohne
das Ergebnis zu ändern. Hier die entsprechenden Codeteile:
1 | u16 pFlanke, periode;
|
2 | void interrupt_init(void)
|
3 | {
|
4 | //Timer1 16bit
|
5 | TCCR1A = 0x00; // Timer1, normal Port operation
|
6 | TCCR1B |= (1<<ICES1)|(1<<CS10)|(1<<CS11)|(1<<ICNC1);
|
7 | //(Vorteiler 64, capture on rising edge, Noise canceller
|
8 | TIMSK |= (1<<TICIE1); // Counter1, Input Capture, Interrupt Enable
|
9 | //Output Compare auf OC1B/PB2
|
10 | DDRB |= (1 << PB2); // Richtungsregister auf Ausgang
|
11 | TCCR1A |= (1 << COM1B0); // Toggle OC1B on Compare Match
|
12 | }
|
13 | ISR(TIMER1_CAPT_vect) // misst Periode in 16bit -> Weg, Geschwindigkeit
|
14 | {
|
15 | periode = ICR1 - pFlanke;
|
16 | pFlanke = ICR1;
|
17 | // Comp Match für Ausgang berechnen
|
18 | OCR1B = (2 * (periode));
|
19 | }
|
Die Variable <periode> wird an anderer Stelle ausgewertet und angezeigt.
Der Mega8 läuft mit 8MHz, mit dem Vorteiler und dem 16bit-Zähler ergibt
sich eine Überlaufperiode von ca. 0,5 Sekunden, was geschätzt dem
Ereignis an PB2 entspricht.
Warum wird OCR1B nicht ausgewertet, was habe ich übersehen?
Danke,
Micha