while scheife wird nie verlassen, warum?

OP #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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.