Go Down

Topic: Bitreihe dynamisch zusammen bauen (Read 262 times) previous topic - next topic

Sijjim

Nochmal Hallo,

Folgendes Problem hängt mit dem anderen eben geposteten zusammen, ist aber doch was ganz anderes, daher ein neuer Faden.

Als Antwort auf ein Serial.read() wird ein Serial.write() gesendet. Gesendet wird ein 8bit Strom. Wie genau der aussieht hängt von den 4 Tasten (Links, Runter, Hoch, Rechts) und deren Zustand ab. Nicht gedrückt ist 1, gedrückt ist 0. Das Muster sieht dann so aus:
Quote
0bLRHR0000
Ohne gedrückter Taste wird gesendet
Quote
0b11110000
Wird zum Beispiel die Taste Links gedrückt soll ein
Quote
0b01110000
gesendet werden.

Mein Problem jetzt ist, es können auch mehrere Tasten gleichzeitig gedrückt werden. Statisch je nach Tastenzustand geht, aber um das komplett zu machen ist mir das zu umständlich, sind das doch insgesamt 16 verschiedene Kombinationen....

Wie kann ich die Bits dynamisch zusammen bauen?

Vielen Dank und
Grüße

sschultewolter

Mit den setBit/setClear Makros. Oder direkt so..

Code: [Select]

byte test;

test |= 1<<7; // Setzt an der obersten Stelle (links) eine 1.
test &= ~(1<<0); // Löscht an der untersten Stelle (rechts) die 1.


Ansonsten mal Google nach Bitmanipulation.
Arduino Yun und Due abzugeben, bei Interesse PN.

Sijjim

Also sollte mich das so zum Ziel bringen, oder?
Code: [Select]
byte test = 0xFO;

if (TasteLinks)
  {
    test &= ~(1<<7);
  }
 
if (TasteRunter)
  {
    test &= ~(1<<6);
  }
 
if (TasteHoch)
  {
    test &= ~(1<<5);
  }
 
if (TasteRechts)
  {
    test &= ~(1<<4);
  }
 
Serial.write(test);


Wenn man weiß wie sieht das auf einmal so einfach aus  :smiley-grin:
Vielen Dank

sschultewolter

Die ersten Basics in AVR-GCC. Leider stolpert man als Arduino IDE Nutzer etwas später erst drüber.
https://www.mikrocontroller.net/articles/Bitmanipulation
Arduino Yun und Due abzugeben, bei Interesse PN.

Sijjim

Ich schaue ja schon immer in den Arduino "Language Reference" was ich nehmen kann aber die reinen Bitwise Operators kamen mir auch noch zu umständlich vor. Jetzt hab ich gerade gesehen und auch verstanden, was mit dem bitSet() und bitClear() gemeint ist   :smiley-mr-green:
Danke für den Link, den hatte ich auch gefunden nachdem du

....
Ansonsten mal Google nach Bitmanipulation.
geschrieben hattest. Manchmal weiß ich etwa wo ich hin will, weiß mich aber nicht korrekt auszudrücken und dann finde ich in Google auch nix. Das Wort "Bitmanipulation" wars  :smiley-lol:

Kann dir leider nur einmal die Stunde Karma gutschreiben, daher muß ein mündliches DANKE hier reichen

Serenifly

Die Arduino Makros machen im Hintergrund auch nichts anderes.

Man kann es noch etwas mit dem _BV() Makro vereinfachen:
Code: [Select]

var |= _BV(3);
var &= ~_BV(3);


Dadurch spart man sich das (1 << n) auszuschreiben

sschultewolter

Muss dafür aber im Gegenzug auch _BV. Kommt letzenendes auf das gleiche hinaus, wobei var |=1<<3 wäre kürzer  :smiley-mr-green:
Arduino Yun und Due abzugeben, bei Interesse PN.

Serenifly

Ist aber weniger verwirrend für Anfänger. Gibt viele Leute die nicht verstehen was bei 1 << 3 gemacht wird. :)

Sijjim

Ich belasse es lieber mit dem 1<<3, das hat sich gleich in der Hirnrinde verankert und damit kann ich was anfangen. Finde ich persönlich sogar einleuchtender als das _BV, wofür ich gerade gar keine Eselsbrücke oder dergleichen finde....

Egal, mein Problem ist gelöst, ich danke euch für die Hilfestellungen  :smiley-lol:

Serenifly

Geschmackssache. Gibt für vieles mehrere Lösungen.

BV steht für "bit value"

uwefed

es gibt auch die Funktionen
    bit()
    bitRead()
    bitWrite()
    bitSet()
    bitClear()
Siehe Arduino Referenz rechts unten : http://www.arduino.cc/en/Reference/HomePage .

Grüße Uwe

ElEspanol

#11
Apr 28, 2015, 05:41 pm Last Edit: Apr 28, 2015, 07:38 pm by ElEspanol
Code: [Select]

byte test=0;

test |= tastelinks << 7; // Setzt an der obersten Stelle (links) eine 1.
test |= tasterechts << 6;
test |= tasteoben << 5;
test |= tasteunten << 4;


wenn du statt der Variablen tasteoben etc.  noch direkt digitalRead reinsetzt,  gehts noch einfacher. oder das ganze dann in eine Schleife und die Pins aus einem array auslesen,  wenn sie nicht aufeinanderfolgend sind ;)

sschultewolter

#12
Apr 28, 2015, 05:49 pm Last Edit: Apr 28, 2015, 05:50 pm by sschultewolter
Nein, so dürfte das nicht klappen. Zum einen fehlt über der zweite Shiftoperator, der weiteren fehlt hier der Löschbefehl.

Zumal du auch hier alles verdreht hast, oder gibt es Schreibweisen, die mir bislang in keiner Lektüre aufgefallen sind?

Arduino Yun und Due abzugeben, bei Interesse PN.

ElEspanol

klar,  der Shift Operator,  da hast du natürlich Recht. Habe es gerade nachgebessert.

Aber den Zustand reinshiften, das habe ich schon mal gemacht,  und ich meine,  es hat auch funktioniert,  mit boolean Variablen zumindest. Sollte ja aber keinen Unterschied machen.

Geht allerdings nur,  wenn ich die Variable jedesmal KOMPLETT zusammensetze, deswegen habe ich auch oben auf byte=0 geändert.

Bin auswärts,  kann es gerade weder nachschauen noch testen.

Go Up