delay() oder wait() in C?

Gast #366621
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
Gast #366622
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!
Gast #366623
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
Gast #366627
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]*/
Gast #366632
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
Gast #650446
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
Gast #651780
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren