Forum: Mikrocontroller und Digitale Elektronik AVR Rechteck ausgeben und selten verzögern


von AVR Laie (Gast)


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

von spontan (Gast)


Lesenswert?

Was gefällt Dir daran nicht?

von AVR Laie (Gast)


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.

von Dave C. (dave_chappelle)


Angehängte Dateien:

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

von AVR Laie (Gast)


Lesenswert?

Dave Chappelle schrieb:
> Das ist keine eindeutige Aussage..

Da hast du Recht.
Danke für die Mühe, womit hast du so schnell die Zeichnung gemacht?
Ich brauche den oberen Ablauf.

von Dave C. (dave_chappelle)


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.

von AVR Laie (Gast)


Lesenswert?

Super, vielen Dank!
Dann werde ich das so machen.

Gruß

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.