Wenn ich mich richtig erinnere wird es in der Literatur als "Schieben" bezeichnet. Nach deinen Text wird aber nur der Wert von 255 (oder 256) dazu addiert.
Nein!
In Deiner Anleitung hast Du(!) addiert, was überhaupt keinen Sinn ergibt
WAS wird als schieben bezeichnet, genau das hatte ich Dich ja gerade gefragt.
Schieben verschiebt die Ziffern gegenüber den Potenzen der jeweiligen Basis.
Wenn die Ziffern (eine Stelle) nach links geschoben werden, erhöhen sich die Potenzen (um eins), es wird also effektiv (einmal) mit der Basis multipliziert.
Wenn die Ziffern (eine Stelle) nach rechts geschoben werden, reduzieren sich die Potenzen (je um eins), es wird also effektiv (einmal) durch die Basis dividiert.
(Einmal) Linksschieben einer Dezimalzahl entspricht einer Multiplikation mit Zehn, (einmal) Rechtsschieben einer Dezimalzahl entspricht einer Division durch Zehn (Das Komma wird quasi in die andere Richtung verschoben).
(Einmal) Linksschieben einer Binärzahl entspricht einer Multiplikation mit Zwei, (einmal) Rechtsschieben einer Binärzahl entspricht einer Division durch Zwei (Das Komma wird quasi in die andere Richtung verschoben).
Achtmal Linksschieben entspricht also acht aufeinanderfolgenden Multiplikationen mit Zwei, bzw einer Multiplikation mit 2
8=256.
Entfernung = (256 X Register2)+Register3
...liefert also genau dasselbe wie...
messung = (( messung_high << 8) + messung_low);
Wenn Der Controller "zu Fuß" multiplizieren muß (quasi alle Tinies), ist schieben wesentlich schneller und Codesparender, wenn er über Multiplikationsroutinen verfügt (quasi jeder Mega), könnte die Multiplikation etwas(!) schneller sein).
Und jetzt einfach mal etwas Praxis:
Nehmen wir einfach mal folgende Werte an...
Register2 liefert
00001111
und Register3
01010101
Die Multiplikationen exerzier ich jetzt nicht durch - zuviel Aufwand
aber das Schieben der Freaks...
"messung" soll sechzehn Bit aufnehmen können, muß also 'ne 16-Bit-Variable sein.
"( messung_high << 8)" muß (wenn es so umgesetzt wird) auch auf 16Bit operieren können, aus
00001111
wird nach acht Schiebezyklen
0000111100000000
(
00001111
ist übrigens dezimal 15,
00001111
0000111100000000
dezimal 3840. 15 * 256 = ??)
Da Dein Controller mit 8Bit rechnet, besteht jeder dieser Schiebezyklen in Wirklichkeit aus zwei Schiebeoperationen.
Erst wird das Lowbyte einmal linksgeschoben, dabei wird das Höchstwertigste Bit aus dem Byte rausgeschoben und landet im Carrybit ("Überlauf"); das neue niederwertigste Bit wird Null (es wird 'ne Null reingeschoben).
Danach wird das Highbyte einmal linksgeschoben, wobei das niederwertisgte Bit das Bit aus dem Carry übernimmt. Diese Schiebeinstruktion heißt "Rollen".
Anschließend wird Messung_low draufaddiert.
0000111100000000
+
01010101
liefert
0000111101010101
.
Dein Controller rechnet mit 8Bit, es werden also in Wirklichkeit zweimal zwei Bytes addiert (und dabei einmal ein eventueller Überlauf berücksichtigt).
Gehts besser?
na klar... statt erstmal Nullen in messung_high reinzuschieben und anschließend messung_low draufzuaddieren, kann man auch gleich messung_low über das Carry in Messung_high reinschieben; dann ist man nach acht Schiebezyklen (je einmal schieben und rollen) fertig, die zwei Additionen sind unnötig.
Möglicherweise optimiert Dein Compiler das sogar so.
Als Ergebnis hast Du also "messung" den Wert
0000111101010101
zugewiesen, irgendwo im SRAM steht also
0000111101010101
.
Du hast aber 'n 8Bit-Controller, auch Dein SRAM ist in Bytes organisiert.
Wenn "messung" als 16Bit-Variable (Word, UINT16 oder wie auch immer das bei Euch heißt) dimensioniert wird, werden zwei (wahrscheinlich aufeinanderfolgende) SRAM-Zellen allokiert. Eine nimmt das HighByte von Messung auf, die andere das LowByte.
In einer landet nach Deiner ganzen Rechnerei also
00001111
in einer anderen
01010101
.
Statt der ganzen Rechnerei kannst Du also auch einfach Deine beiden Bytes direkt in die beiden SRAM-Zellen schreiben...