Forum: Mikrocontroller und Digitale Elektronik AtMega8, Periodendauer verlängern


von Micha H. (mlh) Benutzerseite


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

von standart (Gast)


Lesenswert?

volatile

von Oliver (Gast)


Lesenswert?

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

Oliver

von Amateur (Gast)


Lesenswert?

Vorsicht:
OCR1A und OCR1B sind nicht völlig unabhängig voneinander.
Es gibt ja nur ein Zählerregister.

von Micha H. (mlh) Benutzerseite


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

von Oliver (Gast)


Lesenswert?

Der Pin ändert bei jedem Compare Match seinen Wert. Das nennt man dann 
toggeln.

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

Oliver

von Micha H. (mlh) Benutzerseite


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

von Oliver (Gast)


Lesenswert?

Was genau verstehst du denn unter "Periodendauer verlängern?"

Wenn du ein periodisches Signal am Eingang hast, dann ist die Periode 
vorgeben. Was willst du da verlängern?

Oliver

von Micha H. (mlh) Benutzerseite


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

: Bearbeitet durch User
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.