Forum: Compiler & IDEs Kleinste Wartezeit mit Atmega32


von bastler (Gast)


Lesenswert?

Hallo, wie niedrig ist die kleinste delay-zeit bei einem Atmega32 mit 
16mhz mit : _delay_us bei Winavr-C ?
Kann man auch feste Realzahlen übergeben?
Gibt es einen Höchstwert, den man nicht übeschreiten darf bei der 
Übergabe?

Gruss

von bastler (Gast)


Lesenswert?

Etwas vergessen.
Ich möchte die neueste Version von WinAvr benutzen.

von Peter (Gast)


Lesenswert?

1/16MHz = 62.5ns

von Peter (Gast)


Lesenswert?

Die 62.5ns gelten natürlich für einen NOP.

Ansonsten siehe Dokumentation zur avrlibc oder probiere es im AVRStudio 
einfach mal aus.... (Dort kann man die Laufzeit in in CPU-Zyklen 
anschauen...)

von Oliver (Gast)


Lesenswert?

bastler schrieb:
> Hallo, wie niedrig ist die kleinste delay-zeit bei einem Atmega32 mit
> 16mhz mit : _delay_us bei Winavr-C ?
> Kann man auch feste Realzahlen übergeben?
> Gibt es einen Höchstwert, den man nicht übeschreiten darf bei der
> Übergabe?

Alle, wirklich alle, Antworten auf diese Fragen, und noch viel mehr, 
finden sich in der Dokumentation zur avrlibc.

Eine deutsche Zusammenfassung dazu noch im avr-gcc-turorial, zu finden 
hier oben links im Menu.

Oliver

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Peter schrieb:
> Die 62.5ns gelten natürlich für einen NOP.

...den _delay_us() selbst nicht erzeugen kann, denn es ist eine
fest vorgegebene Schleife.  Die macht mindestens einen Durchlauf
mit 2 Takten (der 3. entfällt, da der branch zurück ja nicht
ausgeführt wird), braucht aber außerdem noch Zeit dafür, dass das
Zählregister initialisiert wird.  Je nachdem, ob ein entsprechender
Initialisierungswert bereits in einem Register liegt oder nicht,
braucht das also einen weiteren Takt (Register-Register-Kopie) oder
zwei (zusätzlich noch ein LDI Rx, N).

Der AVR-GCC im neuesten WinAVR enthält einen Patch, der die Funktion
__builtin_avr_delay_cycles() bereitstellt; diese Funktion kann eine
zyklengenaue Verzögerung implementieren, da der Compiler das nötige
Wissen besitzt herauszufinden, ob er beispielsweise den Wert erst
noch in ein Register laden muss oder nicht.  Dafür kann diese
Funktion natürlich nur ganzzahlige Werte übernehmen, die Umrechnung
mittels F_CPU muss man hier also wieder selbst machen.

In der aktuellen avr-libc (1.7.0) benutzen _delay_us() und _delay_ms()
automatisch die Funktion __builtin_avr_delay_cycles(), allerdings
runden sie derzeit meines Wissens immer nach unten bei der Berechnung
des Arguments.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Querverweis auf einen Bugfix der neuen delay-Funktionen in avr-libc 
1.7.0 bis zum Erscheinen der Version 1.7.1: 
Beitrag "Re: _delay_ms() läuft 4 Mal schneller als erwartet"

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.