Forum: Mikrocontroller und Digitale Elektronik _delay_ms seltsames Verhalten


von Johannes (menschenskind)


Lesenswert?

Hallo

Ich nutze die delay-Funktion beim LED-Blinken.

Nun ist es so, dass die LED beim Aufruf meiner Funktion mit 256 als 
Speed noch blinkt, ab 255 ist aber Schicht im Schacht, denn ab da und 
drunter leuchtet die LED die ganze Zeit.
Hängt ja offensichtlich mit 8 Bit zusammen. Aber ich hab ja mit unsigned 
int genügend Platz.
Werdet ihr daraus schlau?
1
void LED_EVENT(unsigned int Speed){
2
3
    LED_PORT |= (1<<PD4);     
4
    _delay_ms (Speed);
5
    LED_PORT &=~ (1<<PD4);
6
    _delay_ms (Speed);
7
}

von Tom (Gast)


Lesenswert?

Funktioniert es wenn du anstelle "Speed" den Wert manuell einsetzt?

von holger (Gast)


Lesenswert?

>Funktioniert es wenn du anstelle "Speed" den Wert manuell einsetzt?

Mit Sicherheit. _delay_ms() mag nur konstante Werte.

von Johannes (menschenskind)


Lesenswert?

Jo, das funktioniert seltsamerweise.
Also klappt was nicht bei der Übergabe des Wertes.

von holger (Gast)


Lesenswert?

>Jo, das funktioniert seltsamerweise.
>Also klappt was nicht bei der Übergabe des Wertes.

_delay_ms() funktioniert nicht mit Variablen!

von Johannes (menschenskind)


Lesenswert?

Aber ich hab es doch die ganze Zeit schon so gemacht.
Alles von 256 bis min 5000 klappt wunderbar.

von Johannes (Gast)


Lesenswert?

_delay_ms() ist ein Macro, das verträgt nur Konstanten, wie Holger schon 
sagte. Vom Compiler werden die Float-Berechnungen eliminiert - das 
klappt nicht, wenn Du Variablen benutzt. Rtfm.

Einfache Lösung:

int i;
for(i=0;i<Speed;i++) _delay_ms(1);

von Johannes (menschenskind)


Lesenswert?

Naja, für alle Werte oberhalb 255 funktioniert's jedenfalls, da könnt 
ihr sagen, was ihr wollt.

von (prx) A. K. (prx)


Lesenswert?

Die Rechnung ist die gleiche, ob konstant oder nicht, und bei 
Wartezeiten in sichtbaren Sphären spielt die Rechenzeit für die 
Fliesskommaberechnung keine massgebliche Rolle mehr. Und wenn du noch 
genug Platz im ROM hast, dann sind auch die KB für die 
Fliesskommaroutinen kein Problem.

von holger (Gast)


Lesenswert?

>Und wenn du noch
>genug Platz im ROM hast, dann sind auch die KB für die
>Fliesskommaroutinen kein Problem.

Für unbenutzes Flash bekommt man ja auch kein Geld zurück ;)

@ Johannes

Wie groß ist dein Miniprogramm denn jetzt so?

von Johannes (menschenskind)


Lesenswert?

Hallo A.K. Könntest du mir deinen Post bitte noch etwas näher ausführen?
Mit Fließkommaberechnung  und den zusätzlichen Routinen kann ich grad 
nix anfangen.

von (prx) A. K. (prx)


Lesenswert?

Schau mal in die Implementierung der Delay-Routinen im delay.h rein, 
dann könnte sich der Dunst lichten.

von Karl H. (kbuchegg)


Lesenswert?

Johannes Hofmann schrieb:
> Hallo A.K. Könntest du mir deinen Post bitte noch etwas näher ausführen?

Die Berechnung an sich dauert immer ungefäähr gleich lang. Sagen wir 
einfach mal 1ms.
Ist deine Wartezeit 5000ms, dann sind diese zusätzlichen 1ms zu 
vernachlässigen. Kein Mensch kann mit freien Auge sehen, ob das jetzt 
5.0 oder 5.001 Sekunden sind.
Ist deine Wartezeit aber 10ms, dann sind die zusätzlichen 1ms durch die 
Berechnung nicht mehr zu vernachlässigen.

von Falk B. (falk)


Lesenswert?


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.