Forum: Compiler & IDEs Lauflicht mit bitweisem NOT


von Mangosniper (Gast)


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

von der mechatroniker (Gast)


Lesenswert?

> Hier noch der Code (Vorderer Teil fehlt ( Variablen include usw.)

Der interessantere Teil fehlt natürlich. Meine Glaskugel sagt: b ist als 
signed definiert?

von Karsten (Gast)


Lesenswert?

Uah... Ist das schmutzig...

Warum schreibst Du nicht, um eine 1 zu ergänzen folgendes?

PORTB = (PORTB << 1) + 1;

von Karsten (Gast)


Lesenswert?

Bzw, wenn Du nach rechts schiebst:

PORTB = (PORTB >> 1) + 0x80;

von Karsten (Gast)


Lesenswert?

PS: Ausserdem bist Du das beste Beispiel für ein Depp!!!

http://www.google.de/url?q=http://de.wikipedia.org/wiki/Apostrophitis

(nicht soo böse gemeint...)

von Mangosniper (Gast)


Lesenswert?

"PORTB = (PORTB >> 1) + 0x80;"

Vielen Dnak klappt Super

"Uah... Ist das schmutzig..."

blutiger Anfänger^^ muss wohl ein ziemlicher Shock sein sich so nen Code 
anzusehen :)

btt:

Du kannst mir nicht zufällig sagen wo der Fehler bei meiner Idee war?

von Karl H. (kbuchegg)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

Wer im Glashaus sitzt...
Da ist die Apostrophitis fast das kleinere Übel ;-)

von Stefan E. (sternst)


Lesenswert?

Mangosniper schrieb:

> Du kannst mir nicht zufällig sagen wo der Fehler bei meiner Idee war?

Der Fehler liegt nicht in der Idee an sich, sondern wahrscheinlich in 
der Realisierung. Für eine genauere Aussage müsste man mal wissen, 
welchen Typ die beteiligten Variablen haben.

von Stefan H. (stefanhennig)


Lesenswert?

Karl heinz Buchegger schrieb:

> Alles in
> einer Wurscht am linken Rand runterzuschreiben ist ein sicherer Weg, den
> Überblock zu verlieren.

Ich nehme mal an, dass das kein Schreibfehler ist. Darf ich diesen 
genialen Ausdruck adoptieren?

"Das Problem mit dynamic scoping ist, dass man leicht den Überblock 
verliert"

;-)

  Stefan

von Karl H. (kbuchegg)


Lesenswert?

Stefan Hennig schrieb:
> Karl heinz Buchegger schrieb:
>
>> Alles in
>> einer Wurscht am linken Rand runterzuschreiben ist ein sicherer Weg, den
>> Überblock zu verlieren.
>
> Ich nehme mal an, dass das kein Schreibfehler ist. Darf ich diesen
> genialen Ausdruck adoptieren?

Doch, war es.
Aber du darfst ihn gerne verwenden :-)

von Oberlehrer (Gast)


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

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.