AtMega8, Periodendauer verlängern

OP Persönliche Seite #3544808
Lesenswert?

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
OP Persönliche Seite #3545445
Lesenswert?

Oliver schrieb:
> Der Pin toggelt einmal pro Timerumlauf. Der Wert in OCR ändert lediglich
> das Taktverhältnis.

Wo wäre das zu finden?

Auf Seite 97 steht
Table 36. Compare Output Mode, Non-PWM
COM1A1/COM1B1   COM1A0/COM1B0   Description
...
   0                   1        Toggle OC1A/OC1B on Compare Match

Das ist das was ich einstellte. Von toggeln beim Überlauf kann ich in 
diesem Mode nichts finden.

Weitere Hinweise?

Micha
OP Persönliche Seite #3545911
Lesenswert?

Oliver schrieb:
> Ein Compare Match kommt genau einmal pro Zählerumlauf vor. Ein
> Zählerumlauf dauert wie lange?

Ja, jetzt sind die Scheuklappen weg. So einfach und doch so nutzlos, was 
ich da programmierte. Danke für den Nasenstüber.

Also müsste ich wohl den Output Compare Interrupt nutzen und in der ISR 
gleich den nächsten Matchwert berechnen. Funktioniert sowas? Oder gibt 
es eine bessere Möglichkeit?

Micha
OP Persönliche Seite #3545950
Lesenswert?

Oliver schrieb:
> Was genau verstehst du denn unter "Periodendauer verlängern?"

Wie in meinem Eingangspost geschrieben, messe ich ein Rechtecksignal, 
dessen Periodendauer zwischen 4 und 400ms liegt.
Nun möchte ich ein Rechtecksignal erzeugen, dessen Periodendauer um 
einen Faktor x länger ist als das Eingangssignal.
Oder anders gesagt, die Frequenz des erzeugten Signals soll um 1/x 
niedriger liegen als die des gemessenen Signals.
Da der Faktor "krumm" ist (1,4), kann ich keinen externen 
Hardware-Frequenzteiler benutzen.

Micha

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