Hallo, ich möchte mein Lauflicht nach einem Durchgang wieder rückwärts laufen lassen. Das "hochlaufen" funktionier auch nur habe ich -keine- Ahnung wie ich es in die entgegen gesetzte Richtung bewege?! for(i=0;i<8;i++) { PORTD =~(1 << i); _delay_ms(50); } Wer kann helfen? Danke
Du kannst die for Schleife einfach wieder mit i-- runterzählen lassen.
Das ist klar aber er soll ja erst hoch zählen, dann runter, wieder hoch etc. Wie schreib ich das?
Benjamin schrieb: > Das ist klar aber er soll ja erst hoch zählen, dann runter, wieder hoch > etc. > Wie schreib ich das? Uhm, erst eine for-Schleife, die hochzählt, dann eine, die runterzählt? Übrigens: Von (1 << i) würde ich allgemein eher abraten, falls es sich um einen AVR handeln sollte. Dieser muß das als Schleife ausführen, weil seine Schiebe-Instruktion nur um genau ein Bit schieben kann. Spielt bei diesem Programm vermutlich keine große Rolle, aber es ist gut, das im Hinterkopf zu behalten.
In Pseudocode: while(1) { for-loop Hochzählen for-loop Runterzählen } //end while
Die runter zählende for Schleife bekomme ich aber nicht so eingebunden dass es funktioniert ;) Das ist mein Problem!
#define F_CPU 4000000 #include <avr/io.h> #include <util/delay.h> int main(void){ int i; DDRD=0xFF; PORTD =1; while(1) { for(i=0;i<8;i++) { PORTD =~(1 << i); _delay_ms(50); } } }
Die Runterzählschleife fehlt bei Dir ja auch noch. Versuchs mal so: while(1) { //hochzählen for(i=0;i<8;i++) { PORTD =~(1 << i); _delay_ms(50); } //runterzählen for(i=7;i>=0;i--) { PORTD =~(1 << i); _delay_ms(50); } }
Die fehlt weil ich meine kläglichen versuche nicht veröffentlichen wollte ;) Verdammt nochmal das hatte ich eben fast alles so wie du nun schreibst... Bis auf das i>=0 , dafür stand bei mir i<7 was wohl nicht so schlau war... DANKE!
Da gibt's aber noch zwei Dinge anzumerken: Zum einen funktioniert das nur, wenn i ein vorzeichenbehafteter Typ ist. Wenn es das nicht ist, bekommt man eine Endlosschleife, weil eine vorzeichenlose Variable natürlich immer >= 0 ist. Zweitens werden so die LEDs an den Enden doppelt so lange leuchten, weil sie in beiden Schleifen enthalten sind. Ob das so sein soll, mußt du natürlich selbst entscheiden, aber wenn nicht, kannst du die zweite Schleife auch so hinschreiben:
1 | for(i=6;i>0;i--) |
Rolf Magnus schrieb: > Zum einen funktioniert das nur, wenn i ein vorzeichenbehafteter Typ ist. Ist aber doch der Fall, siehe sein Quellcode.
Ah sehr informativ! Danke dafür! Kann mir jetzt noch jemand verraten warum ich das im AVR Studio nicht realtime simulieren kann?
Wahrscheinlich weil die Optimierung den Quellcode zu stark verdreht. Stelle sie aus und es sollte funktionieren.
Benjamin schrieb: > Kann mir jetzt noch jemand verraten warum ich das im AVR Studio nicht > realtime simulieren kann? Meistens sind Simulatoren sehr schlecht optimiert, sie laufen daher deutlich langsamer, als der MC in Echtzeit. In Einzelschritt wirst Du daher ewig auf die Zeitabläufe warten. Du mußt nen Breakpoint setzen. Peter
Ich hab dich falsch verstanden, ich dachte der Debugger überspringt mehrere Zeilen auf einmal. Kommentier zum Debuggen einfach die delays aus.
for(i=0;i<16;i++) { PORTD =~((1 << i)|(0x8000 >> i)); _delay_ms(50); }
Warum nicht gleich so: for(float i=0;i<PI;i += PI / 16) { PORTD = ~(1 << ((uint8_t)(sin(i)*8))); if(PORTD) _delay_ms(50); else i += PI / 16; } PS: Am elegantesten sind 2 Schleifen welche eine 1 vor und zurückschieben.
Samuel K. schrieb: > Warum nicht gleich so: > for(float i=0;i<PI;i += PI / 16) > { > PORTD = ~(1 << ((uint8_t)(sin(i)*8))); > if(PORTD) > _delay_ms(50); > else > i += PI / 16; > } > > PS: Am elegantesten sind 2 Schleifen welche eine 1 vor und > zurückschieben. Weil man sehr schlecht mit diesem Beispiel die Vorgänge nachverfolgen kann und es recht unübersichtlich ist (für einen Anfänger). Kannst du einmal beschreiben wie dieser Code genau abläuft? (Auch Anfänger).
Michael D. schrieb: > Weil man sehr schlecht mit diesem Beispiel die Vorgänge nachverfolgen > kann und es recht unübersichtlich ist (für einen Anfänger). Ich würde ja jetzt nicht meine Hand ins Feuer legen, aber mein Eindruck ist, daß das die Idee des Postings war, als ironische Antwort auf dessen Vorposting.
Rolf Magnus schrieb: > Ich würde ja jetzt nicht meine Hand ins Feuer legen, aber mein Eindruck > ist, daß das die Idee des Postings war, als ironische Antwort auf dessen > Vorposting. Spinnt ihr? Wie könnt ihr eine so kompetente Antwort, wie die von MaWin, durch ironische Kommentare lächerlich machen??? Die kommt schließlich von MaWin und der hat doch IMMER recht! P.S. Manchmal ironiere ich bis zu Sarkasmus ;)
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.