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
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...
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.
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.
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 :(
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;
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.
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.
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.
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.
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.
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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.