Forum: Compiler & IDEs Kleine _delay_ms() und _delay_us() Verständnissfrage


von Martin (Gast)


Lesenswert?

Hallo,

ich nutze einen ATmega32 mit 16 MHz Quarz.

Ich habe mir die Beschreibung zu den Funktionen _delay_ms() und 
_delay_us() in der Reference angeguckt.
http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html

Verstehe ich das nun richtig das ich bei _delay_ms() einen Wert von 
maximal 262.14 ms / F_CPU in MHz = 16,38375 aufrufen soll. Wenn ich 
einen höheren nehme dann beträgt die Genauigkeit "nurnoch" 1/10 ms. Also 
wäre ein Aufruf von _delay_ms(1000) (oder 500 oder 250 etc.) kein 
Problem.

Bei _delay_us() sollte der Wert maximal 768 us / F_CPU in MHz = 48 
betrage, ansonsten wird _delay_ms() genutzt. Sollte ich daher aus 
_delay_us(50) dann lieber
1
_delay_us(25);
2
_delay_us(25);
machen und aus _delay_us(60) dann halt
1
_delay_us(25);
2
_delay_us(25);
3
_delay_us(10);
machen?

Oder wie baue ich am Besten eine Wartezeit (in der nichts Anderes 
abgearbeitet werden muss) mit "hohen" Zeiten?

: Verschoben durch Admin
von Alex G. (alex94) Benutzerseite


Lesenswert?

Hallo,

>wäre ein Aufruf von _delay_ms(1000) (oder 500 oder 250 etc.) kein
>Problem.

ja das ist kein problem.

mfg alex

von H. Lektor (Gast)


Lesenswert?

Verständnis schreibt man ohne ss.

von Martin (Gast)


Lesenswert?

Danke @ Alex

Würde denn auch _delay_us(100) funktionieren, da dies ja auch den 
Maximalwert überschreitet? Oder muss ich das dann wirklich aufbröseln in 
mehrere _delay_us() Aufrufe mit maximal 48?

von Jörg G. (joergderxte)


Lesenswert?

In der Avr-libc-doku (dein Link) steht, dass:
1) _delay_us() auf _delay_ms() ausweicht, wenn du länger als 768/F_CPU 
[Mhz] µs warten willst.
2) _delay_ms() nur noch auf 0,1ms aufgelöst wird, wenn du länger als 
262,14/ F_CPU [MHz] ms warten willst.
Da 2) bei dir nicht der Fall ist, gibt's doch kein Problem.

hth, Jörg

von Martin (Gast)


Lesenswert?

Ahjo also aus _delay_us(100) würde dann _delay_ms(0.1) werden?

von kurz (Gast)


Lesenswert?

Welche Präzision willst Du denn erreichen ?

Vielleicht ist ein Timer mit einer Variablen im Interrupt die bessere 
Lösung?

von Martin (Gast)


Lesenswert?

Wie genau das Ganze wirklich sein muss weiß ich nicht. Sind die 
Delayfunktionen denn nicht wirklich genau?

von Simon K. (simon) Benutzerseite


Lesenswert?

Jörg G. schrieb:
> 2) _delay_ms() nur noch auf 0,1ms aufgelöst wird, wenn du länger als
> 262,14/ F_CPU [MHz] ms warten willst.
> Da 2) bei dir nicht der Fall ist, gibt's doch kein Problem.

von Sven P. (Gast)


Lesenswert?

Martin schrieb:
> Wie genau das Ganze wirklich sein muss weiß ich nicht. Sind die
> Delayfunktionen denn nicht wirklich genau?

Nein.

von Falk B. (falk)


Lesenswert?

@Martin (Gast)

>Wie genau das Ganze wirklich sein muss weiß ich nicht.

Aha, aber Terror machen . . .

> Sind die
>Delayfunktionen denn nicht wirklich genau?

Sie sind so genau wie angegeben. Die _delay_us() und delay_ms() arbeiten 
prinzipbedingt auf ~3 CPU Takte genau. _delay_ms() bei grossen Werten 
halt auf 0,1ms genau.

MFG
Falk

von Rolf Magnus (Gast)


Lesenswert?

Das gilt allerdings nur, wenn während des Delays keine Interrupts 
auftreten.

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.