Forum: Mikrocontroller und Digitale Elektronik 4-bit miteinander vergleichen


von Julia (Gast)


Lesenswert?

Guten Morgen,

ich lese über den ADC einen Wert von 0 bis 1023 ein und speichere diese 
in einer 16-bit Variable (uint16_t) ab. Ich shifte diesen Wert 6 Stellen 
nach rechts (so dass ich nur die oberen 4-Bits verwende) und speichere 
das Ergebnis in einer 8-bit Variable (uint8_t) ab. Dieses funktioniert 
super. (0V: 0, 2.5V: 8 & 5V: 15) Das Ergebnis hab ich mir am LCD-Display 
anzeigen lassen. Nun möchte ich am PORTD ebenfalls 4-Bit einlesen 
(PD0...PD3) und ebenfalls in einer 8-Bit variable (uint8_t) abspeichern. 
Diese beiden 8-bit Variablen möchte ich gerne miteinander vergleichen 
und bei Bedingung (==) einen Ausgang setzen. Das Problem dabei ist, wie 
ich feststellen musste, dass PD4-PD7 ebenfalls als Eingang / Ausgang 
(z.B PD5 PWM AUsgang) benutzt werden. Ich möchte nur die 4 LSB Bits 
(XXXX0000 .... XXXX1111) haben. Gibt es eine SHift Operation bzw. eine 
Bitmanipulation wie ich in einer 8-Bit Variable Bit 4-7 löschen kann???

Gruß

Julia

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Julia schrieb:
> Gibt es eine SHift Operation bzw. eine
> Bitmanipulation wie ich in einer 8-Bit Variable Bit 4-7 löschen kann???
Ja. Siehe Bitmanipulation

Nachdem ich erfolgreich geraten habe, dass du C verwendest, empfehle 
ich dir sowas:
1
   if (anzeigewert&0xf0 == (pind<<4)&0xf0) 
2
      setze_ausgan();
Hier werden jeweils die oberen 4 Bits ausmaskiert und verglichen, 
nachdem der am Port 4 eingelesene Wert zurechtgerückt wurde...

von shift (Gast)


Lesenswert?

Julia schrieb:
> (z.B PD5 PWM AUsgang) benutzt werden. Ich möchte nur die 4 LSB Bits
> (XXXX0000 .... XXXX1111) haben. Gibt es eine SHift Operation bzw. eine
> Bitmanipulation wie ich in einer 8-Bit Variable Bit 4-7 löschen kann???

Beide Variable 4 Mal nach links shiften? Dann sind die 4 LSB alle 0. Die 
interessierenden Bits sind daan die LSB aber sollte für einen Vergleich 
keine Rolle spielen.

von Andi (Gast)


Lesenswert?

Hallo,

Nun - wenn du bei einer 8-Bit Variablen nur die 4 lsb benötigst, 
könntest
du => 8-Bit Variable = 8-Bit Variable $ 0x0F verwenden.
Damit werden die 4 msb auf 0 gesetzt und die 4 lsb behalten ihren Wert.

lg.

von shift (Gast)


Lesenswert?

shift schrieb:
> Beide Variable 4 Mal nach links shiften? Dann sind die 4 LSB alle 0. Die
> interessierenden Bits sind daan die LSB aber sollte für einen Vergleich
> keine Rolle spielen.

