Lauflicht mit bitweisem NOT

Gast #1454292
Lesenswert?

Ich möchte an meinem STK500 ein Lauflicht programmieren welches 
ausgelöst wird wenn man den switch2 drückt. Es soll aus  3 
zusammenhängenden Lichtern bestehen die im Abstand von 2 ausgeschalteten 
Lichtern mehrmals durch die 8 LED`s laufen.

um die ausgeschalteten Lichter zu erzeugen benutze ich den bitweisen NOT 
Operator da man mit dem shift Operator nur so verschieben kann das eine 
0 ergänzt wird ich brauche aber eine 1:

0b01110000 mit shift Operator um 1 verschieben =
0b00111000

Um eine 1 zu bekommen ende ich also zuerst den NOT Operator an:

0b01110000 mit NOT Operator invertieren: =
0b10001111 und dann verschieben =
0b01000111 dann wieder mit NOT invertieren =
0b10111000 Jetzt sollte ich eigentlich eine 1 ergänzt haben

Pustekuchen.Es kommt trozdem eine 0. (Heißt die LED`s bleiben nach der 
ersten Pause alle an und es entsteht kein Lauflicht =>
So sieht es aus           0b11111100
und so sollte es aussehen 0b10001100)

Hier noch der Code (Vorderer Teil fehlt ( Variablen include usw.)
1
if(PIND == 0b11111011){ // Wenn SW2 (der mit PIND verbunden ist) gedrückt wird startet der code.
2
x=0;                //Falls der Code schonmal aktiviert wurde x resetten
3
PORTB = 0b01111111; //Bis sich das Muster der Lichter wiederholen soll die bit´s einzeln bestimmen.
4
_delay_ms(100);     //""
5
PORTB = 0b00111111; //""
6
_delay_ms(100);     //""
7
PORTB = 0b00011111; //""
8
_delay_ms(100);     //""
9
PORTB = 0b10001111; //""
10
_delay_ms(100);     //""
11
PORTB = 0b11000111; //""
12
_delay_ms(100);     //""
13
while(x<3)          //Die nächsten 3 Lampen sollten an sein.Funktioniert auch.
14
{                   //PORTB ist jetzt = 0b00011000
15
x=x+1;              //Damit die Schleife 3 mal ausgeführt wird x in jedem durchlauf erhöhen
16
xa = 3;
17
xm = 2;
18

19
while(xa > 0)       //Die nächsten 3 Lampen sollten an sein.Funktioniert auch.
20
{                            
21
PORTB = (PORTB >> 1);//die Bits bei PORTB bei jedem Durchlauf 1 nach rechts verschieben
22
xa = xa-1;             
23
_delay_ms(100);     
24
}                   //PORTB ist jetzt = 0b00011000
25

26
while(xm > 0)       //Die nächsten 2 Lampen sollen aus bleiben also kann ich nicht einfach den shift Operator nehmen
27
{                   //denn der würde 0 ergänzen aber ich brauch eine 1. Also drehe ich den Wert in PORTB mit 
28
b = PORTB;          //dem NOT ( ~ ) Operator verschiebe ihn dann und drehe wieder zurück.Das Resultat davon ist,
29
b = ~b;             //dass nicht eine 0 sondern eine 1 links ergänzt wird, der Rest des Wertes aber gleich bleibt.
30
a = (b >> 1);       //So sollte es sein.In Wirklichkeit steht in PORTB dann aber 0b00000110.
31
a = ~a;
32
PORTB = a;
33
xm = xm-1; 
34
_delay_ms(100);
35
}
36

37
}
38
}//if
39
}//while(1)
40
}//main

Mfg Mangosniper
#1454335
Lesenswert?

Will hier nicht kritisieren. Du hast dir etwas überlegt und das finde 
ich gut (auch wenn du an den Details signed/unsigned gescheitert bist). 
Wenn ich an mein erstes Sortierprogramm zurückdenke, dann wird mir heute 
noch schle...   lassen wir das.

Studier mal, wie dieser Code arbeitet
1
int main()
2
{
3
  unsigned char state = 0b11100111;
4
  
5
  DDRB = 0xFF;    // alles auf Ausgang
6
  PORTB = state;
7

8
  while( 1 ) {
9
    _delay_ms( 100 );
10

11
    if( state & 0x01 )
12
      state = ( state >> 1 ) | 0x80;
13
    else
14
      state = ( state >> 1 );
15

16
    PORTB = state;
17
  }
18
}


und nochwas: Einrücken! Es ist essentiell wichtig, dass du deine 
Codestruktur sichtbar machst, indem du Einrückungen verwendest. Alles in 
einer Wurscht am linken Rand runterzuschreiben ist ein sicherer Weg, den 
Überblock zu verlieren.
Gast #1454869
Lesenswert?

>> PS: Ausserdem bist Du das beste Beispiel für ein Depp!!!
> Der Dativ ist dem Genitiv sein Tod.

Da steht weder ein Dativ, noch ein Genitiv, und es gehört auch keins von 
beiden dahin. ;-)
"Multiple exclamation marks" sind laut Terry Pratchett übrigens "a sure 
sign of a diseased mind", wenn wir schon mal beim Lästern sind.

> Da ist die Apostrophitis fast das kleinere Übel ;-)

Wenn's denn wenigstens ein Apostroph gewesen wäre, aber es war auch noch 
ein Gravis ("Akzent des Grauen`s").

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren