mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Warum verlässt der die Endlosschleife?


Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen alle zusammen.
Ich hab hier ein Board mit einem AT90CAN128 drauf. Um das Board zu 
testen, wollte ich die LED auf dem Board blinken lassen. Programmieren 
tu ich mit dem AVR Studio und den uC brenn ich mit dem Atmel JTAGICE 
mkII über USB. Beim Debuggen mit dem Simulator funktioniert alles 
einwandfrei. Wenn ich aber beobachte, was der uC mit dem Programm macht, 
versteh ich die Welt nicht mehr. Hier erstmal mein Testprogramm:
#include <avr/io.h>
#include <util/delay.h>
#ifndef F_CPU
#define F_CPU 12000000UL
#endif

int main (void) {


   DDRC |= (1 << PC0);
   PORTC |= (1 << PC0);
   
   
   while (1) { 
 
     PORTC &= ~(1 << PC0);   
     _delay_ms(200);
     PORTC |= (1 << PC0);    
     _delay_ms(200);
    
     
   }
   return 0;
}

Beim Live-Debuggen springt er mir nach der ersten delay Funktion wieder 
aus der while-Schleife und fängt bei
int main (void)
wieder an.
Was soll das?
Weiss jemand, warum der das macht? Ich schnalls nicht.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> _delay_ms(200);
Das geht bei 12 MHz nicht. Die _delay_XX-Funktionen sind in Abhängigkeit 
von der CPU-Frequenz begrenzt (_delay_ms z.B. auf 262,14ms/F_CPU[MHz]). 
Schau mal in die libc-Doku. Da steht alles Wissenswerte drin. Dass eine 
Endlosschleife deswegen abgebrochen wird, kann ich allerdings auch nicht 
ganz nachvollziehen.

Autor: Mike R. (thesealion)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der "Abbruch" sieht stark nach einem Reset bzw. einem Sprung an die 
Adresse 0 aus.
Evtl. steht auf dem Stack also nach dem delay eine falsche 
Rücksprungadresse oder der Stack wird falsch initialisiert.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Patrick (Gast)

Das define für F_CPU muss vor dem imclude für util/delay.h stehen, sonst 
meckert der Compiler.

#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 12000000UL
#endif
#include <util/delay.h>

>Beim Live-Debuggen springt er mir nach der ersten delay Funktion wieder
>aus der while-Schleife und fängt bei

Es gibt einige Probleme mit dem Debuggen der _delay_ms() Funktion. Man 
kann keine Breakpoints drauf setzen. Lass das Programm doch einfach mal 
laufen, ohne Debugger und alles andere.

MfG
Falk

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Watchdog?

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@gast
Wenn Du eine Frage an mich hast, dann stell sie doch bitte komplett. Mit 
"Watchdog?" kann ich nichts anfangen.

@Falk und Johannes

Danke erstmal. Ich hab jetzt mal meinen Code angepasst:
#include <avr/io.h>

#ifndef F_CPU
#define F_CPU 12000000UL
#endif
#include <util/delay.h>
static int i;
int main (void) {


   DDRC |= (1 << PC0);
   PORTC |= (1 << PC0);
   
   
   while (1) { 
 
     PORTC &= ~(1 << PC0);
     for (i=0; i<10; i++)
     {   
     _delay_ms(20);
     }
     PORTC |= (1 << PC0);
     for (i=0; i<10; i++)
     {     
     _delay_ms(20);
     }
     
   }
   return 0;
}

Ich hab erst mit Debuggen begonnen, als es auf dem uC nicht lief.

Ich hab jetzt aber noch ein anderes Problem, das mit dem ursprünglichen 
nichts mehr zu tun hat. Ich kann keine Verbindung mehr zum JTAGICE
mkII aufbauen. An was kann das liegen?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Patrick wrote:

> Beim Live-Debuggen springt er mir nach der ersten delay Funktion wieder
> aus der while-Schleife und fängt bei
>
int main (void)
> wieder an.


Vermutlich ist delay ein Funktionscall und Dein Stack zeigt ins Nirwana. 
Damit kommt der Call nie zurück.

Grund ist, daß der Code für nen falschen AVR-Typ compiliert wurde (hat 
der CAN128 auch die M103 Fuse?).


Peter

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich tippe ebenfalls auf den Watchdog. Wenn sich der Controller staendig 
resettet duerfte es klar sein dass sich keine Verbindung aufbauen 
laesst. Und wenn Dir das nichts sagt, Patrick, wird es Zeit, mal die 
Doku zu lesen. Ebenfalls kann es sein, dass die Fuses falsch gesetzt 
sind (z.B. das 103-Kompatibilitaets-Fuse).

Autor: Patrick (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs nochmal probiert, hab den JTAGICE mkII an nen anderen USB 
angeschlossen und siehe da, es funzt. Warum auch immer ;-)

Autor: Winfried (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum auch immer... geht meistens in die Hose. Fehler, die man nicht 
genau verstanden hat, holen einen spätestens dann wieder ein, wenn es 
terminlich total eng wird ;-)

Aber ich glaube, diese Erfahrung muss jeder leibhaftig selber machen...

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.