Frage von pasfabio, 39

wie bekommt man einen delay in ein c Programm?

Hallo Ich habe mir ein Video über den arduino angesehen. In dem Video wurde eine LED mit einer Sekunde Verzögerung ein und aus geschaltet. Ich hab versucht das ganze in C nach zu bauen aber scheitere am delay. Ich hab keine lib gefunden in der das möglich ist. Kann jemand helfen ?

Antwort
von hypergerd, 9

Es gibt 4 grobe Wege, um zeitgesteuert Code abzuarbeiten:

a) Schleife mit festen Befehlen (siehe Vorschlag hibas123) mit 2 großen Nachteilen: 1. muss die Zeitmessung der Hardware angepasst werden und 2. zieht dieses "Warten auf CPU-Abarbeitung" genau 100% CPU-Last für 1 Kern

Vorteil: Abbruch-Stelle kann eingebaut werden

b) delay & sleep-Wege: http://ubuntuforums.org/showthread.php?t=1357606

https://msdn.microsoft.com/de-de/library/windows/desktop/ms686298(v=vs.85).aspx

Vorteil: während des Wartens 0% CPU-Last für diesen Thread; Hardware-unabhängig; kurzer Code

Nachteil: während des Wartens kein Abbruch möglich!! (höchstens wenn ein 2. Thread diesen ersten Thread hart beendet; oder 2 Schleifen mit mehreren kurzen sleep)

c) Timer: statt in einer Codezeile zu warten, definiert man einen Timer, der zu bestimmten Zeiten Ereignisse auslöst und die Zustände (Deine LED) definiert ändert -> auch 0% CPU-Last -> dafür erlaubt der Code jedoch während des Wartens andere Dinge (weitere Timer) oder einen vorzeitigen Abbruch!

d) Multitasking: noch mehr Freiheiten und noch genauer (bis zu µs), aber auch noch komplizierter 

Antwort
von hibas123, 28

Fu brauchst nicht direkt eine delay funktion. Du musst deinem Prozessor in der zeit einfach irgendetwas zu machen geben. Ich würde ne einfache for funktion schreiben:

Funkt(int ticks){

For(;ticks <=0;ticks--){}

}

Kommentar von 3v1lH4x0R ,

In die Bedingung gehört >=... Sonst muss man die Tick anzahl negativ angeben. Dies ist verwirrend

Kommentar von hibas123 ,

sorry mein Fehler :D

Antwort
von 3v1lH4x0R, 21

Die Funktion die du suchst heisst delay. Parameter: Zeit in Millisekunden.

Kommentar von hibas123 ,

Er benutzt ja nicht Arduino sondern C. Da gibt es von haus aus keine Delay funktion

Antwort
von Mahaf38, 19

Die Library wäre:

util/delay.h

und die zugehörigen Funktionen:

_delay_ms() für Millisekunden
_delay_us() für Mikrosekunden

Also in etwa:

#include <util/delay.h>

while(1){

_delay_ms(1000);

}

Kommentar von hibas123 ,

Kommt drauf an welches C er verwendet. Meine lösung ist universell. Die benötigte Zeit kann man sich mithilfe der Tacktrate und der anzahl an befehlen ausrechnen

Kommentar von pasfabio ,

der compiler meckert bei lib rum "no such file or directory"

Kommentar von pasfabio ,

int led = 0;

while (led<3) {

led = led+1;

printf("%i\n, led);

delay(3000);

led = led -1;

printf("%i\n, led);

}


das ist das wichtigste...ich kann den code nicht rein kopieren aus irgendwelchen gründen..

Kommentar von hibas123 ,

Benutz du Atmel-Studio dafür oder irgendeinen anderen C-Compiler mit eigenen Librarys?

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten