while scheife wird nie verlassen, warum?

#3833913
Lesenswert?

1
uint8_t n=0xFF;
2
while(1)
3
{
4
 _delay_ms(250);LED=1;_delay_ms(1);LED=0;
5
 n--;
6
 if(n==0x00)break;
7
}

Im Anhang das projekt für avr-gcc mit Makefile (unter linux benutzt) mit 
isptiny progger mit atmega32 und 16MHz quarz drann.
Angehängte Dateien:
Gast #3833960
Lesenswert?

while(bedingung){}

das Programm bleibt solange in einer While-Schleife wie ihre Bedingung 
Wahr ist (logisch 1) mit while(1){} bleibt die Bedingung immer Wahr, 
somit wird die Schleife auch nie verlassen.
Gast #3833964
Lesenswert?

> das Programm bleibt solange in einer While-Schleife wie ihre Bedingung
> Wahr ist [..]

..oder die Schleife vorzeitig verlassen wird

> [..] mit while(1){} bleibt die Bedingung immer Wahr,
> somit wird die Schleife auch nie verlassen.

..außer sie wird vorzeitig verlassen.

Ad TO: woher weisst Du denn, dass die Schleife nie verlassen wird?
#3833965
Lesenswert?

Die Schleife sollte nach zirka 64 sekunden verlassen werden:
256*(250ms+1ms) = 64256ms
Mach doch aus der while eine do while.
1
// der ursprüngliche code war equivalent
2
uint8_t n=0xFF;
3
do {
4
  _delay_ms(250);
5
  LED=1;
6
  _delay_ms(1);
7
  LED=0;
8
} while(n--);

Ist es beabsichtigt, dass du bei n=255 insgesamt 256 schleifendurchlaufe 
hast?
Gast #3833970
Lesenswert?

Die Zeile

if(n==0x00)break;

hatte ich beim ersten Überfliegen nicht gesehn. Deshalb auch der 
Nachtrag mit "solange ungleich 0x00" wenn es nur eine Schleifen-Ausstieg 
gibt ist die if-Abfrage unsinnig da die While-Schleife selber bei jedem 
Durchgang eine Bedingungs-Abfrage macht
Gast #3833971
Lesenswert?

Und was kommt nach der while-Schleife?
Die wird mit Sicherheit durch den break verlassen.
Wenn aber danach nichts mehr an Code kommt, dann fängt der
AVR wieder von vorne an.
Für Dich erscheint es so, als würde die while-Schleife nicht verlassen.

Als Tipp zum testen:

Füge nach dieser Schleife diesen Code ein:
1
      LED = 0; // Led AUS
2
      while(1); // Sprung auf sich selbst. D.h. CPU ist gewisser Maßen 
3
                // blockiert. Nach Außen hin tot....

That's it.
Gast #3833972
Lesenswert?

OldMan schrieb:
> Und was kommt nach der while-Schleife?
steht doch im Anhang.

> Wenn aber danach nichts mehr an Code kommt, dann fängt der
> AVR wieder von vorne an.
nein macht er nicht, nach der main baut die toolchain eine 
entlosschleife ein.

> Für Dich erscheint es so, als würde die while-Schleife nicht verlassen
nein

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