Code: Alles auswählen
bmp_ac1, bmp_ac2, bmp_ac3 : int16; // Kalibrierung BMP180
bmp_ac4, bmp_ac5, bmp_ac6 : uint16;
bmp_b1, bmp_b2, bmp_mb, bmp_mc, bmp_md : int16;
und liefert 2 Messwerte,
Code: Alles auswählen
uprss, utemp : uint16; // Sensorwerte BMP180
aus denen Temperatur und Druck berechnet werden:
Code: Alles auswählen
procedure bmp180_calc();
var
x1, x2, x3, b3, b5, b6 : int32;
b4, b7 : uint32;
pp : int32;
begin
x1 := ((int32(utemp) - bmp_ac6) * bmp_ac5) div 32768;
x2 := (int32(bmp_mc) * 2048) div (x1 + bmp_md);
b5 := x1 + x2;
ptemp := (b5 + 8) div 16;
b6 := b5 - 4000;
x1 := (int32(bmp_b2) * ((b6 * b6) div 4096)) div 2048;
x2 := (int32(bmp_ac2) * b6) div 2048;
x3 := x1 + x2;
b3 := ((((int32(bmp_ac1) * 4) + x3) shl 0) + 2) div 4;
x1 := (int32(bmp_ac3) * b6) div 8192;
x2 := (int32(bmp_b1) * ((b6 * b6) div 4096)) div 65536;
x3 := ((x1 + x2) + 2) div 4;
b4 := (uint32(bmp_ac4) * uint32(x3 + 32768)) div 32768;
b7 := (uint32(uprss) - b3) * (50000 shr 0);
if b7 < $80000000 then begin
pp := (b7 * 2) div b4;
end else begin
pp := (b7 div b4) * 2;
end;
x1 := (pp div 256) * (pp div 256);
x1 := (x1 * 3038) div 65536;
x2 := (-7357 * pp) div 65536;
pp := pp + ((x1 + x2 + 3791) div 16);
press := pp div 10; // Pa in 0.1mbar
end;
Die Berechnung an sich funktioniert soweit und liefert sinnvolle Ergebnisse. Leider muss zwischendurch heftig rumgecastet und mit großen Zahlen gerechnet werden.
Das Kompilat ist dadurch entsprechend umfangreich und packt über 1kByte zusätzlichen Code dazu. Bei 8MHz dauert die Ausführung etwa 5msec, also 40.000 Zyklen. Die Zeit ist nicht das Problem, aber bekommt man das noch irgendwie speichersparender hin?
Ich mein, wer macht denn sowas, eine derart umständliche Berechnung zu verbocken? Das wäre doch sicher einfacher gegangen. Leider kann man die Formeln an sich nicht viel kürzen, sobald man mit 16bit versucht zu rechnen gibt es irgendwo Überläufe.
Die einzige Idee, die ich habe ist die Kalibrierdaten auszulesen und als feste Konstanten einzugeben, aber dann ist die Routine nur für diesen einen Sensor nutzbar - was möglicherweise reicht. Allerdings scheint mir das die Berechnung nicht merklich zu vereinfachen.
Btw: Gibt es eine Fold-Funktion für lange Listings?
Code: Alles auswählen
GH_SENSOR_ss_BMP180_CALC:
push r17
push r16
push r15
push r14
push r12
push r11
push r10
push r9
push r8
push r7
push r6
push r5
push r4
push r3
push r2
sbi 11,5
lds r22,(U_sGH_DEFINE_ss_UTEMP)
lds r23,(U_sGH_DEFINE_ss_UTEMP+1)
mov r24,r1
mov r25,r1
lds r20,(U_sGH_DEFINE_ss_BMP_AC6)
lds r21,(U_sGH_DEFINE_ss_BMP_AC6+1)
sub r22,r20
sbc r23,r21
sbc r24,r1
sbc r25,r1
lds r18,(U_sGH_DEFINE_ss_BMP_AC5)
lds r19,(U_sGH_DEFINE_ss_BMP_AC5+1)
mov r20,r1
mov r21,r1
call fpc_mul_longint
mov r4,r22
mov r3,r23
mov r2,r24
mov r5,r25
mov r19,r4
mov r20,r3
mov r21,r2
mov r18,r5
tst r18
mov r18,r1
brpl .Lj53
dec r18
.Lj53:
mov r21,r18
mov r20,r18
mov r19,r18
andi r19,-1
andi r20,127
add r4,r19
adc r3,r20
adc r2,r1
adc r5,r1
ldi r19,15
mov r18,r1
tst r19
breq .Lj55
.Lj54:
asr r5
ror r2
ror r3
ror r4
dec r19
brne .Lj54
.Lj55:
lds r21,(U_sGH_DEFINE_ss_BMP_MD)
lds r20,(U_sGH_DEFINE_ss_BMP_MD+1)
mov r18,r1
sbrc r20,7
com r18
mov r22,r4
mov r23,r3
mov r24,r2
mov r25,r5
add r22,r21
adc r23,r20
adc r24,r18
adc r25,r18
lds r18,(U_sGH_DEFINE_ss_BMP_MC)
lds r19,(U_sGH_DEFINE_ss_BMP_MC+1)
mov r20,r1
sbrc r19,7
com r20
mov r21,r20
ldi r26,11
mov r7,r26
mov r6,r1
tst r7
breq .Lj57
.Lj56:
lsl r18
rol r19
rol r20
rol r21
dec r7
brne .Lj56
.Lj57:
call fpc_div_longint
add r22,r4
adc r23,r3
adc r24,r2
adc r25,r5
mov r19,r22
mov r20,r23
movw r2,r24
ldi r18,8
add r19,r18
adc r20,r1
adc r2,r1
adc r3,r1
mov r21,r19
mov r4,r20
mov r5,r2
mov r18,r3
tst r18
mov r18,r1
brpl .Lj58
dec r18
.Lj58:
mov r5,r18
mov r4,r18
mov r21,r18
andi r21,15
add r19,r21
adc r20,r1
adc r2,r1
adc r3,r1
ldi r21,4
mov r18,r1
tst r21
breq .Lj60
.Lj59:
asr r3
ror r2
ror r20
ror r19
dec r21
brne .Lj59
.Lj60:
sts (U_sGH_DEFINE_ss_PTEMP),r19
sts (U_sGH_DEFINE_ss_PTEMP+1),r20
subi r22,-96
sbci r23,15
sbc r24,r1
sbc r25,r1
movw r18,r22
movw r20,r24
movw r4,r22
movw r6,r24
movw r22,r4
movw r24,r6
call fpc_mul_longint
movw r18,r22
movw r20,r24
mov r23,r18
mov r22,r19
mov r25,r20
mov r24,r21
tst r24
mov r24,r1
brpl .Lj61
dec r24
.Lj61:
mov r25,r24
mov r22,r24
mov r23,r24
andi r23,-1
andi r22,15
add r18,r23
adc r19,r22
adc r20,r1
adc r21,r1
ldi r23,12
mov r22,r1
tst r23
breq .Lj63
.Lj62:
asr r21
ror r20
ror r19
ror r18
dec r23
brne .Lj62
.Lj63:
lds r22,(U_sGH_DEFINE_ss_BMP_B2)
lds r23,(U_sGH_DEFINE_ss_BMP_B2+1)
mov r24,r1
sbrc r23,7
com r24
mov r25,r24
call fpc_mul_longint
movw r18,r22
mov r21,r24
mov r20,r25
tst r20
mov r20,r1
brpl .Lj64
dec r20
.Lj64:
mov r21,r20
mov r19,r20
mov r18,r20
andi r18,-1
andi r19,7
add r22,r18
adc r23,r19
adc r24,r1
adc r25,r1
ldi r19,11
mov r18,r1
tst r19
breq .Lj66
.Lj65:
asr r25
ror r24
ror r23
ror r22
dec r19
brne .Lj65
.Lj66:
mov r9,r22
mov r2,r23
mov r3,r24
mov r8,r25
lds r22,(U_sGH_DEFINE_ss_BMP_AC2)
lds r23,(U_sGH_DEFINE_ss_BMP_AC2+1)
mov r24,r1
sbrc r23,7
com r24
mov r25,r24
movw r18,r4
movw r20,r6
call fpc_mul_longint
movw r18,r22
mov r21,r24
mov r20,r25
tst r20
mov r20,r1
brpl .Lj67
dec r20
.Lj67:
mov r21,r20
mov r19,r20
mov r18,r20
andi r18,-1
andi r19,7
add r22,r18
adc r23,r19
adc r24,r1
adc r25,r1
ldi r19,11
mov r18,r1
tst r19
breq .Lj69
.Lj68:
asr r25
ror r24
ror r23
ror r22
dec r19
brne .Lj68
.Lj69:
add r22,r9
adc r23,r2
adc r24,r3
adc r25,r8
lds r20,(U_sGH_DEFINE_ss_BMP_AC1)
lds r21,(U_sGH_DEFINE_ss_BMP_AC1+1)
mov r18,r1
sbrc r21,7
com r18
mov r19,r18
lsl r20
rol r21
rol r18
rol r19
lsl r20
rol r21
rol r18
rol r19
add r22,r20
adc r23,r21
adc r24,r18
adc r25,r19
ldi r18,2
add r22,r18
adc r23,r1
adc r24,r1
adc r25,r1
mov r18,r22
mov r20,r23
mov r21,r24
mov r19,r25
tst r19
mov r19,r1
brpl .Lj70
dec r19
.Lj70:
mov r21,r19
mov r20,r19
mov r18,r19
andi r18,3
add r22,r18
adc r23,r1
adc r24,r1
adc r25,r1
asr r25
ror r24
ror r23
ror r22
asr r25
ror r24
ror r23
ror r22
mov r17,r22
mov r16,r23
mov r15,r24
mov r10,r25
lds r22,(U_sGH_DEFINE_ss_BMP_AC3)
lds r23,(U_sGH_DEFINE_ss_BMP_AC3+1)
mov r24,r1
sbrc r23,7
com r24
mov r25,r24
movw r2,r4
movw r8,r6
movw r18,r2
movw r20,r8
call fpc_mul_longint
mov r18,r22
mov r21,r23
mov r4,r24
mov r20,r25
tst r20
mov r20,r1
brpl .Lj71
dec r20
.Lj71:
mov r4,r20
mov r19,r20
mov r18,r20
andi r19,-1
andi r18,31
add r22,r19
adc r23,r18
adc r24,r1
adc r25,r1
ldi r19,13
mov r18,r1
tst r19
breq .Lj73
.Lj72:
asr r25
ror r24
ror r23
ror r22
dec r19
brne .Lj72
.Lj73:
movw r4,r22
movw r6,r24
movw r22,r2
movw r24,r8
movw r18,r22
movw r20,r24
call fpc_mul_longint
movw r18,r22
movw r20,r24
movw r22,r18
mov r25,r20
mov r24,r21
tst r24
mov r24,r1
brpl .Lj74
dec r24
.Lj74:
mov r25,r24
mov r23,r24
mov r22,r24
andi r22,-1
andi r23,15
add r18,r22
adc r19,r23
adc r20,r1
adc r21,r1
ldi r23,12
mov r22,r1
tst r23
breq .Lj76
.Lj75:
asr r21
ror r20
ror r19
ror r18
dec r23
brne .Lj75
.Lj76:
lds r22,(U_sGH_DEFINE_ss_BMP_B1)
lds r23,(U_sGH_DEFINE_ss_BMP_B1+1)
mov r24,r1
sbrc r23,7
com r24
mov r25,r24
call fpc_mul_longint
movw r18,r22
movw r20,r24
movw r22,r18
mov r25,r20
mov r24,r21
tst r24
mov r24,r1
brpl .Lj77
dec r24
.Lj77:
mov r25,r24
mov r23,r24
mov r22,r24
andi r22,-1
andi r23,-1
add r18,r22
adc r19,r23
adc r20,r1
adc r21,r1
ldi r23,16
mov r22,r1
tst r23
breq .Lj79
.Lj78:
asr r21
ror r20
ror r19
ror r18
dec r23
brne .Lj78
.Lj79:
add r18,r4
adc r19,r5
adc r20,r6
adc r21,r7
ldi r22,2
add r18,r22
adc r19,r1
adc r20,r1
adc r21,r1
mov r22,r18
mov r24,r19
mov r25,r20
mov r23,r21
tst r23
mov r23,r1
brpl .Lj80
dec r23
.Lj80:
mov r25,r23
mov r24,r23
mov r22,r23
andi r22,3
add r18,r22
adc r19,r1
adc r20,r1
adc r21,r1
asr r21
ror r20
ror r19
ror r18
asr r21
ror r20
ror r19
ror r18
add r18,r1
ldi r22,-128
adc r19,r22
adc r20,r1
adc r21,r1
lds r22,(U_sGH_DEFINE_ss_BMP_AC4)
lds r23,(U_sGH_DEFINE_ss_BMP_AC4+1)
mov r24,r1
mov r25,r1
call fpc_mul_dword
ldi r19,15
mov r18,r1
tst r19
breq .Lj82
.Lj81:
lsr r25
ror r24
ror r23
ror r22
dec r19
brne .Lj81
.Lj82:
mov r14,r22
mov r12,r23
mov r11,r24
mov r2,r25
lds r22,(U_sGH_DEFINE_ss_UPRSS)
lds r23,(U_sGH_DEFINE_ss_UPRSS+1)
mov r24,r1
mov r25,r1
sub r22,r17
sbc r23,r16
sbc r24,r15
sbc r25,r10
ldi r18,80
ldi r19,-61
mov r20,r1
mov r21,r1
call fpc_mul_longint
mov r3,r22
mov r4,r23
mov r5,r24
mov r6,r25
cp r3,r1
cpc r4,r1
cpc r5,r1
ldi r18,-128
cpc r6,r18
brsh .Lj84
mov r18,r3
mov r19,r4
mov r20,r5
mov r21,r6
lsl r18
rol r19
rol r20
rol r21
mov r22,r14
mov r23,r12
mov r24,r11
mov r25,r2
call fpc_div_dword
mov r7,r22
mov r8,r23
mov r9,r24
mov r10,r25
rjmp .Lj85
.Lj84:
mov r18,r3
mov r19,r4
mov r20,r5
mov r21,r6
mov r22,r14
mov r23,r12
mov r24,r11
mov r25,r2
call fpc_div_dword
lsl r22
rol r23
rol r24
rol r25
mov r7,r22
mov r8,r23
mov r9,r24
mov r10,r25
.Lj85:
mov r2,r7
mov r3,r8
mov r24,r9
mov r23,r10
movw r18,r2
mov r20,r24
mov r21,r23
mov r25,r18
mov r4,r19
mov r5,r20
mov r22,r21
tst r22
mov r22,r1
brpl .Lj86
dec r22
.Lj86:
mov r5,r22
mov r4,r22
mov r25,r22
andi r25,-1
add r18,r25
adc r19,r1
adc r20,r1
adc r21,r1
ldi r25,8
mov r22,r1
tst r25
breq .Lj88
.Lj87:
asr r21
ror r20
ror r19
ror r18
dec r25
brne .Lj87
.Lj88:
movw r4,r2
mov r6,r24
mov r7,r23
movw r22,r4
movw r24,r6
mov r3,r22
mov r8,r23
mov r9,r24
mov r2,r25
tst r2
mov r2,r1
brpl .Lj89
dec r2
.Lj89:
mov r9,r2
mov r8,r2
mov r16,r2
andi r16,-1
add r22,r16
adc r23,r1
adc r24,r1
adc r25,r1
ldi r26,8
mov r3,r26
mov r2,r1
tst r3
breq .Lj91
.Lj90:
asr r25
ror r24
ror r23
ror r22
dec r3
brne .Lj90
.Lj91:
call fpc_mul_longint
ldi r18,-34
ldi r19,11
mov r20,r1
mov r21,r1
call fpc_mul_longint
mov r19,r22
mov r18,r23
mov r21,r24
mov r20,r25
tst r20
mov r20,r1
brpl .Lj92
dec r20
.Lj92:
mov r21,r20
mov r18,r20
mov r19,r20
andi r19,-1
andi r18,-1
add r22,r19
adc r23,r18
adc r24,r1
adc r25,r1
ldi r19,16
mov r18,r1
tst r19
breq .Lj94
.Lj93:
asr r25
ror r24
ror r23
ror r22
dec r19
brne .Lj93
.Lj94:
mov r9,r22
mov r2,r23
mov r3,r24
mov r8,r25
movw r18,r4
movw r20,r6
ldi r22,67
ldi r23,-29
ldi r24,-1
ldi r26,-1
mov r25,r26
call fpc_mul_longint
movw r18,r22
mov r21,r24
mov r20,r25
tst r20
mov r20,r1
brpl .Lj95
dec r20
.Lj95:
mov r21,r20
mov r19,r20
mov r18,r20
andi r18,-1
andi r19,-1
add r22,r18
adc r23,r19
adc r24,r1
adc r25,r1
ldi r19,16
mov r18,r1
tst r19
breq .Lj97
.Lj96:
asr r25
ror r24
ror r23
ror r22
dec r19
brne .Lj96
.Lj97:
add r22,r9
adc r23,r2
adc r24,r3
adc r25,r8
ldi r18,-49
add r22,r18
ldi r18,14
adc r23,r18
adc r24,r1
adc r25,r1
mov r18,r22
mov r20,r23
mov r21,r24
mov r19,r25
tst r19
mov r19,r1
brpl .Lj98
dec r19
.Lj98:
mov r21,r19
mov r20,r19
mov r18,r19
andi r18,15
add r22,r18
adc r23,r1
adc r24,r1
adc r25,r1
ldi r19,4
mov r18,r1
tst r19
breq .Lj100
.Lj99:
asr r25
ror r24
ror r23
ror r22
dec r19
brne .Lj99
.Lj100:
add r4,r22
adc r5,r23
adc r6,r24
adc r7,r25
movw r18,r4
movw r20,r6
ldi r22,10
mov r23,r1
mov r24,r1
mov r25,r1
call fpc_div_longint
sts (U_sGH_DEFINE_ss_PRESS),r22
sts (U_sGH_DEFINE_ss_PRESS+1),r23
cbi 11,5
pop r2
pop r3
pop r4
pop r5
pop r6
pop r7
pop r8
pop r9
pop r10
pop r11
pop r12
pop r14
pop r15
pop r16
pop r17
ret