2 Bit und 6 Bit zu 1 Byte zusammenführen

Gast #340481
Lesenswert?

und weiter geht das lustige Fragenstellen ^^

also: da ich keinen kompletten Eingang mehr frei hab, hab ich die
Lichtschranken auf mehrere Eingänge aufteilen müssen
Sie liegen jetzt auf PD2-PD3-PD4-PD5-PD6-PD7 und PB0-PB1

und ich möchte daraus jetzt ein Byte aufbauen mit folgender
Reihenfolge:
PD2-PD3-PD4-PD5-PD6-PD7-PB0-PB1

natürlich könnte ich die einzelnen Bits getrennt voneinander abfragen
und ggf. im Ergebnis-Byte setzen, aber so viel Zeit hab ich nicht ^^
(außerdem muss es da doch eine schönere Lösung geben)

mfg, Johannes
Gast #340483
Lesenswert?

PD zweimal nach rechts schieben und mit 0x3F verUNDen.
PB zweimal nach rechts schieben (ohne carry) oder sechs mal nach links
und mit 0x03 verUNDen.
Beide Register nun miteinander verODERn.

Stichwort Maskierung
#340485
Lesenswert?

Dafür gibt es keine wirklich schöne Lösung.
Das Hauptproblem ist, dass du die Wertigkeit der
Bits umgedreht haben willst (oder hast du dich
nur ungeschickt ausgedrückt, da oben).

Wenn PD2 als Bit7 gesetzt werden soll, bleibt
nicht viel übrig außer ABfragen und Bit setzen.

Wnn dem nicht so ist dann ist das ganze ein simples
Schieben und ver-odern der beiden Teile:

  unsigned char Total;
  unsigned char PinD, PinB;

  PinD = PIND;
  PinB = PINB;

  Total = ( Pind << 2 ) | ( PinB & 0x03 );
Gast #340487
Lesenswert?

> Hmm, Varialble definieren und Bit setzten. Das ist zu einfach oder
> Deine Frage ist nicht richtig gestellt?

also ich habe die bytes 00###### und ##000000 (wobei # für die werte
steht, die ich haben will, und 0 für uninteressante werte (muss aber
nicht 0 sein))
jetzt möchte ich daraus ######## machen, die reihenfolge der # ist die
gleiche wie oben.
und ich kann es nicht von hand machen, da mein programm das öfters
erledigen soll.
Gast #340489
Lesenswert?

In welcher Sprache programmierst du?
Und wäre es noch möglich die Sache anderstrum anzuschließen, dass sich
das Byte aus:
PD7-PD6-PD5-PD4-PD3-PD2-PB1-PB0 zusammensetzt, dann könntest ganz
einfach mit:

tmp = R16
tmp2 = R17
in tmp, PinD ;PortD einlesen
andi tmp, 0b11111100 ;Die unteren beiden Bits löschen
in tmp2, PinB ;PortB einlesen
andi tmp2, 0b00000011 ; Die obenren 6 Bits löschen
or tmp, tmp2 ;Logisch ODER verknüpft.
dein Byte ist in tmp.

Ansonsten müsstens du deine Positionen deines eingelesenen Bytes
verschieben.

Gruß Marc

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