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

OP 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
#3989140
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?
#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.
OP 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!
OP 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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.