www.mikrocontroller.net

Forum: Compiler & IDEs Lauflicht mit bitweisem NOT


Autor: Mangosniper (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.)
if(PIND == 0b11111011){ // Wenn SW2 (der mit PIND verbunden ist) gedrückt wird startet der code.
x=0;                //Falls der Code schonmal aktiviert wurde x resetten
PORTB = 0b01111111; //Bis sich das Muster der Lichter wiederholen soll die bit´s einzeln bestimmen.
_delay_ms(100);     //""
PORTB = 0b00111111; //""
_delay_ms(100);     //""
PORTB = 0b00011111; //""
_delay_ms(100);     //""
PORTB = 0b10001111; //""
_delay_ms(100);     //""
PORTB = 0b11000111; //""
_delay_ms(100);     //""
while(x<3)          //Die nächsten 3 Lampen sollten an sein.Funktioniert auch.
{                   //PORTB ist jetzt = 0b00011000
x=x+1;              //Damit die Schleife 3 mal ausgeführt wird x in jedem durchlauf erhöhen
xa = 3;
xm = 2;

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

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

}
}//if
}//while(1)
}//main

Mfg Mangosniper

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uah... Ist das schmutzig...

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

PORTB = (PORTB << 1) + 1;

Autor: Karsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bzw, wenn Du nach rechts schiebst:

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

Autor: Karsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: Ausserdem bist Du das beste Beispiel für ein Depp!!!

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

(nicht soo böse gemeint...)

Autor: Mangosniper (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
int main()
{
  unsigned char state = 0b11100111;
  
  DDRB = 0xFF;    // alles auf Ausgang
  PORTB = state;

  while( 1 ) {
    _delay_ms( 100 );

    if( state & 0x01 )
      state = ( state >> 1 ) | 0x80;
    else
      state = ( state >> 1 );

    PORTB = state;
  }
}


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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Hennig (stefanhennig)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Oberlehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.