mikrocontroller.net

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


Autor: Adam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karsten Brandt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Adam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: -daniel- (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Adam (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Adam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
den GCC Compiler, der im Packet von WinAVR drin ist.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]*/

Autor: Adam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke! Funktioniert ;)

Autor: Pete (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Pete (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sich erledigt.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jahn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: johnny.m (Gast)
Datum:

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

Autor: Jahn (Gast)
Datum:

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

Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.