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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Micha H. (mlh) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
volatile

von Oliver (Gast)


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

Oliver

von Amateur (Gast)


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

von Micha H. (mlh) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.