in der delay.h ist sowohl eine
delay_loop(X)
die X*3 prozessorzyklen wartet
als auch eine sleep_us, die in mikrosekunden wartet, dafür muss man die frequenz des controllers mit in den projekteinstellungen angeben!
Hallo
Ich hab jetzt gleich noch eine weitere Frage, mache dafür aber nicht extra einen weiteren Thread auf. In diesem Artikel von RN-Wissen wird gezeigt wie man eine LED blinken lassen kann ohne Timer:
https://www.roboternetz.de/wissen/in...ken_ohne_Timer
Dort wird die Funktion sleep_ms () benuzt. Und die drei Bibliotheken:
<avr/io.h>
<util/delay.h>
<stdint.h>
Ist diese Funktion in einer diesen Bibliotheken bereits definiert? Also in avr/io soweit cih weiss nicht... aber vielleicht in einer anderen? Und kann man diese Funktion, wenn man die oberen Bibliotheken "inkludiert" hat, einfach benutzen?
Jedoch wird sie im Programm am Anfang nochmal dekliniert mit:
void sleep_ms(uint16_t ms);
Ist es notwendig, des zu machen?
Karl
in der delay.h ist sowohl eine
delay_loop(X)
die X*3 prozessorzyklen wartet
als auch eine sleep_us, die in mikrosekunden wartet, dafür muss man die frequenz des controllers mit in den projekteinstellungen angeben!
Das ist nicht ganz richtig...
In der delay.h gibt es keine Funktion sleep_ms(), dafür allerdings eine Funktion _delay_ms().
Nachteil dieser _delay_ms() ist, dass man damit maximal
262.14 ms / F_CPU in MHz
warten kann. Bei einem Takt von 8 MHz also gerade mal 32,768 ms.
In dem Beispielprogramm wurde deswegen die Funktion sleep_ms() eingebaut, die in einer Schleife die Funktion _delay_ms(1) aufruft und somit das Problem behebt.
Die Funktion findest Du im Beispiel unter der main()
Gruß,
askazo
Hallo
Aber warum wird das Problem mit der Schleife behebt? Das ganze wartet dann einfach eine ms länger.
Und warum ist die Funktion mit delay ms soweit unten beim Programm? Müsste das nicht vor dem LEDblinken sein?
Grüsse!
ja das war ein wenig voreilig und falsch erinnertIn der delay.h gibt es keine Funktion sleep_ms(), dafür allerdings eine Funktion _delay_ms().
Aber warum wird das Problem mit der Schleife behebt? Das ganze wartet dann einfach eine ms länger.Code:/** \ingroup util_delay Perform a delay of \c __us microseconds, using _delay_loop_1(). The macro F_CPU is supposed to be defined to a constant defining the CPU clock frequency (in Hertz). The maximal possible delay is 768 us / F_CPU in MHz. If the user requests a delay greater than the maximal possible one, _delay_us() will automatically call _delay_ms() instead. The user will not be informed about this case. */das limit liegt also bei 6.5 sekundenCode:/** \ingroup util_delay Perform a delay of \c __ms milliseconds, using _delay_loop_2(). The macro F_CPU is supposed to be defined to a constant defining the CPU clock frequency (in Hertz). The maximal possible delay is 262.14 ms / F_CPU in MHz. When the user request delay which exceed the maximum possible one, _delay_ms() provides a decreased resolution functionality. In this mode _delay_ms() will work with a resolution of 1/10 ms, providing delays up to 6.5535 seconds (independent from CPU frequency). The user will not be informed about decreased resolution. */
mit verringerter auflösung
Gut, das ganze mal ausführlicher:
Mal angenommen, wir haben einen Takt von 8 MHz. Dann könnte mit der Funktion _delay_ms() bei einem Aufruf eine maximale Wartezeit von ~32ms erreicht werden. Wenn wir nun eine ganze Sekunde warten wollen, müssten wir _delay_ms() mehrmals hintereinander aufrufen.
Genau das macht die Funktion sleep_ms() mit einer Schleife. Damit das ganze verständlich bleibt, wird in der Schleife genau 1ms gewartet und das ganze n-mal widerholt. Somit erreichen wir durch den Befehl sleep_ms(1000) eine Wartezeit von ziemlich genau 1000ms, also eine Sekunde.
An welcher Stelle im Programm die eigentliche Funktion steht, ist egal und bleibt dem Stil des Programmierers überlassen. Sie kann also vor oder hinter der Stelle stehen, an der sie aufgerufen wird.
Wichtig ist nur, dass die Deklaration, also der Prototyp der Funktion vor dem Aufruf steht.
[edit]Das war mir auch neu...interessant!When the user request delay which exceed the maximum possible one, _delay_ms() provides a decreased resolution functionality. In this mode _delay_ms() will work with a resolution of 1/10 ms, providing delays up to 6.5535 seconds (independent from CPU frequency)
Danke für die Info.,
[/edit]
Gruß,
askazo
Hallo.
Danke für die ausführliche Antwort. Jetzt verstehe ich das mit der Funktion sleep_ms...
sleep_ms wird ja als Funktion definiert mit:
sleep_ms (uint16_t ms)
Für was steht das uint16_t? Ich konnte diese Frage leider nicht übers Netz beantworten und hab auch schon im C-Tutorial danach gesucht, aber es wird oft benutzt aber leider nicht gesagt für was es ist, ich schätze mal das ist so weil es eine ziemlich simple Bedeutung hat...
Karl
UnsignedINTeger16bit_Typedef
also n vorzeichenloser 16bit integer, Typedef steht für benutzerdefinierter datentyp
Ich würde dir nur raten dich trotzdem mit Timer zu beschäftigen.
In der Zeit in der das sleep_ms() oder _delay_ms() durchlaufen wird, kann das Programm nichts anderes machen. Du kannst in der Zeit keine Taste abfragen und nichts ansteuern. Unterbrechen kannst du das nur mit Interrupts.
Hallo.
Ich bin mich zurzeit auch sehr stark mit Timern am beschäftigen, versteh aber irgendwie nicht alles... ich kenn auch nur das Mikrocontroller.net Tut. von den Timern und das auf RN-Wiki. Gibts dazu vielleicht ein Buch oder ein sehr ausführliches anderes Tutorial?
Mein Ziel wäre es eben schlussendlich ein Servo ansteuern zu können.
Grüsse!
Lesezeichen