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


von Patrick (Gast)


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:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#ifndef F_CPU
4
#define F_CPU 12000000UL
5
#endif
6
7
int main (void) {
8
9
10
   DDRC |= (1 << PC0);
11
   PORTC |= (1 << PC0);
12
   
13
   
14
   while (1) { 
15
 
16
     PORTC &= ~(1 << PC0);   
17
     _delay_ms(200);
18
     PORTC |= (1 << PC0);    
19
     _delay_ms(200);
20
    
21
     
22
   }
23
   return 0;
24
}

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

von Johannes M. (johnny-m)


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.

von Mike R. (thesealion)


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.

von Falk B. (falk)


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

von gast (Gast)


Lesenswert?

Watchdog?

von Patrick (Gast)


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:
1
#include <avr/io.h>
2
3
#ifndef F_CPU
4
#define F_CPU 12000000UL
5
#endif
6
#include <util/delay.h>
7
static int i;
8
int main (void) {
9
10
11
   DDRC |= (1 << PC0);
12
   PORTC |= (1 << PC0);
13
   
14
   
15
   while (1) { 
16
 
17
     PORTC &= ~(1 << PC0);
18
     for (i=0; i<10; i++)
19
     {   
20
     _delay_ms(20);
21
     }
22
     PORTC |= (1 << PC0);
23
     for (i=0; i<10; i++)
24
     {     
25
     _delay_ms(20);
26
     }
27
     
28
   }
29
   return 0;
30
}

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?

von Peter D. (peda)


Lesenswert?

Patrick wrote:

> Beim Live-Debuggen springt er mir nach der ersten delay Funktion wieder
> aus der while-Schleife und fängt bei
>
1
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

von Michael G. (linuxgeek) Benutzerseite


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

von Patrick (Gast)


Lesenswert?

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

von Winfried (Gast)


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...

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.