www.mikrocontroller.net

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


Autor: Johannes Permoser (Gast)
Datum:

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

Autor: Klaus (Gast)
Datum:

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

Autor: Carsten (Gast)
Datum:

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

Autor: Carsten (Gast)
Datum:

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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

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

Autor: Rahul (Gast)
Datum:

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

Autor: Johannes Permoser (Gast)
Datum:

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

Autor: Johannes Permoser (Gast)
Datum:

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

Autor: Marc Gauger (Gast)
Datum:

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

Autor: Johannes Permoser (Gast)
Datum:

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

Autor: Christoph Kessler (db1uq) (Gast)
Datum:

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

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.