Forum: Compiler & IDEs Rotierende Led mit C-Code funktioniert nicht


von Yassin Falko (Gast)


Lesenswert?

Hallo,

wir haben in Informatik gemeinsam einen C-Code erstellt der eine Led an 
einem At89S52 rotieren lassen soll. Aber irgendwie leuchtet die ganze 
Zeit nur eine Led auf. Daher wollte ich fragen was denn am folgenden 
C-Code falsch ist.
1
at 0x80 sfr leds;
2
3
void warten(void)
4
{
5
    unsigned int x;
6
    
7
    for(x=0;x<65000;x++)
8
    {
9
    }
10
11
}
12
13
void main(void)
14
{
15
    char x;
16
    leds=0b00000001;
17
    
18
    while(1)
19
    {
20
        for(x=0;x<7;x++)
21
        {
22
            leds<<1;
23
            
24
            warten();
25
         
26
        }
27
        
28
        while(x>0)
29
        {
30
            leds>>1;
31
        
32
            warten();
33
        
34
            x=x-1;
35
        }
36
    }
37
    
38
}

Es wäre sehr nett wenn ihr mir helfen könntet.

von Stefan E. (sternst)


Lesenswert?

1
 leds<<1;
2
...
3
 leds>>1;
Quizfrage: warum schreibst du an anderer Stelle "x=x-1;" und nicht 
einfach nur "x-1;"?

von Yassin Falko (Gast)


Lesenswert?

das ist ja dazu da damit die led zurück rotiert
das ist ja fast wie eine forschleife, damit wird die variable 
runtergezählt

von Thomas K. (muetze1)


Lesenswert?

Denk nochmal darüber nach welche Analogien du bezüglich seiner Frage, 
deiner Antwort und dem von ihm zitierten Code herstellen kannst...

von kopfkratzer (Gast)


Lesenswert?

Yassin Falko schrieb:
> der eine Led an
> einem At89S52 rotieren

Aha und an welchem Motor ist die befestigt ?
Poste mal das gesamte Projekt = Hausaufgabe :-P

von Stefan E. (sternst)


Lesenswert?

Yassin Falko schrieb:
> damit wird die variable
> runtergezählt

Ja, aber warum schreibst du dafür "x=x-1;" hin und nicht "x-1;"? Was ist 
der Unterschied zwischen den beiden Ausdrücken? Und was bedeutet das für 
die anderen beiden (Schiebe-) Ausdrücke?

von Yassin Falko (Gast)


Lesenswert?

also die Hausaufgabe steht jetzt nirgendswo, wir haben das im unterricht 
besprochen und einen porgrammablaufplan mit papdesigner erstellt. ich 
verstehe jetzt aber nicht ganz, abgesehen davon : was ist eine analogie 
?

von Yassin Falko (Gast)


Lesenswert?

x = x - 1 bedeutet das, das x mit jedem Schleifendurchlauf solange 
runtergezählt wird, wie oft man shifte left ausführen möchte

von holger (Gast)


Lesenswert?

leds <<= 1;
            leds >>= 1;

von Meister E. (edson)


Lesenswert?

Hallo Yassin,

du stehst auf dem Schlauch ;)

Wenn du
1
x = x - 1
 schreibst, nimmst du eine Zuweisung vor. Wo im Ausdruck
1
leds<<1
siehst du eine Zuweisung?

von Yassin Falko (Gast)


Lesenswert?

also soll ich das einfach weglassen ?

von kopfkratzer (Gast)


Lesenswert?

Yassin Falko schrieb:
> also soll ich das einfach weglassen ?
>
>
>
>     Beitrag melden Bearbeiten Löschen

Weiter oben benutzt Du ja x++, also hier wäre x-- sinnvoll.
Nur solange die Aufgabe nicht wirklich ersichtlich ist kann ich nihct 
weiterhelfen.
Sind mehrere LEDs an einem Port und die sollen reihum an und wieder 
ausgeschaltet werden ?
Oder soll eine LED einfach blinken ?

von Yassin Falko (Gast)


Lesenswert?

einmal rund herum blinken

von Yassin Falko (Gast)


Lesenswert?

