Lauflicht mit bitweisem NOT

Gast #1454292
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
Gast
> Hier noch der Code (Vorderer Teil fehlt ( Variablen include usw.)

Der interessantere Teil fehlt natürlich. Meine Glaskugel sagt: b ist als 
signed definiert?
Gast
"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?
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.
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.
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
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 :-)
Gast
>> 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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.