Forum: Mikrocontroller und Digitale Elektronik [Frage] C++ _delay_ms im timer1 & PWM in timer0


von D a v i d K. (oekel) Benutzerseite


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

: Verschoben durch User
von Ralf G. (ralg)


Lesenswert?

Wie immer: Zeile 42

von D a v i d K. (oekel) Benutzerseite


Lesenswert?

Ralf G. schrieb:
> Wie immer: Zeile 42

Sehr witzig #define ANTWORT_AUF_ALLES 42; hab ich sicherheitshalber 
immer in Zeile 1!

Darf ich dir den Code  zusenden und du schaust mal rein, oder wolltest 
du dich nur über mich lustig machen?

von Oliver S. (oliverso)


Lesenswert?

D a v i d K. schrieb:
> 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.

Tja, deine Entscheidung. Entweder posten, und Hilfe bekommen, oder sein 
lassen, und Zeile 42 selber suchen.

Überlegs dir...

Oliver

von Ralf G. (ralg)


Lesenswert?

Schick's doch mal durch den Simulator.
Und zwar mit angepassten Zeiten. Also 10stufige Auflösung mit 1ms, delay 
mit 5ms. [ Damit du da heute noch durchkommst ;-) ]

P.S.:
Hmm. '_delay_ms(5000)' geht das überhaupt? Gab's da nicht so eine 
F_CPU-abhängige Obergrenze?

von Timmo H. (masterfx)


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.

von D a v i d K. (oekel) Benutzerseite


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!

von Ralf G. (ralg)


Lesenswert?

Timmo H. schrieb:
> The user will not be informed about decreased resolution.
Ach so, es ging da nur um die Genauigkeit...

von Teo D. (teoderix)


Lesenswert?

D a v i d K. schrieb:
> setze ich in den Funktionsablauf (zur Erinnerung: im timer1=1sec) ein
> _delay_ms(5000) ein, dann gibt es einen ziemlich unschönen Seiteneffekt.

Dann schmeiß halt das mistige delay raus, hast den Timer ja eh schon am 
laufen!

von D a v i d K. (oekel) Benutzerseite


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

von Teo D. (teoderix)


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-}

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.