dann die MSB :(

von Julia (Gast)


Lesenswert?

Vielen Dank an alle für die schnelle Hilfe.

würde das dann auch funktionieren wenn ich zuerst die Variable 4-bits 
nach links shifte und dann wieder 4-bits nach rechts? Oder denke ich da 
zu einfach?

variable = variable << 4;
variable = variable >> 4;

von shift (Gast)


Lesenswert?

Julia schrieb:
> würde das dann auch funktionieren wenn ich zuerst die Variable 4-bits
> nach links shifte und dann wieder 4-bits nach rechts? Oder denke ich da
> zu einfach?

Bei uint8_t und deinem Beispiel, ja. Sonst muß aufpassen, daß von links 
nicht sign oder sonstwas nachrückt. Über shift Operatoren schlau machen.

von Karl H. (kbuchegg)


Lesenswert?

Julia schrieb:
> Vielen Dank an alle für die schnelle Hilfe.
>
> würde das dann auch funktionieren wenn ich zuerst die Variable 4-bits
> nach links shifte und dann wieder 4-bits nach rechts? Oder denke ich da
> zu einfach?
>
> variable = variable << 4;
> variable = variable >> 4;

Bei dir: ja.
Aber du solltest wirklich anfangen die binären Und (&) bzw Oder (|) 
Operationen zu benutzen und lernen wie man mit ihnen umgeht umgezielt 
einzelne Bits oder Bitgruppen auf wahlweise 0 oder 1 zu setzen. Das ist 
für einen µC-Programmierer gleich nach dem kleinen Einmaleins eine der 
wichtigsten Fertigkeiten, die er beherrschen muss.

von Malte S. (maltest)


Lesenswert?

Kleine Optimierung: falls möglich kannst du dir mit links ausgerichtetem 
ADC den 16-Bit-Wert komplett sparen. s. ADLAR im ADMUX-Register. Dann 
stehen in ADCH die oberen 8 Bit des Wertes.

von Julia (Gast)


Lesenswert?

Okay danke

Karl Heinz Buchegger schrieb:
> Julia schrieb:
>> Vielen Dank an alle für die schnelle Hilfe.
>>
>> würde das dann auch funktionieren wenn ich zuerst die Variable 4-bits
>> nach links shifte und dann wieder 4-bits nach rechts? Oder denke ich da
>> zu einfach?
>>
>> variable = variable << 4;
>> variable = variable >> 4;
>
> Bei dir: ja.
> Aber du solltest wirklich anfangen die binären Und (&) bzw Oder (|)
> Operationen zu benutzen und lernen wie man mit ihnen umgeht umgezielt
> einzelne Bits oder Bitgruppen auf wahlweise 0 oder 1 zu setzen. Das ist
> für einen µC-Programmierer gleich nach dem kleinen Einmaleins eine der
> wichtigsten Fertigkeiten, die er beherrschen muss.

Okay Danke. Dann werd ich es versuchen, die Variable mit & zu verknüfen, 
sowie es Andi auch schon vorgeschlagen hat.

von Karl H. (kbuchegg)


Lesenswert?

Julia schrieb:

> Okay Danke. Dann werd ich es versuchen, die Variable mit & zu verknüfen,
> sowie es Andi auch schon vorgeschlagen hat.


Wenn es dir hilft, dann stell dir die binäre Und-Operation wie ein 
'Sieb' vor, bei dem du einzelne Poren verschliessen kannst

(Bitdarstellung, zur besseren Übersicht sind die Nibbles getrennt)

      1011 0101       deine 8-Bit Original-Zahl

  &   0011 1000       hier ist das 'Sieb'. Dort wo eine 1 steht ist
                      es durchlässig. Genau diese Stelle der Original-
                      zahl wird durchgelassen. Dort wo ein 0-Bit steht,
                      ist das Sieb geschlossen, das entsprechende Bit
                      von der Originalzahl kommt nicht durch und im
                      Ergebnis ist an dieser Position auf jeden Fall
                      ein 0 Bit
    -------------
      0011 0000       Einfach bitweise durchgehen. Ist das Sieb (wir
        ^^ ^          sagen auch 'Maske') an dieser Stelle durchlässig
        || |          oder nicht. Je nachdem taucht das Originalbit
        || |          an dieser Position auf oder eben nicht.
        || |
     nur diese Bits stammen aus dem Original aus der ersten Zeile
     Dies deshalb, weil in der Maske (dem Sieb) an genau diesen
     Positionen ein 1 Bit war. Alle anderen Bits im Ergebnis
     sind definitiv 0 - egal was sie im Original waren.

von Route_66 H. (route_66)


Lesenswert?

Hallo!
...und als Ergänzung zu Karl Heinz:
Das ODER wirkt wie ein "Stempel"; überall wo eine Eins ist, wird im 
Ergebnis auch eine Eins gesetzt, die anderen Bits bleiben wie sie waren 
0 oder 1.

XOR ist dagegen lustig:
Überall, wo in der Maske eine Eins ist, wird im Ergebnis aus einer 0 
eine 1 bzw. aus einer 1 eine 0. Die zugehörigen Bits werden also 
"umgedreht" (invertiert).

von shift (Gast)


Lesenswert?

Route 66 schrieb:
> XOR ist dagegen lustig:
> Überall, wo in der Maske eine Eins ist, wird im Ergebnis aus einer 0
> eine 1 bzw. aus einer 1 eine 0. Die zugehörigen Bits werden also
> "umgedreht" (invertiert).

Das ist aber süß und wird ihr bestimmt gefallen :-)

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.