Forum: Mikrocontroller und Digitale Elektronik Bits aus Sensordaten entfernen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von AMT (Gast)


Bewertung
0 lesenswert
nicht 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 H. (crazy_h)


Bewertung
0 lesenswert
nicht lesenswert
Wert_ohne_Bits:=Wert_mit_Bits and %00011111;

0= Bits werden entfernt
1= Bits bleiben

von Martin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ist jetzt  ein Witz oder?

von Crazy H. (crazy_h)


Bewertung
0 lesenswert
nicht lesenswert
Welcher der beiden?

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Sender

...so.

von Martin (Gast)


Bewertung
0 lesenswert
nicht lesenswert
>>Welcher der beiden?
Das Erstposting.

von fft (Gast)


Bewertung
0 lesenswert
nicht 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)


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

von Wolfgang (Gast)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.