Bits aus Sensordaten entfernen

Gast #5076054
Lesenswert?

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!
Gast #5076069
Lesenswert?

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.
Gast #5076796
Lesenswert?

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?)
Gast #5076830
Lesenswert?

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.
Gast #5076969
Lesenswert?

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.
#5077326
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren