Forum: Mikrocontroller und Digitale Elektronik Bits aus Sensordaten entfernen


von AMT (Gast)


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!

von Crazy Harry (crazy_h)


Lesenswert?

Wert_ohne_Bits:=Wert_mit_Bits and %00011111;

0= Bits werden entfernt
1= Bits bleiben

von Martin (Gast)


Lesenswert?

Ist jetzt  ein Witz oder?

von Crazy Harry (crazy_h)


Lesenswert?

Welcher der beiden?

von Wolfgang (Gast)


Lesenswert?

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.

von fft (Gast)


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.

von Wolfgang (Gast)


Lesenswert?

Wolfgang schrieb:
> Sender

...so.

von Martin (Gast)


Lesenswert?

>>Welcher der beiden?
Das Erstposting.

von fft (Gast)


Lesenswert?

Quasi das selbe wie von Crazy H. vorgeschlagen, nur richtig.

btw: Oben den Tippfehler mit "0x" einfach wegdenken (kann es nicht mehr 
ändern)

von fft (Gast)


Lesenswert?

Mist, lange nicht mehr programmiert. Die Maske muss 0x7FFFFFFFF heissen. 
Sorry

von Wolfgang (Gast)


Lesenswert?

fft schrieb:
> funktion(0xFFFFFFFF) ergibt dir z.B. 0x0x7FFFFFFF,

Wohl eher 0x80000000, sonst müsste da stehen  return (value & ~maske);

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

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

von Ralf (Gast)


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?)

von STK500-Besitzer (Gast)


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.

von Ralf (Gast)


Lesenswert?

Super, vielen Dank STK500-Besitzer!!

Kannst du mir zum Verständnis kurz erklären, für was  0x8000  und 
0x1FFF  stehen?

von Patrick (Gast)


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.

von Patrick J. (ho-bit-hun-ter)


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

von Wolle G. (wolleg)


Lesenswert?

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
Noch kein Account? Hier anmelden.