[Frage] C++ _delay_ms im timer1 & PWM in timer0

Persönliche Seite #3989024
Lesenswert?

Hi,

ich vermute zwar, dass mein Problem erst mit der kompletten Codesichtung 
(Helfer dürfen sich gerne per PN kurz melden) zu lösen ist, jedoch 
versuch ich mal meine Vermutungen zu erläutern.

1. Mein Programm läuft zu 100% in der aktuellen Version.
2. Es handelt sich um einen Atmega88, der mittels SoftPWM ein 
Mosfet(DC-Motor) im timer0 treibt. Die Auflösung ist 10Stufig. Timer1 
ist auf 1Sekunden-Intervall eingestellt und beinhaltet lediglich die 
Veränderung des Stufenwertes von 0 auf 10 und zurück. (Der Motor soll 
etwas gedämpft anlaufen und abbremsen)

3. Nun gibt es auch noch 2 Relais, die eine Umpolung bewirken. Bevor 
dies geschieht soll der Motor noch auslaufen können. Ein simples 
zusätzliches Warten nachdem der Motor auf Stufe 0 runtergefahren wurde 
sollte meines Erachtens reichen.

Das Problem:
setze ich in den Funktionsablauf (zur Erinnerung: im timer1=1sec) ein 
_delay_ms(5000) ein, dann gibt es einen ziemlich unschönen Seiteneffekt.
Das Mosfet haut noch mal die vollen 100% in den Motor bis die Relais 
schließlich schalten. Vermutlich bleibt der On-Zustand des Pins für den 
Mosfet während des _delay_ms hängen. Jedoch wurde vorher bereits auf 
Stufe 0 gefahren, weshalb mit dies nicht schlüssig erscheint.

Kann sich Jemand denken, was dort schief laufen könnte, oder wo mein 
Denkfehler liegt?

Den Code möchte ich hier nicht posten, weil er dann für immer online 
ist. Außerdem gibt es keinerlei Hexenwerk, wovon noch Jemand lernen 
könnte.

Grüße Oekel
#3989153
Lesenswert?

Ralf G. schrieb:
> P.S.:
> Hmm. '_delay_ms(5000)' geht das überhaupt? Gab's da nicht so eine
> F_CPU-abhängige Obergrenze?
The maximal possible delay is 262.14 ms / F_CPU in MHz.
When the user request delay which exceed the maximum possible one, 
_delay_ms() provides a decreased resolution functionality. In this mode 
_delay_ms() will work with a resolution of 1/10 ms, providing delays up 
to 6.5535 seconds (independent from CPU frequency). The user will not be 
informed about decreased resolution.
Persönliche Seite #3989221
Lesenswert?

Timmo H. schrieb:
> The maximal possible delay is 262.14 ms / F_CPU in MHz.
...
> _delay_ms() will work with a resolution of 1/10 ms, providing delays up
> to 6.5535 seconds (independent from CPU frequency). The user will not be
> informed about decreased resolution.

War bekannt, habe die Doku auch gelesen. Aber wer round About 
4-6Sekunden verzögerung braucht, den jucken 1/10 ms eher weniger.

@ralg: Den Simulator habe ich noch nie genutzt. Wird wohl höchste Zeit.
Danke!
Persönliche Seite #3989895
Lesenswert?

Teo Derix schrieb:
> Dann schmeiß halt das mistige delay raus, hast den Timer ja eh schon am
> laufen!

Machmal möchte man/ich nicht nur das WorkArround benutzen, sondern 
verstehen wo der Fehler wirklich liegt ;)

@Admins: Erstaunlich, dass ihr euch den Stress mit den "feigen" Gästen 
hier immer noch antut.

Evtl. noch ein barmherziger Samariter unterwegs, der sich das mal 
anschauen möchte. Eilt auch nicht, möchte nur langfristig draus lernen. 
(400 Zeilen Code, relativ sauber strukturiert)

Grüße Oekel
#3989905
Lesenswert?

D a v i d K. schrieb:
> Machmal möchte man/ich nicht nur das WorkArround benutzen, sondern
> verstehen wo der Fehler wirklich liegt ;)

Ok, kann ich mehr als verstehen :)

D a v i d K. schrieb:
> Evtl. noch ein barmherziger Samariter unterwegs, der sich das mal
> anschauen möchte. Eilt auch nicht, möchte nur langfristig draus lernen.
> (400 Zeilen Code, relativ sauber strukturiert)

Warum diese Geheimhaltung?
Post den Mist und es werden sich mehr dazu äußern als Dir lieb ist...
Ähhh... 8-}

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