Forum: Compiler & IDEs delay() oder wait() in C?


von Adam (Gast)


Lesenswert?

Hallo,
ich habe eine simple Frage. Wie ist der Befehl in C für wait() oder
delay().
Die beiden funktionieren nicht.
Oder das Synonym in assembler währe NOP()

MfG
Adam

von Karsten Brandt (Gast)


Lesenswert?

Wie Du bereits gesagt hast ist hier der Assembler-Befehl NOP gefragt.
Diesen solltest entweder direkt als inline-Assembler oder über eine
eigene C-Funktion (z.B. delay()) als inline-Assembler einfügen.

Auf vielen Systemen gibt es auch eine Funktion namens _no_operation()
o.ä. Auch diese kannst Du für ein Delay verwenden.

Ach'so für ein Delay solltest Du diese _no_operation()-Aufruf in einer
Schleife mehrfach aufrufen, um den gewünschten Effekt auch wirklich zu
erzielen. Aber das nur am Rande. Ich denke das hääte ich nicht erwähnen
brauchen, oder?

Karsten

von Adam (Gast)


Lesenswert?

Danke für deine Antwort,
ich bin nicht gerade der profi in C und habe mit inline Assembler noch
nie gearbeiten.
Könntest du mir vl. hinschreiben wie das aussen würde mit dem NOP in C?
:))

danke!

von -daniel- (Gast)


Lesenswert?

auf *unix Maschienen

       #include <unistd.h>

       unsigned int sleep(unsigned int seconds);
       void usleep(unsigned long usec);

C kann buildin sowas nicht anbieten, das ist OS spezifisch
spricht wenn du auf AVR 'sleep'en willst, muss du
avr spezifische headerfile includieren und dort eine
Funktion benutzen. Wenn du im Linux Kernel bist, so hast
du dort kein Zugriff auf libc, aber dort gibt es zB
udelay ..

hth, daniel

von Adam (Gast)


Lesenswert?

@daniel

wie du schon richtig sagst, handelt es sich um einen AVR.
Weißt du zufällig welche LIB so eine Funktion enthält und wie die
Funktion heißt?
MfG

von johnny.m (Gast)


Lesenswert?

Wenn Du vielleicht endlich mal erzählen könntest, um was für einen
Compiler es geht, wäre das sehr hilfreich. Für die AVRs gibts mehrere
Handvoll C-Compiler, die alle völlig anders da rangehen.

von Adam (Gast)


Lesenswert?

den GCC Compiler, der im Packet von WinAVR drin ist.

von johnny.m (Gast)


Lesenswert?

#include <util/delay.h> //(bei älteren Versionen avr/delay.h)

_delay_us(time_us)
/*Erzeugt Wartezeit in Mikrosekunden,
max. 768 µs / f_CPU[in MHz]*/

_delay_ms(time_ms)
/*Erzeugt Wartezeit in Millisekunden,
max. 262,14 ms / f_CPU[in MHz]*/

von Adam (Gast)


Lesenswert?

Danke! Funktioniert ;)

von Pete (Gast)


Lesenswert?

Ich kämpfe auch gerade mit der _delay_ms.

Heisst "max. 262,14 ms / f_CPU[in MHz]", dass ich bei 14 Mhz Takt nur
18ms (also _delay_ms(18)) angeben darf ?

von Pete (Gast)


Lesenswert?

Hat sich erledigt.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Ansonsten Antwort: ja, heißt es.

Die grundlegende Annahme ist, dass du für längere Delays über
kurz oder lang sowieso besser 'nen Timer nimmst.

von Jahn (Gast)


Lesenswert?

hier nen uiotat aus nen anderen thread... das ist so ne
inlineassembler-lösung :


ich hab mir vor kurzen das myAVRWorkpad PLUS zugelegt... das hat einen
C
und Assembler Codewizard mit warteroutinen rechner und der ist
ziemlich
päziese, dachte mal ich geb mein senf dazu hier mal ein beispiel:

Anforderung an den CodeWiz: Warteroutine 120 µs
hier der generierte C Code:

<c>
//--------------------------------------------------------------------
// Warte-Routine für 120 us
// die Routine wartet inclusive Aufruf 119,9 µs
// created by myAVR-CodeWizard
//--------------------------------------------------------------------
void myWait_120us()
{
   _asm_ volatile (
   "push   r16\n"
   "ldi   r16,1\n"
   "myWait_120us_3:\n"
   "push   r16\n"
   "ldi   r16,1\n"
   "myWait_120us_2:\n"
   "push   r16\n"
   "ldi   r16,139\n"
   "myWait_120us_1:\n"
   "dec   r16   \n"
   "brne   myWait_120us_1\n"
   "pop   r16   \n"
   "dec   r16   \n"
   "brne   myWait_120us_2\n"
   "pop   r16   \n"
   "dec   r16   \n"
   "brne   myWait_120us_3\n"
   "pop   r16   \n"
   );
}
</c>

man kann sich auch delay_ms und delay_us mit parameterübergabe
generieren lassen... die delays vom WIN-AVR (avrlibc) haben mich auch
schon verzweifeln lassen :-(

gruß Jahn

von johnny.m (Gast)


Lesenswert?

@Jahn:
Sag mal, kriegst Du von myAVR eigentlich Geld für die ganze Werbung?

von Jahn (Gast)


Lesenswert?

ja klar ;-) muss demnächst nen neues konto aufmachen weil das alte voll
ist :-/

von Robert (Gast)


Lesenswert?

Hallo, ich bin nun nach langer Suche in dem Forum endlich mal auf ne 
Thread gestoßen in beziehung auf die Delay() funktion. Ich habe schon 
ein bißchen probiert, bin aber noch unerfahren in der Programmierung und 
möchte nun 15ms delay haben, ich dachte mir mit _delay(15) geht es aber 
irgendwie muss ja der Takt mit einbezogen werden, der läuft bei meinem 
atmega8 auf 4MHz, und ich hab  da was gelesen mit  The maximal possible 
delay is 262.14 ms / F_CPU in MHz. aber wirklich weit hat mich das nicht 
gebracht, vielleicht kann mir jemand helfen meine 15ms delay zu 
erreichen,

mfg

Robert

von Johannes M. (johnny-m)


Lesenswert?

Wenn Du schon Uralt-Threads ausgräbst, dann lies sie auch durch! Mein 
Posting vom 22.06.2006, 13:39, enthält wirklich ALLE Infos, die man 
braucht!

von ... (Gast)


Lesenswert?

... mit Außnahme von einer :)

Das Makro "F_CPU" muß mit dem korrekten Wert definiert sein!!!

Entweder im Makefile, direkt im Code oder bei Verwendung von AVRStudio 
in den Profekt-Optionen. Standardmäßig steht das auf 1MHz 
(F_CPU=1000000).

CU

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.