_delay_ms seltsames Verhalten

OP #1408992
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
}
Gast #1409015
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);
#1409022
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.
Gast #1409033
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?
#1409161
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.

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