Hallo Community, ich probier gerade das erste Mal das Mikrocontroller-Programmieren aus. Ich benutze dabei das 2GO Kit von Infineon zum Strommessen (https://www.infineon.com/cms/en/product/promopages/sensors-2go/?redirId=56270#current-sensor-2go). Unser Sensor TLI4970-D050T4 sendet über SPI die Daten an den XMC1100 Mikrocontroller. Die ersten dieser Bits (Parity Bit, Status Bit..) enthalten dabei nicht den Stromwert, den ich auf dem Bildschirm ausgeben möchte. Meine Frage: Wie kann ich auf einzelne Bits zugreifen (also für das Speichern der Stromwerte die ersten Bits "entfernen")? Danke im Voraus!
Wert_ohne_Bits:=Wert_mit_Bits and %00011111; 0= Bits werden entfernt 1= Bits bleiben
AMT schrieb: > Unser Sensor TLI4970-D050T4 sendet über SPI die Daten an den XMC1100 > Mikrocontroller. Kann nicht sein. Bei SPI ist der µC der Master. Der Sender tut von sich aus gar nichts.
1 | unsigned int funktion (unsigned int value){ |
2 | |
3 | unsigned int maske = 0x80000000; |
4 | |
5 | return (value & maske); |
6 | |
7 | }
|
Probiers mal damit. funktion(0xFFFFFFFF) ergibt dir z.B. 0x0x7FFFFFFF, also maskiert den ersten bit aus. Weitere Bits analog dazu, einfach Maske anpassen.
Quasi das selbe wie von Crazy H. vorgeschlagen, nur richtig. btw: Oben den Tippfehler mit "0x" einfach wegdenken (kann es nicht mehr ändern)
Mist, lange nicht mehr programmiert. Die Maske muss 0x7FFFFFFFF heissen. Sorry
fft schrieb: > funktion(0xFFFFFFFF) ergibt dir z.B. 0x0x7FFFFFFF, Wohl eher 0x80000000, sonst müsste da stehen return (value & ~maske);
Hi Und vll. sollte man dem TE das Wort 'Bitmanipulation' noch hinterher werfen, daß Er auch versteht, was Er da macht/machen soll um die Anzahl der zu entfernenden Bits selber erarbeiten zu können? MfG
Ich verstehe das mit dem Maskieren auch noch nicht so ganz. Ich möchte das erste Bit auslesen (1 für Status-, 0 für Messsignal) und daraufhin bei 0 nur die letzten 13 von 16 Bit zurückgeben. Könnt ihr hierfür bitte ein Beispiel reinstellen. (Wie funktioniert das Konvertieren in Binärzahlen?)
Ralf schrieb: > (Wie funktioniert das Konvertieren in Binärzahlen?) Wieso sollte sich ein Prozessor für die Zahlendarstellung interessieren?
1 | int funktion(int input){ |
2 | If ((input & 0x8000) == 0) return (input & 0x1FFF); |
3 | else return input; |
4 | }
|
Den alternativen Return-Wert musst du noch definieren.
Super, vielen Dank STK500-Besitzer!! Kannst du mir zum Verständnis kurz erklären, für was 0x8000 und 0x1FFF stehen?
Das ist die hexadezimale Schreibweise (0x kennzeichnet Hexwerte) für die Bitmuster = 8 0 0 0 hex 1000 0000 0000 0000 bin Jede Ziffer aus 0x8000 beschreibt 4 binäre Ziffern, 1111 wäre 2^0 (1) + 2^1 (2) + 2^2 (4) + 2^3 (8) = 15 dezimal oder F hexadezimal. Die 8 ganz vorne steht also für die Wertigkeit 8 im Binärsystem (2^3=8), selektiert dir aber, wenn du die Binärdarstellung oben ansiehst, genau das linkeste Bit (in deinem Fall also das erste Bit). Bei 0x1FFF läuft es analog. = 1 F F F hex 0001 1111 1111 1111 bin Es werden also die 13 Bits von rechts selektiert. Du hättest anstelle der Hex-Maskierungen auch die entsprechenden binären Darstellungen verwenden können.
Hi Patrick schrieb: > Du hättest anstelle > der Hex-Maskierungen auch die entsprechenden binären Darstellungen > verwenden können. Hier ist aber Aufpassen angesagt! Wenn hier eine Ziffer fehlt, macht der Code nur noch 'Müll' und man sucht Sich einen Wolf. Ob Du nun im Code %0001111111111111 oder %000111111111111 stehen hast - da musst Du schon genau hin gucken. (beim Unteren fehlt eine 1) Da ist die HEX-Schreibweise besser geeignet: 0x1FFF 1 0001 F 1111 F 1111 F 1111 0-9 entsprechen 0-9 (oha, Wer hätte Das gedacht ;)) A 10 B 11 geht noch im Kopf ohne Probleme C 12 per 'cwölf' kann man sich merken, daß 'C' den Wert 12 hat D 13 per 'Dreizehn' ist das Merken auch hier wieder einfach E 14 ist '1 vor Hinten' - also 14, auch nicht schwer zu merken. F 15 ist der Maximal-Wert, also 15 Bei C und D hatte ich früher 'meine Probleme' und zählte die Wertigkeit immer aus, bis hier im Forum 'Cwölf' (für Zwölf, falls Das noch nicht klar wurde) und 'Dreizehn' von einem cleveren Mitmenschen in den Raum geworfen wurde. MfG
Patrick J. schrieb: > A 10 > B 11 geht noch im Kopf ohne Probleme > C 12 per 'cwölf' kann man sich merken, daß 'C' den Wert 12 hat > D 13 per 'Dreizehn' ist das Merken auch hier wieder einfach > E 14 ist '1 vor Hinten' - also 14, auch nicht schwer zu merken. > F 15 ist der Maximal-Wert, also 15 find ich gut
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.