teamohnename
02.01.2013, 10:06
Hallo an alle,
wir haben ein paar Schwierigkeiten mit der Bitmanipulation auf einem RNmega2560. Folgendes Problem:
Eine Funktion fragt den Entfernungswert eines SRF10 ab. Zurückgegeben werden soll aber sowohl die Entfernung als auch eine Zahl zwischen 0 - 5 (falls mit der Kommunikation etwas nicht geklappt hat). Wir haben in der Funktion also nun drei 8 Bit Variablen (lsb, msb und die Kontrollzahl). Die Rückgabe der Funktion muss nun 24 Bit groß sein, da das aber nicht geht, nehmen wir 32bit. Die Zahlen werden nun so zusammengesetzt (wir nennen die Variablen jetzt mal returnvar, lsb_srf und msb_srf)
result = ((returnvar << 16) + (lsb_srf << 8 ) + msb_srf);
Ist das soweit richtig?
Wir könnten jetzt mit dem Zerlegen anfangen, aber anscheinend funktioniert nicht mal das Zusammensetzen. Wenn man folgende Werte für die drei Variablen einsetzt:
returnvar = 0b00000101;
lsb_srf = 0b00000111;
msb_srf = 0b11010110;
ist das Ergebnis, das von der Funktion zurückgegeben wird, Dezimal 2006, was Binär wiederum [0000000000000000[00000]]11111010110 ist. returnvar wurde dem also gar nicht hinzugefügt.
Jetzt nochmal zum Zusammensetzen:
So sollte man eigentlich returnvar wieder rausbekommen:
returnvar = ((result & 0xff0000) >> 16);
und so das 16 Bit Ergebnis des SRF10:
srf10 = (result & 0xffff);
Da hat sich nun bewiesen, dass nur das msb und lsb zusammengesetzt wurden, denn returnvar ist immer 0, egal, was man dafür einsetzt und die Entfernungsmessung funktioniert.
Woran liegt das?
Danke schon mal und
Grüße
Jan
teamohnename
EDIT: Anscheinend ist das Ergebnis 2006, da das Display nur 16 Bit Variablen ausgeben kann. returnvar wurde also bei der Displayausgabe einfach abgeschnitten. Außerdem musste returnvar als 32bit Variable deklariert werden. Uns ist gerade aufgefallen, dass vorher die Warnung
warning: left shift count >= width of type
Ausgegeben wurde. Aber warum braucht die Variable, die um 16 bit verschoben wird so viel Platz, während die 8bit Variable, die um 8 bit verschoben wird, nicht 16 bit groß sein muss?
wir haben ein paar Schwierigkeiten mit der Bitmanipulation auf einem RNmega2560. Folgendes Problem:
Eine Funktion fragt den Entfernungswert eines SRF10 ab. Zurückgegeben werden soll aber sowohl die Entfernung als auch eine Zahl zwischen 0 - 5 (falls mit der Kommunikation etwas nicht geklappt hat). Wir haben in der Funktion also nun drei 8 Bit Variablen (lsb, msb und die Kontrollzahl). Die Rückgabe der Funktion muss nun 24 Bit groß sein, da das aber nicht geht, nehmen wir 32bit. Die Zahlen werden nun so zusammengesetzt (wir nennen die Variablen jetzt mal returnvar, lsb_srf und msb_srf)
result = ((returnvar << 16) + (lsb_srf << 8 ) + msb_srf);
Ist das soweit richtig?
Wir könnten jetzt mit dem Zerlegen anfangen, aber anscheinend funktioniert nicht mal das Zusammensetzen. Wenn man folgende Werte für die drei Variablen einsetzt:
returnvar = 0b00000101;
lsb_srf = 0b00000111;
msb_srf = 0b11010110;
ist das Ergebnis, das von der Funktion zurückgegeben wird, Dezimal 2006, was Binär wiederum [0000000000000000[00000]]11111010110 ist. returnvar wurde dem also gar nicht hinzugefügt.
Jetzt nochmal zum Zusammensetzen:
So sollte man eigentlich returnvar wieder rausbekommen:
returnvar = ((result & 0xff0000) >> 16);
und so das 16 Bit Ergebnis des SRF10:
srf10 = (result & 0xffff);
Da hat sich nun bewiesen, dass nur das msb und lsb zusammengesetzt wurden, denn returnvar ist immer 0, egal, was man dafür einsetzt und die Entfernungsmessung funktioniert.
Woran liegt das?
Danke schon mal und
Grüße
Jan
teamohnename
EDIT: Anscheinend ist das Ergebnis 2006, da das Display nur 16 Bit Variablen ausgeben kann. returnvar wurde also bei der Displayausgabe einfach abgeschnitten. Außerdem musste returnvar als 32bit Variable deklariert werden. Uns ist gerade aufgefallen, dass vorher die Warnung
warning: left shift count >= width of type
Ausgegeben wurde. Aber warum braucht die Variable, die um 16 bit verschoben wird so viel Platz, während die 8bit Variable, die um 8 bit verschoben wird, nicht 16 bit groß sein muss?