Kleine _delay_ms() und _delay_us() Verständnissfrage

Gast #1318985
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?
Gast #1319008
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?
#1319018
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
#1319298
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren