Hallo zusammen, beim Aufruf von _delay_ms() hängt sich mein ATMega8 mit beständiger Beharrlichkeit auf. Habe schon ein wenig herumprobiert. Ich kann die _delay_ms() max. 1 mal aufrufen, beim 2 Aufruf bleibt der uC dann hängen. Habe sogar schon den uC getauscht, half aber auch nichts. Hier mal der betreffende Code. Bin jetzt schon dankbar für Eure Tipps! void long_delay(uint16_t _msec) { for(; _msec > 0; _msec--) _delay_ms(1); } int main (void) { DDRD = 0xff; PORTD = 0b11110000; long_delay(250); PORTD = 0b11110101; do { } while (1); }
Faszinierend! Ist vielleicht der Watchdog aktiv?
In dem Beispielprogramm wird es 250 mal aufgerufen.
Gibt es für nicht benutzte Timer eigentlich Geld zurück?
Ja, ist richtig im Beispiel ruf ich es 250 mal auf. Aber wie gesagt, hab schon ein wenig rumgespielt und beim 2. Einzelaufruf isser weg also bei long_delay(2); Watchdog? Mmh, eingeschaltet hab ich ihn zumindest nicht absichtlich. Werd mal nachschauen. Danke schon mal.
Stefan schrieb: > Ja, ist richtig im Beispiel ruf ich es 250 mal auf. > Aber wie gesagt, hab schon ein wenig rumgespielt und beim 2. > Einzelaufruf isser weg also bei long_delay(2); > Watchdog? Mmh, eingeschaltet hab ich ihn zumindest nicht absichtlich. > Werd mal nachschauen. > Danke schon mal. Es ist dann nicht sehr sinnvoll, wenn du uns dein funktionierendes Programm zeigst. Zeig uns dein nicht funktionierendes! Dort brauchst du Hilfe bei der Fehlersuche Woran erkennst du denn, dass 'er weg ist'?
Karl heinz Buchegger schrieb: > Es ist dann nicht sehr sinnvoll, wenn du uns dein funktionierendes > Programm zeigst. Zeig uns dein nicht funktionierendes! Hat er doch. Soweit ich ihn verstanden habe funktioniert long_delay(1), long_delay(2) aber nicht (kehrt nicht mehr zurück). > Woran erkennst du denn, dass 'er weg ist'? Toggeln (bzw. ausbleiben dessen) von PD2? Andreas
Andreas Ferber schrieb: > Karl heinz Buchegger schrieb: >> Es ist dann nicht sehr sinnvoll, wenn du uns dein funktionierendes >> Programm zeigst. Zeig uns dein nicht funktionierendes! > > Hat er doch. Soweit ich ihn verstanden habe funktioniert long_delay(1), > long_delay(2) aber nicht (kehrt nicht mehr zurück). Dann hab ich seine Fehlerbeschreibung nicht richtig verstanden. offentliche Entschuldigung. (Warum zeigt er dann nicht einen Aufruf von long_delay(2) sondern einen mit long_delay(250)? )
Stefan schrieb: > Ja, ist richtig im Beispiel ruf ich es 250 mal auf. Ähm hab ich jetzt etwas nicht richtig mitbekommen? Der Funktion "long_delay(....)" wird doch nur ein Wert übergeben, oder? Und nicht 250 mal aufgerufen.
Atmelfreak schrieb: > Stefan schrieb: >> Ja, ist richtig im Beispiel ruf ich es 250 mal auf. > > Ähm hab ich jetzt etwas nicht richtig mitbekommen? > Der Funktion "long_delay(....)" wird doch nur ein Wert > übergeben, oder? Und nicht 250 mal aufgerufen. Aber das _delay_ms wird dann 250 mal aufgerufen. Zumindest sollte es das. Ich tippe mal auf: Optimizer nicht eingeschaltet, daher stimmt das Timing von _delay_ms hinten und vorne nicht.
Hi, Optimizer hab ich schon in allen zur Verfügung stehenden Varianten ausprobiert - nada. Andreas Ferber schrieb: > Hat er doch. Soweit ich ihn verstanden habe funktioniert long_delay(1), > long_delay(2) aber nicht (kehrt nicht mehr zurück). Genau so isses. Auch unabhängig davon, ob ich long_delay() benutzte oder direkt _delay_ms() benutzte: ... _delay_ms(1); _delay_ms(1); ... ==> geht nicht ... _delay_ms(1); ... ==> geht Ich nutze WinAVR in aktueller Version unter WinXP. Besteht die Möglichkeit, dass da was falsch compiliert wird? Gruß Stefan
Bin zwar kein µC Profi, aber so muss es funktionieren. Ich schätze das Problem war das du keine zweite Wartezeit für den zweiten zustand hattest, deshalb hat er nur einmal geschaltet, ist aufjedenfall für dich so vorgekommen, weil er es ohne wartezeit gleich weitergeschaltet hat. F_CPU 8000000 //Geschwindigkeit vom µC angeben #include <util\delay.h> int main (void) { DDRD = 0xff; while(1) { PORTD = 0b11110000; _delay_ms(250); PORTD = 0b11110101; _delay_ms(250); //zweite Wartezeit } return 0; }
robo-man schrieb: > ... Da fehlt noch ein #define in der ersten Zeile. Außerdem: So Definitionen wie F_CPU macht man über die Kommandozeile und nicht direkt im Quellcode um die Konsistenz von F_CPU in allen .c Dateien zu halten.
Simon K. schrieb: > Da fehlt noch ein #define in der ersten Zeile. > Außerdem: So Definitionen wie F_CPU macht man über die Kommandozeile und > nicht direkt im Quellcode um die Konsistenz von F_CPU in allen .c > Dateien zu halten. Sorry!!! Das mit dem #define hab ich übersehen. Und welche Kommandozeile meinst du, weil ich weiß von sowas nichts? Ich hab bisher immer wenn ich in einer .c Datei ein _delay_ms gebrauch hab, hab ich da solche definition machen müssen. Sagen wir mal wenn ich mit AvrStudio4 arbeite wo finde ich da die kommandozeile. Danke!!!
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.