Forum: Compiler & IDEs Problem mit delay funktion


von Thomas (Gast)


Lesenswert?

Hallo,

Ich benutze AVRStudio4.12 + WinAVR (GCC).
Mein Problem ist folgendes: ich benutze die delay funktion in moment so
: _delay_ms(5);
Dies funktioniert eigentlich auch so, allerdings scheint die
verzögerung ( mit dem Oszi nachgemessen ) fast wahrlos zu geschehen.
wenn ich 10ms einstelle messe ich eine verzögerung von ca. 18ms, wenn
ich µs einstelle ( _delay_us(40); ) macht er ungefähr 1-2 ms.
irgendwie funktioniert das nicht wirklich genau.

Ich hatte vorher mit CodeVision zu tun. Hier ging das einwandfrei.
"Auch wenn man es damit nicht tut," habe ich in CodeVision mit der
delayfunktion schon 1 sekunde und so verzögert. alles kein problem
gewesen.
Aber irgendwie bekomm ichs mit AVRStudio und WinAVR nicht gebacken. was
könnte ich falsch gemacht haben???
versteh das einfach nicht.

schonmal vielen dank für hilfreiche antworten!!!

Gruß,
Thomas

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


Lesenswert?

Setze die Optimierung im AVR Studio von -O0 auf -Os.

von Thomas (Gast)


Lesenswert?

Habs gerade ausprobiert. Danke funktioniert super jetzt!!
für kurze tests werde ich nicht einen Timer nehmen, sondern die Delay
funktion. ein delay alla : _delay_s(1) geht wahrscheinlich trotzdem
nicht.
Gruß,
Thomas

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


Lesenswert?

1
void delay_1s(void)
2
{
3
  uint8_t i;
4
  for (i = 0; i < 100; i++)
5
    _delay_ms(10);
6
}
10 ms sind mit den derzeitigen AVR-Taktfrequenzen immer im
gültigen Wertebereich.

Aber spin-loop delays in dieser Größenordnung sind bäh, dafür
nimmt man wirklich einen Timer.

von Thomas (Gast)


Lesenswert?

hmm okay. dein Codebeispiel ist jetzt aber kein Timer, oder?
habe vielleicht vergessen zu sagen, das ich nicht wirklich auskenne.
kann nur paar ports ein und ausschalten und mit dem delay rumspielen.
mit dem Tutorial (Timer) komme ich nicht klar. versteh das irgendwie
nämlich nicht.
Aber dein Beispiel sieht gar nicht so schwer aus.
Gruß,
Thomas

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


Lesenswert?

> dein Codebeispiel ist jetzt aber kein Timer, oder?

Ja, ist es nicht.

> mit dem Tutorial (Timer) komme ich nicht klar.

Die Applikation wird damit "multi-threaded".  Der Timer wird
typischerweise benutzt, um nach Ablauf einer bestimmten Zeit
einen Interrupt auszulösen, der das Hauptprogramm (gewissermaßen
die Vordergrund-Task) unterbricht.  Ab diesem Moment läuft ein
anderer Codezweig bis zum Ende der Interruptroutine.

Der Vordergrundjob könnte auch in einem sleep_mode() enden,
wenn gerade nichts weiter zu tun ist.

Schau dir doch mal das simple demo der avr-libc an.

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.