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
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
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!
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
@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
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.
#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]*/
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 ?
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.
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
@Jahn: Sag mal, kriegst Du von myAVR eigentlich Geld für die ganze Werbung?
ja klar ;-) muss demnächst nen neues konto aufmachen weil das alte voll ist :-/
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
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!
... 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.