Forum: Compiler & IDEs Delay in avr-gcc


von Sebastian Schabbach (Gast)


Lesenswert?

Hallo.

Ich habe mal eine Frage zum Delay. Habe mir die anderen Beiträge auch
schon durchgeschaut aber keine Lösung auf mein Problem gefunden. ich
habe die delay.h eingebunden (in ihr sind 2 Funktionen heissen
irgendwie so _delay_loop_1 und _delay_loop_2. ). Allerdings wenn ich
nun eine dieser Funktionen aufrufe (z.B. mit 10000), dann passiert
überhaupt nix. Muss in in irgendwelchen Headern noch was setzen oder
wie ist das zu erklären?

von OldBug (Gast)


Lesenswert?

_delay_loop_1 ist nicht in der Lage, einen Wert von "10000" zu
verarbeiten, maximal 255.

_delay_loop_2 kann bis 65535.

Die Doku der avr-libc enthält seit neuestem auch ein bißchen Text über
diese beiden Funktionen (ja, sie sind auch in der neuen avr-libc
implementiert und es gibt noch zwei zusätzliche).

von Sebastian Schabbach (Gast)


Lesenswert?

Hmmm,

ich sehe gerade, dass der Zeitraum des delays dort in "Zyklen"
angegeben ist. Gibt es auch eine Möglichkeit, das ganze in ms
anzugeben? Was mache ich denn ich z.B. 1000 ms, also 1 Sekunde, warten
will?

von Rufus T. Firefly (Gast)


Lesenswert?

Vorher ausrechnen, wieviele Zyklen eine Millisekunde sind. Das hängt vom
Prozessortakt ab.

Alternative: Timer verwenden.

von OldBug (Gast)


Lesenswert?

Ich verweise ja nicht umsonst auf die Doku...

Hättest Du die gelesen, könntest Du diese Frage selber beantworten!

--8<--
zu _delay_loop_1:

Delay loop using an 8-bit counter __count, so up to 256 iterations are
possible. (The value 256 would have to be passed as 0.) The loop
executes three CPU cycles per iteration, not including the overhead the
compiler needs to setup the counter register.

Thus, at a CPU speed of 1 MHz, delays of up to 768 microseconds can be
achieved.
-->8--

von Jörg Wunsch (Gast)


Lesenswert?

Außerdem: neueste Doku lesen. ;-)

_inline_ void _delay_ms (double __ms)

Perform a delay of __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.

von Sebastian Schabbach (Gast)


Lesenswert?

ja das habe ich mir auch schon durchgelesen....

aber erstens finde ich keine funktion _delay_ms, und zweitens will ich
eventuell zumindest testweise delays von > 1000 ms erreichen.


Gruß Sebastian

von Jörg Wunsch (Gast)


Lesenswert?

> aber erstens finde ich keine funktion _delay_ms

Vielleicht ist deine Bibliotheksversion zu alt?  Das ist neu in 1.2.x.
Im GCC-Forum von http://www.avrfreaks.net/ gibt's ein Announcment für
eine private Portierung von avr-libc 1.2.1 für WinAVR (zum
Drüberinstallieren).

> zweitens will ich eventuell zumindest testweise delays von > 1000 ms
> erreichen

Dann lies dir bitte zuerst mal die Kommentare dafür durch: spin-loop
delays (also eine Schleife, die einfach nur die CPU beschäftigt) sind
für sehr kurze Verzögerungen geeignet.  Alles andere macht man mit
einem Timer, dafür sind die da.

Danach kannst du es ja immer noch mit Selbst-drüber-Nachdenken
probieren ;-) und einfach noch eine äußere Schleife drumrumwickeln,
wenn du's partout mit einem delay statt einem Timer machen willst.

von Frank Jonischkies (Gast)


Lesenswert?

Hallo,

Bisher wurde ja immer SYSCLK für die Taktfrequenz verwendet. Ist auch
noch so in dem TWI Beispiel von Jörg. Warum wird nun noch F_CPU
eingeführt?

Gruß
Frank

von Jörg Wunsch (Gast)


Lesenswert?

SYSCLK war meine private Erfindung, F_CPU schien mir eher der Konsens
vieler Leute zu sein.  Aber du hast Recht, ich sollte das twidemo auch
ändern.  Da ich gerade nicht dazu komme, das sofort zu tun: kannst du
bitte einen Bugreport aufmachen, damit es nicht in Vergessenheit
gerät?

von Frank Jonischkies (Gast)


Lesenswert?

Done, ItemID  #11817

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.