also ich habe jetzt x-- benutzt aber es leuchtet trotzdem nur die erste 
led

von kopfkratzer (Gast)


Lesenswert?

Yassin Falko schrieb:
> also ich habe jetzt x-- benutzt aber es leuchtet trotzdem nur die erste
> led

Dann überlege mal wie die an und ausgeschaltet wird und was der 
Unterschied zwischen dieser LED und den anderen ist.

von Stefan E. (sternst)


Lesenswert?

kopfkratzer schrieb:
> Dann überlege mal wie die an und ausgeschaltet wird und was der
> Unterschied zwischen dieser LED und den anderen ist.

Das eigentliche Problem wurde längst aufgezeigt.

von Meister E. (edson)


Lesenswert?

Yassin Falko schrieb:
> also soll ich das einfach weglassen ?

Nein. Denk mal genau anders herum: Was könntest du an dem Ausdruck mit 
den leds denn noch hinzufügen damit du dein Ziel erreichst? (Hinweis: 
Holger hat es schon hingeschrieben)

PS. Mehr sage ich dazu nicht mehr sonst komme ich mir blöd vor.

von arrogant (Gast)


Lesenswert?

Was die arroganten Vorposter sagen wollen, du musst entweder
1
leds>>=1;

(und das Entsprechende mit <<=)

verwenden ODER du schreibst
1
leds=leds>>1;

>> verschiebt nur die Bits, aber speichert das Ergebnis nirgendwo! x-1 rechnet nur 
die Subtraktion, aber speichert das Ergebnis nirgendwo, wenn nicht x= davor steht. 
>>= ist eine Kurzform (siehe oben). Genau wie -=
Ein Zeichen, große Wirkung. Nun klar? ;)

von Rolf Magnus (Gast)


Lesenswert?

arrogant schrieb:
> Was die arroganten Vorposter sagen wollen,

Die sind nicht arrogant, sondern versuchen, Yassin dabei zu helfen, 
selbst drauf zu kommen, statt einfach nur das Ergebnis hinzuschreiben. 
Das trägt zum Verstehen nämlich viel mehr bei.

von Meister E. (edson)


Lesenswert?

@arrogant

Der werfe den ersten Stein, sage ich da nur...

Lies deinen eigenen Beitrag mal durch, dann wirst du vielleicht merken 
dass man davon nichts lernen kann. Du verwendest kein einziges 
brauchbares Wort, das einem Anfänger als Gedächtnisstütze dienen könnte. 
Deine Erklärung ist eher Kategorie "gestammelte Werke" und kaum lesbar, 
weil du anscheinend die Kommentarfunktion nicht kapierst. Also kehr erst 
mal vor deiner eigenen Tür bevor du hier Verweise verteilst.

von Peter D. (peda)


Lesenswert?

In C ist ein Ausdruck zulässig auch ohne das Ergebnis zuzuweisen.
Z.B.:
1
  SBUF;
Liest das Register SBUF ein, bewirkt damit das Leeren des UART-Puffers, 
ist also ein sinnvoller Ausdruck.

Aber eine Berechnung, wo man das Ergebnis wegschmeißt, ist in der Regel 
ohne Effekt. Und genau das hast Du gemacht. Und daher auch gesehen, daß 
es keinen Effekt hat.

Desweitern kann das Ändern eines Ports Nebenwirkungen haben, da man die 
tatsächlichen Spannungspegel von außen einliest. Z.B. das Abschalten des 
Pullups bei einem Pin mit gedrückter Taste.
Besser ist daher eine Variable zu nehmen, die man ändert und ausgibt.


Peter

von Udo S. (urschmitt)


Lesenswert?

Yassin muss immer noch erklären wie er EINE Led nur mit Software in 
verschiedene Richtungen (rundherum) blinken lassen will

Yassin Falko schrieb:
> der eine Led an einem At89S52 rotieren lassen soll.

Yassin Falko schrieb:
> einmal rund herum blinken

Wie soll man jemandem helfen, der noch nicht mal sein Aufbau auch nur 
rudimentär beschreibt. Auch wenn es sich die meisten inzwischen in etwa 
denken können.

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.