www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik _delay_ms seltsames Verhalten


Autor: Johannes H. (menschenskind)
Datum:

Bewertung
0 lesenswert
nicht 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?
void LED_EVENT(unsigned int Speed){

    LED_PORT |= (1<<PD4);     
    _delay_ms (Speed);
    LED_PORT &=~ (1<<PD4);
    _delay_ms (Speed);
}

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert es wenn du anstelle "Speed" den Wert manuell einsetzt?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Funktioniert es wenn du anstelle "Speed" den Wert manuell einsetzt?

Mit Sicherheit. _delay_ms() mag nur konstante Werte.

Autor: Johannes H. (menschenskind)
Datum:

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

Autor: holger (Gast)
Datum:

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

_delay_ms() funktioniert nicht mit Variablen!

Autor: Johannes H. (menschenskind)
Datum:

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

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Johannes H. (menschenskind)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Johannes H. (menschenskind)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.