Forum: Mikrocontroller und Digitale Elektronik AVR-C- for-Schleifen verschachteln


von __Son´s B. (bersison)


Lesenswert?

Hallo,
leider bekomme ich es nicht hin, 2 for-Schleifen abwechseld laufen zu 
lassen.

------------------------------------
int16_t main(void)
{
DDRA = 0b00000000;
DDRB = 0b11111111;
PORTB = 0b11111111; // alle LEDs aus (=STK500)
uint8_t led=0;

while(1)
{
for(uint16_t loop=20;loop<=60;loop+=10) //for"1", schneller werdend
 {
 for(;led<=7;)        //for "2", Lauflicht von LED0-7
  {
  clrPort(&PORTB,led); //LEDx ein (=STK500)
  warte_ms(loop);      //warte "loop" in [ms]
  setPort(&PORTB,led); //LEDx aus (=STK500)
  led++;
  }
 for(;led>=0;led--)   //for"3", Lauflicht von LED6-0
  {
  clrPort(&PORTB,led); //LEDx ein (=STK500)
  warte_ms(loop);       //warte "loop" in [ms]
  setPort(&PORTB,led); //LEDx aus (=STK500)
  }
}}return 0;}
-------------------------------------

Fehler: Nachdem for"3" korrekt durchlaufen ist, fängt for"2" nicht 
automatisch wieder von LED0-7 an.

von Εrnst B. (ernst)


Lesenswert?

led ist "uint8_t".
Deshalb ist led>=0 immer wahr, die zweite Schleife kann nicht beendet 
werden.

Wenn du die Compiler-Warnings einschaltet, meckert er sowas an.

von uint8_t (Gast)


Lesenswert?

In for"3" :
Wenn led = 0 ist wird versucht einer abzuziehen, led = -1.
Led ist ein uint8_t, Wertebereich von 0 - 255.

Also entweder einen int benutzen oder for(;led>=1;led--).

Wenn ich mich nicht irre.

von Oliver (Gast)


Lesenswert?

uint8_t schrieb:
> oder for(;led>=1;led--).

Warum nicht das hinschreiben, was man wirklich will:

Es ist ganz sinnvoll. wenn man für eine while-Bedingung auch eine 
while-Schleife hinschreibt, und an Stelle von <= nur < in der 
Abbruchbedingung benutzt.
1
while(led < 8 )
2
{
3
  ...
4
  led++
5
}
6
7
led-= 2;
8
9
while(led > 0)
10
{
11
  ...
12
  --led;
13
}

Die "8" mit "<" in der Abbruchbedingung hilft, die Zeile "led -=2" nicht 
zu vergessen, wenn die Kommentare
> Lauflicht von LED0-7
und
> Lauflicht von LED6-0
tatsächlich ernst gemeint waren.

Oliver

von Oliver (Gast)


Lesenswert?

und prompt vertan...
1
while(led < 8 )
2
{
3
  ...
4
  led++
5
}
6
7
led-= 1;
8
9
while(led > 0)
10
{
11
  --led;
12
 ...
13
}

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Oliver schrieb:

> zu vergessen, wenn die Kommentare
>> Lauflicht von LED0-7
> und
>> Lauflicht von LED6-0
> tatsächlich ernst gemeint waren.

.... was durchaus möglich ist, weil ja die erste bzw. die letzte LED 
etwas anders zu behandeln sind. Meistens will man ja nicht, dass die 
dazwischenliegenden LED, sagen wir mal, jeweils 1 Sekunde brennt und die 
erste bzw. letzte LED dann 2 Sekunden, weil sie 1 Sekunde für die eine 
Lauflichtrichtung und 1 Sekunde für die andere Lauflichtrichtung brennt. 
Das führt dann zu einem optischen Effekt, dass das Lauflicht an den 
Endpunkten innezuhalten scheint, ehe es dann wieder weitergeht, obwohl 
alle LED in beiden Lauflichtrichtung getrennt betrachtet, exakt gleich 
lang brennen :-)

von Oliver (Gast)


Lesenswert?

;)

Oliver

von __Son´s B. (bersison)


Lesenswert?

uint8_t schrieb:
> In for"3" :
> Wenn led = 0 ist wird versucht einer abzuziehen
for(;led>=0;led--)
Ich meine, wenn led=0 erreicht ist, bricht die Schleife sofort ab, ohne 
noch ein mal "led--" zu berechnen.

Εrnst B✶ schrieb:
> Wenn du die Compiler-Warnings einschaltet, meckert er sowas an.
Der Compiler zeigt keine Warnungen an!


Es sieht folgend aus;
(1) for"1" läuft
(2) for"2" läuft fehlerfrei, LED0-7
(3) for"3" läuft fehlerfrei, LED6-0
--statt jetzt zurück zu for"2" springen,
(4) LED0 leuchtet dauernd für ca.3Sek
(5) alles LEDs aus für ca.3Sek
(6) sprung zu Punkt (3)

von Karl H. (kbuchegg)


Lesenswert?

__Son´s Bersi__ schrieb:
> uint8_t schrieb:
>> In for"3" :
>> Wenn led = 0 ist wird versucht einer abzuziehen
> for(;led>=0;led--)
> Ich meine, wenn led=0 erreicht ist, bricht die Schleife sofort ab, ohne
> noch ein mal "led--" zu berechnen.

Nö.
Warum soll sie?

Deine Bedingung in der for lautet:   led >= 0

Da steht größer-gleich. Und genau das passiert auch. Solange led größer 
gleich 0 ist, wird die Schleife wiederholt.

Dein Pech, dass ein unsigned Wert per Definition immer größer oder 
gleich 0 ist, weil er ja als unsigned Wert nicht negativ werden KANN!


> (4) LED0 leuchtet dauernd für ca.3Sek
> (5) alles LEDs aus für ca.3Sek

Ja. so lange dauert es bis led dann weiter durchgezählt hat

   2, 1, 0, 255, 254, 253, 252, 251, .... , 3, 2, 1, 0, 255, 254, ....

von Walter S. (avatar)


Lesenswert?

__Son´s Bersi__ schrieb:
>> Wenn du die Compiler-Warnings einschaltet, meckert er sowas an.
> Der Compiler zeigt keine Warnungen an!

dann hast du nicht alle Warnings eingeschaltet!

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.