Hallo!
Ich möchte für meinen ATXmega eine Funktion schreiben, die den Wert des
internen Temperatursensors in °C umwandelt:
1 | int8_t calcTemperature(void)
|
2 | {
|
3 | return (((uint16_t)((ADCA_CH1_RES * (uint32_t)tempCalcCoeff)>>13)) - 273);
|
4 | }
|
Wenn ich nun das disassembler anschaue, sehe ich, dass vom Wert in
Kelvin nur 0x11 und nicht 0x111 (=273) abgezogen werden:
1 | return (((uint16_t)((ADCA_CH1_RES * (uint32_t)tempCalcCoeff)>>13)) - 273);
|
2 | 00000124 LDS R18,0x022C Load direct from data space
|
3 | 00000126 LDS R19,0x022D Load direct from data space
|
4 | 00000128 LDS R22,0x2001 Load direct from data space
|
5 | 0000012A LDS R23,0x2002 Load direct from data space
|
6 | 0000012C LDI R24,0x00 Load immediate
|
7 | 0000012D LDI R25,0x00 Load immediate
|
8 | 0000012E LDI R20,0x00 Load immediate
|
9 | 0000012F LDI R21,0x00 Load immediate
|
10 | 00000130 CALL 0x0000024E Call subroutine
|
11 | 00000132 MOVW R26,R24 Copy register pair
|
12 | 00000133 MOVW R24,R22 Copy register pair
|
13 | 00000134 LDI R18,0x0D Load immediate
|
14 | 00000135 LSR R27 Logical shift right
|
15 | 00000136 ROR R26 Rotate right through carry
|
16 | 00000137 ROR R25 Rotate right through carry
|
17 | 00000138 ROR R24 Rotate right through carry
|
18 | 00000139 DEC R18 Decrement
|
19 | 0000013A BRNE PC-0x05 Branch if not equal
|
20 | }
|
21 | 0000013B SUBI R24,0x11 Subtract immediate
|
22 | 0000013C RET Subroutine return
|
Ich habe schon alle möglichen Varianten mit typen-cast ausprobiert, aber
es hat alles nichts gebracht.
Könnt ihr mir helfen?
Vielen Dank!
Erdbewohner