www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik delay Funktion für Atmega8


Autor: P. Imhof (pimi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forumuser,
Ich programmiere AVR Atmega8 Mikrocontroller und benutze Sisy AVR 
Software.
In meinem C-Programm verwende ich eine delay - Funktion.
Aus dem Fragment meines Quellcodes (siehe unten) müsste die Pause 
betragen 3 sec. mall 1000 = 3000 sec.
In der Praxis jedoch sind es bei mir ca. 97 sec. Warum?

#define     F_CPU 3686400
#define   BAUD   9600
#include    <avr\io.h>
#include    <avr\delay.h>
...........
...........
...........
...........
 for (int i=1; i<=1000; i++)
   {
       _delay_ms(3000);
   }
.............
.............
.............
Ich bitte um Rat.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Christian Paier (christian_paier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned char i=0;

for(i=0; i<300: i++) _delay_ms(10);


Autor: aha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hilfe... dafuer benutzt man doch Timer.

Autor: Christian Paier (christian_paier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aha schrieb:
> Hilfe... dafuer benutzt man doch Timer.

davon mal ganz abgesehen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das erklärt aber immer noch nicht, warum bei ihm ein delay von 1000 mal 
3000 Millisekunden nur 97 Sekunden lang ist.

Autor: Christian Paier (christian_paier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du Falks Ratschlag befolgt hättest und
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
gelesen hättest...

würdest du wissen das die delay-Routinen der delay.h auf ein Maximum in 
Abhängigkeit der MCU-Taktfrequenz begrenzt sind. Kann man sich mit ner 
einfachen Formel errechenen (Als Faustfomel kann man sagen: Nie mehr als 
20 reinschreiben)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Paier schrieb:
> Wenn du Falks Ratschlag befolgt hättest und
> http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
> gelesen hättest...
>
> würdest du wissen das die delay-Routinen der delay.h auf ein Maximum in
> Abhängigkeit der MCU-Taktfrequenz begrenzt sind. Kann man sich mit ner
> einfachen Formel errechenen (Als Faustfomel kann man sagen: Nie mehr als
> 20 reinschreiben)

Und wenn du in die delay.h einer etwas neueren libc Distrubution 
geschaut hättest, dann wüsstest du, dass diese Maximalzeit mitlerweile 
bei rund 6.5 Sekunden (unabhängig von der Taktfrequenz) steht.

Edit: Steht aber mitlerweile auch im Tut

Allerdings erhebt sich die Frage, welche Version mit SiSy ausgeliefert 
wird.

Autor: Christian Paier (christian_paier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

> Und wenn du in die delay.h einer etwas neueren Distrubution geschaut
> hättest, dann wüsstest du, dass diese Maximalzeit mitlerweile bei rund
> 6.5 Sekunden (unabhängig von der Taktfrequenz) steht.

Aha, Ok dann muss ich mich entschuldigen, da wollt ich wohl mit 
veraltetem wissen glänzen. Tut mit wirklich leid.

Das heißt also man kann mit den neunen Distributionen wirklich 
_delay_ms(3000) schreiben?

Dann ist die nächste logische Frage: Welche Version verwendet P. Imhof ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Paier schrieb:
> Karl heinz Buchegger schrieb:
>
>> Und wenn du in die delay.h einer etwas neueren Distrubution geschaut
>> hättest, dann wüsstest du, dass diese Maximalzeit mitlerweile bei rund
>> 6.5 Sekunden (unabhängig von der Taktfrequenz) steht.
>
> Aha, Ok dann muss ich mich entschuldigen, da wollt ich wohl mit
> veraltetem wissen glänzen. Tut mit wirklich leid.

Nicht wirklich.
Was wir alle übersehen haben: Er benutzt ja SiSy
Und da erhebt sich die Frage, wie alt die avr-libc dort ist.

> Das heißt also man kann mit den neunen Distributionen wirklich
> _delay_ms(3000) schreiben?

Ja.
Die Genauigkeit nimmt ab. Aber wenn jemand 3 Sekunden per delay wartet, 
ist es in 99% aller Fälle egal ob das dann 3.001 Sekunden sind oder 
2.999
Wers genauer haben will, nimmt sowieso Timer :-)

Autor: Christian Paier (christian_paier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
damit sind dinge wie
 long_delay(1000); 
 also gestorben

Aber du hast schon rest da wir nicht wissen welche Verision in SiSy 
steckt sollte er es erst einmal auf die alte Art und weise versuchen.

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Paier schrieb:
>
> unsigned char i=0;
> 
> for(i=0; i<300: i++) _delay_ms(10);
> 
> 


^^

schöne Pfingsten

Autor: BrainHunter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit unsigned char auf 300 zählen wird lustig, da der nur 8 bit hat...

Autor: Jean Player (fubu1000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hehehe,
und der Doppelpunkt ist auch nit schlecht. Aber ich baue die Funktion 
das nächste mal anstatt while(1) ein. Vielleicht klappt das sogar.

schöne Pfingsten.

Autor: MackJack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich hatte auch so meine schwierigkeiten bei der anwendung der 
warteroutinen aus der delay.h... besonders hat mich immer die _delay_us 
geärgert :-( ich nehme jetzt immer den codewizard von Sisi und lass mir 
dort die gewünschten warteroutinen generieren... damit bin ich dann 
immer gut gefahren... aber auch hier ist die vorraussetzung den 
richtigen takt ausgewählt zu haben

lg

Autor: Tobias Toifl (Firma: codes4web) (roverfreak)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich benutze einen Atmega8 und myAVR.

Die Fuses sind auf internen Takt mit egal welchem Takt gesetzt und mit 
und ohne WatchDog!
Das Problem ist, dass kein delay funktioniert!

Das Programm bricht bei _delay_ms(x) einfach ab und verharrt!
der delay kann auch 1 gesetzt werden und es bricht ab.

included habe ich util/delay und avr/delay (jeweils und nicht gemeinsam) 
und es geht nicht!

Ich teste meine Schaltung auf einem Pollin Funk AVR.

Wer hat einen Tip für mich?

Lg
Tobias

Autor: Öpf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wer hat einen Tip für mich?

Code soweit reduzieren, das der Fehler noch auftritt. Dabei wird 
manchmal schon klar was das Problem ist. Reduzierten Code posten.
Fuses überprüfen.
Erklären woran DU merkst das das Programm hängt.
Takteinstellungen im Compiler, bzw. Code prüfen.


PS. Auch wenn es wie eine Ausrede klingt: Unsere Glaskugeln sind mal 
wieder alle bei der Inspektion.

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.