AVR Rechteck ausgeben und selten verzögern

Gast #3217418
Lesenswert?

Hallo,
ich würde gerne an einem Pin eines ATmega32M1 ein Rechtecksignal mit 
einer Frequenz von ca. 100kHz und einem Ein-Aus-Verhältnis von 1/1 
ausgeben.
Machmal soll jedoch eine Flanke verzögert oder früher kommen. Danach 
soll jedoch die Frequenz wieder stimmen.
Meine Idee ist jetzt den Timer im im CTC Modus laufen zu lassen und in 
dem Falle der Änderung den das OCR0A Register zu ändern, den Interrupt 
zu aktivieren und in der ISR den Wert wieder zurück zu setzten.
Fällt euch eine bessere Lösung ein?

Vielen Dank

Simon
Gast #3217480
Lesenswert?

Ich bin nicht sicher ob dies die zeitlich optimale Lösung ist.
Gibt es vielleicht noch einen PWM Modus der dies eleganter löst?
Ein anderer Weg wäre den Zählerwert selbst zu manipulieren.
Den müßte man "nur" auslesen, verändern und wieder zrück schreiben. 
dafür würde jedoch die ISR wegfallen.
#3217531
Lesenswert?

AVR Laie schrieb im Beitrag #3217418:
> Machmal soll jedoch eine Flanke verzögert oder früher kommen. Danach
> soll jedoch die Frequenz wieder stimmen.

Das ist keine eindeutige Aussage..
Wenn eine Flanke zu früh kommt, soll sie dann dafür kürzer sein als die 
anderen "on-Phasen" oder soll sie gleich lang sein wie alle normalen 
"on-Phasen"?

Siehe dazu auch meine Abbildung im Anhang.

Gruss
Angehängte Dateien:
#3217598
Lesenswert?

AVR Laie schrieb im Beitrag #3217584:
> Danke für die Mühe, womit hast du so schnell die Zeichnung gemacht?

Kein Problem :)
Darf es fast nicht sagen aber solche einfachen Zeichnungen erstelle ich 
mit Eagle :)

Auch einfache Blockdiagramme etc. lassen sich damit meiner Meinung mach 
in einer angemessenen Zeit realisieren.

Was du brauchst ist wie schon erwähnt die CTC Funktion des Timers.
Bei jedem Erreichen des Compare-Wertes Toggelst du einen Pin. Wenn du 
einen Takt früher/später auftreten lassen möchtest, musst du lediglich 
den Compare-Wert ändern. Da der versetzte Takt aber die gleiche Länge 
haben sollte wie alle anderen, musst du in dem Moment in dem die 
aufsteigende Flanke der verzögerten/nacheilenden auftritt den Compare 
Wert gleich wieder auf deinen Anfangswert setzen.

Gibt bestimmt noch andere Lösungen, so würde ich aber vorgehen.

Gruss

EDIT: Habe mir gerade nochmals das Anfangsposting durchgelesen, das ist 
ja eig. schon deine Idee. Ich würde also auch so vorgehen wie du.

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