delay Funktion für Atmega8

OP #1282345
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.
#1282528
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.
#1282534
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 ?
#1282536
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 :-)
Gast #1302188
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
(Firma: codes4web) #1509446
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
Gast #1509452
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren