mikrocontroller.net

Forum: Compiler & IDEs Problem mit delay funktion


Autor: Thomas (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Setze die Optimierung im AVR Studio von -O0 auf -Os.

Autor: Thomas (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void delay_1s(void)
{
  uint8_t i;
  for (i = 0; i < 100; i++)
    _delay_ms(10);
}
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.

Autor: Thomas (Gast)
Datum:

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

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.