Forum: Mikrocontroller und Digitale Elektronik ATMega8 bleibt bei Aufruf von _delay_ms() hängen


von Stefan (Gast)


Lesenswert?

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);
}

von Eddy C. (chrisi)


Lesenswert?

Faszinierend! Ist vielleicht der Watchdog aktiv?

von guest (Gast)


Lesenswert?

wird ja auch nur einmal aufgerufen ?

von Rolf Magnus (Gast)


Lesenswert?

In dem Beispielprogramm wird es 250 mal aufgerufen.

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

Gibt es für nicht benutzte Timer eigentlich Geld zurück?

von Stefan (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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'?

von Andreas F. (aferber)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Atmelfreak (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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

von robo-man (Gast)


Lesenswert?

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;
}

von Simon K. (simon) Benutzerseite


Lesenswert?

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.

von robo-man (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.