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.
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.
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.
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
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
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 :-)
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)
__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, ....
__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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.