Forum: Compiler & IDEs Lauflicht zurück laufen lassen


von Benjamin (Gast)


Lesenswert?

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

von Martin S. (mstahl)


Lesenswert?

Du kannst die for Schleife einfach wieder mit i-- runterzählen lassen.

von Benjamin (Gast)


Lesenswert?

Das ist klar aber er soll ja erst hoch zählen, dann runter, wieder hoch 
etc.
Wie schreib ich das?

von Rolf Magnus (Gast)


Lesenswert?

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.

von Martin S. (mstahl)


Lesenswert?

In Pseudocode:

while(1) {

for-loop Hochzählen

for-loop Runterzählen

} //end while

von Benjamin (Gast)


Lesenswert?

Die runter zählende for Schleife bekomme ich aber nicht so eingebunden 
dass es funktioniert ;)

Das ist mein Problem!

von Martin S. (mstahl)


Lesenswert?

Na dann zeig mal her Deinen Quellcode

von Benjamin (Gast)


Lesenswert?

#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);
    }
  }
}

von Martin S. (mstahl)


Lesenswert?

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);
    }
}

von Benjamin (Gast)


Lesenswert?

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!

von Martin S. (mstahl)


Lesenswert?

Gern geschehen

von Rolf Magnus (Gast)


Lesenswert?

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--)

von Martin S. (mstahl)


Lesenswert?

Rolf Magnus schrieb:
> Zum einen funktioniert das nur, wenn i ein vorzeichenbehafteter Typ ist.

Ist aber doch der Fall, siehe sein Quellcode.

von Rolf Magnus (Gast)


Lesenswert?

Ja, ich wollt's nur noch mal erklären.

von Benjamin (Gast)


Lesenswert?

Ah sehr informativ!
Danke dafür!

Kann mir jetzt noch jemand verraten warum ich das im AVR Studio nicht 
realtime simulieren kann?

von Sam .. (sam1994)


Lesenswert?

Wahrscheinlich weil die Optimierung den Quellcode zu stark verdreht. 
Stelle sie aus und es sollte funktionieren.

von Benjamin (Gast)


Lesenswert?

Sagst du mir auch wie das geht? ;)

von Peter D. (peda)


Lesenswert?

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

von Sam .. (sam1994)


Lesenswert?

Ich hab dich falsch verstanden, ich dachte der Debugger überspringt 
mehrere Zeilen auf einmal. Kommentier zum Debuggen einfach die delays 
aus.

von MaWin (Gast)


Lesenswert?

for(i=0;i<16;i++)
{
    PORTD =~((1 << i)|(0x8000 >> i));
     _delay_ms(50);
}

von Sam .. (sam1994)


Lesenswert?

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.

von Michael D. (Gast)


Lesenswert?

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).

von Rolf Magnus (Gast)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.