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.
aha schrieb:
> Hilfe... dafuer benutzt man doch Timer.
davon mal ganz abgesehen.
Das erklärt aber immer noch nicht, warum bei ihm ein delay von 1000 mal 3000 Millisekunden nur 97 Sekunden lang ist.
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)
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.
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 ?
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 :-)
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.
Christian Paier schrieb:
>
1 | > unsigned char i=0; |
2 | >
|
3 | > for(i=0; i<300: i++) _delay_ms(10); |
4 | >
|
5 | >
|
^^ schöne Pfingsten
mit unsigned char auf 300 zählen wird lustig, da der nur 8 bit hat...
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.
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
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
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.