Forum: Mikrocontroller und Digitale Elektronik 2 Bit und 6 Bit zu 1 Byte zusammenführen


von Johannes Permoser (Gast)


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

von Klaus (Gast)


Lesenswert?

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

von Carsten (Gast)


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

von Carsten (Gast)


Lesenswert?

sorry, muss natürlich 0xC0 heißen (nicht 0x03)

von Karl heinz B. (kbucheg)


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 );

von Rahul (Gast)


Lesenswert?

x = (PIND & 0xFC) | (PINB & 0x03);
Dann steht aber PD7-PD6-PD5-PD4-PD3-PD2-PB1-PD0 in x...

von Johannes Permoser (Gast)


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.

von Johannes Permoser (Gast)


Lesenswert?

was ich noch vergessen hatte: assembler ^^ (macht die sache natürlich
nicht gerade schöner)

von Marc Gauger (Gast)


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

von Johannes Permoser (Gast)


Lesenswert?

ich glaube jetzt haben wirs. danke marc
hatte mich oben in der reihenfolge vertan, wobei die reihenfolge
eigentlich egal ist ^^

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

übers Carryflag aus einem Register raus, andere Richtung in ein zweites
Register rein, also 6* ror rol dann ist die Reihenfolge gespiegelt

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.