Warum verlässt der die Endlosschleife?

Gast #674363
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.
#674367
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.
#674376
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
Gast #674381
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?
#674411
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
Gast #674519
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren