ich habe gerade folgenden Code im Netz gefunden:
https://raw.githubusercontent.com/adamj ... mpu6050.py
da gibt es eine Funktion:
Code: Alles auswählen
def bytes_toint(self, firstbyte, secondbyte):
if not firstbyte & 0x80:
return firstbyte << 8 | secondbyte
return - (((firstbyte ^ 255) << 8) | (secondbyte ^ 255) + 1)
Mit '&' wird von 'firstbyte' und '0x80' jedes Bit verglichen. Wenn die gleich sind, dann ist das Ergebnis an der Stelle eine eins, ansonsten eine 0. Dann wird da abgefragt ob 'firstbyte' gleich 0x80 ist. Wenn 'firstbyte' nicht 0x80 ist, dann kommt das eingerückte 'return'.
Wenn ich mir 'firstbyte' als Binärzahl vorstelle dann werden jetzt von rechts 8 Nullen aufgefüllt und links fallen 8 Bits weg. Dass ist das Gleiche wie wenn ich 'firstbyte' als Dezimalzahl mit 256 multipliziere. Nach der Rechnung wird das Ergebnis mit 'secondbyte' verglichen, wieder jedes einzelne Bit, nur dieses mal wird eine 1 geschrieben wenn eins von beiden Bits eine 1 ist, ansonsten eine 0.
Das ist mein Erkenntnisstand nach dem ich den Code soweit gelesen habe, aber mir fehlt das wieso. Und zwar in allen Bereichen. Wenn ich die Umrechnung verstehe, dann verstehe ich vielleicht auch, wieso die 'if'-Abfrage notwendig ist, bzw. wieso es zwei verschiedene Umrechnungen gibt.
Wir hatten schon mal so ein ähnliches Thema mit den Bitwise Operatoren bei der RGB656-Umrechnung, aber irgendwie steige ich da nicht durch.
Der Code ist dazu da um ein MPU5060 auszulesen und ich habe ihn aus diesem Tutorial:
https://microcontrollerslab.com/micropy ... 2-esp8266/
Könnt ihr mir bitte erklären, was das genau geschieht oder mir Hinweise geben, wie ich selbst drauf komme?
Vielen Dank und Grüße
Dennis