wie bekommt man einen delay in ein c Programm?

4 Antworten

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 

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);

}

hibas123  04.05.2016, 16:19

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

0
pasfabio 
Fragesteller
 04.05.2016, 16:22

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

0
pasfabio 
Fragesteller
 04.05.2016, 16:27

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..

0
hibas123  13.05.2016, 15:52
@pasfabio

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

0

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--){}

}

3v1lH4x0R  04.05.2016, 16:12

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

0

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

hibas123  04.05.2016, 16:16

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

0