mikrocontroller.net

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


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
}

Autor: Eddy Current (chrisi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Faszinierend! Ist vielleicht der Watchdog aktiv?

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wird ja auch nur einmal aufgerufen ?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In dem Beispielprogramm wird es 250 mal aufgerufen.

Autor: Kluchscheißernder Nixwisser (kluchscheisser)
Datum:

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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'?

Autor: Andreas Ferber (aferber)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)? )

Autor: Atmelfreak (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: robo-man (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: robo-man (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.