Forum: Compiler & IDEs while scheife wird nie verlassen, warum?


von X. H. (shadow0815)


Angehängte Dateien:

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.

von Mike R. (thesealion)


Lesenswert?

Warum soll die Schleife nie verlassen werden?

von Unterwegs (Gast)


Lesenswert?

Warum uberprüfst du die Bedingung nicht im while?

von Paper (Gast)


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.

von Paper (Gast)


Lesenswert?

vllt besser

while(n != 0x00){} // solange n ungleich 0x00

von g457 (Gast)


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?

von Daniel A. (daniel-a)


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?

: Bearbeitet durch User
von Paper (Gast)


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

von OldMan (Gast)


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.

von Peter II (Gast)


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

von X. H. (shadow0815)


Lesenswert?

Alles klar. Hab nen Denkfehler gehabt. Sie wird doch unterbrochen, so 
wie es gehört. Habe nur 4 bit an LED's gelegt und habe nicht dran 
gedacht das das blinkmuster 16 mal wiederholt wird bis 0x00 erreicht ist 
anstelle nur ein mal :-/

von thats it (Gast)


Lesenswert?

Man, man, man, er hat keine Geduld für die lange Zeit, oder das delay 
läuft nicht ab.

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.