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 ?
4 Antworten
![](https://images.gutefrage.net/media/user/hypergerd/1444746519_nmmslarge.jpg?v=1444746519000)
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
![](https://images.gutefrage.net/media/default/user/12_nmmslarge.png?v=1551279448000)
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);
}
![](https://images.gutefrage.net/media/user/pasfabio/1420410561017_nmmslarge.jpg?v=1420410561000)
der compiler meckert bei lib rum "no such file or directory"
![](https://images.gutefrage.net/media/default/user/8_nmmslarge.png?v=1551279448000)
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
![](https://images.gutefrage.net/media/default/user/8_nmmslarge.png?v=1551279448000)
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--){}
}
![](https://images.gutefrage.net/media/default/user/10_nmmslarge.png?v=1551279448000)
In die Bedingung gehört >=... Sonst muss man die Tick anzahl negativ angeben. Dies ist verwirrend
![](https://images.gutefrage.net/media/default/user/8_nmmslarge.png?v=1551279448000)
![](https://images.gutefrage.net/media/default/user/10_nmmslarge.png?v=1551279448000)
Die Funktion die du suchst heisst delay. Parameter: Zeit in Millisekunden.
![](https://images.gutefrage.net/media/default/user/8_nmmslarge.png?v=1551279448000)
Er benutzt ja nicht Arduino sondern C. Da gibt es von haus aus keine Delay funktion
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..