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


von P. I. (pimi)


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.

von Falk B. (falk)


Lesenswert?


von Christian P. (christian_paier)


Lesenswert?

1
unsigned char i=0;
2
3
for(i=0; i<300: i++) _delay_ms(10);

von aha (Gast)


Lesenswert?

Hilfe... dafuer benutzt man doch Timer.

von Christian P. (christian_paier)


Lesenswert?

aha schrieb:
> Hilfe... dafuer benutzt man doch Timer.

davon mal ganz abgesehen.

von Karl H. (kbuchegg)


Lesenswert?

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

von Christian P. (christian_paier)


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)

von Karl H. (kbuchegg)


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.

von Christian P. (christian_paier)


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 ?

von Karl H. (kbuchegg)


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 :-)

von Christian P. (christian_paier)


Lesenswert?

damit sind dinge wie
1
 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.

von Jean P. (fubu1000)


Lesenswert?

Christian Paier schrieb:
>
1
> unsigned char i=0;
2
> 
3
> for(i=0; i<300: i++) _delay_ms(10);
4
> 
5
>


^^

schöne Pfingsten

von BrainHunter (Gast)


Lesenswert?

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

von Jean P. (fubu1000)


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.

von MackJack (Gast)


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

von Tobias T. (Firma: codes4web) (roverfreak)


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

von Öpf (Gast)


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.

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.