www.mikrocontroller.net

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


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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__...

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
_delay_us(25);
_delay_us(25);
machen und aus _delay_us(60) dann halt
_delay_us(25);
_delay_us(25);
_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
Autor: Alex G. (alex94) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

ja das ist kein problem.

mfg alex

Autor: H. Lektor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verständnis schreibt man ohne ss.

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahjo also aus _delay_us(100) würde dann _delay_ms(0.1) werden?

Autor: kurz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Präzision willst Du denn erreichen ?

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

Autor: Martin (Gast)
Datum:

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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven P. (haku) Benutzerseite
Datum:

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

Nein.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das gilt allerdings nur, wenn während des Delays keine Interrupts 
auftreten.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.