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

}


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

hibas123  13.05.2016, 15:52
@pasfabio

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

pasfabio 
Beitragsersteller
 04.05.2016, 16:22

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

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

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

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