Hallo... ich habe ein Thermostat mit ATmega8 und 2x16 LCD gebaut. Die Temperaturregelung ist fertig und der Probelauf war erfolgreich. Jetzt habe ich nur noch das Problem den ADC-Wert in die Temperatur umrechnen und dann auf dem LCD anzeigen. Der Sensor incl OPV misst 0,1°C, aber ich möchte eine Anzeige in 0,5°C Schritten und für die Regelung verwende ich nur ganze Grad. Die Formel für die Berechnung wäre 100 - (1060 - ADC) * 0,126 = Temperatur aber wie macht man das im Assembler und das Ganze dann noch mit Komma ??? Viele Fragen und keine Lösung in Sicht. Wäre nicht schlecht, wenn mir mal jemand das erklären könnte. Gruss Uwe
Hi >Viele Fragen und keine Lösung in Sicht. Wäre nicht schlecht, wenn >mir mal jemand das erklären könnte. Ich habe dir mal etwas für den Formelteil (1060 - ADC) * 0,126 zusammengestellt. Das Ergebnis ist in r19...r16. Dabei liegt der Vorkommateil in r19:r18 (eigentlich ist r19 immer Null) und der Nachkommateil in r17:r16. Der Rest sollte nicht mehr so schwierig sein.
1 | ldi r18,Low($100) ; ADC-Wert |
2 | ldi r19,High($100) ; |
3 | |
4 | ldi r16, Low(1060) |
5 | ldi r17,High(1060) |
6 | |
7 | sub r16,r18 ; 1060-ADC-Wert |
8 | sbc r17,r19 |
9 | |
10 | movw r23:r22,r17:r16 |
11 | |
12 | ldi r20,Low(Q15(0.126)) |
13 | ldi r21,High(Q15(0.126)) |
14 | |
15 | ;r19:r18:r17:r16 = (r23:r22 * r21:r20) << 1 |
16 | |
17 | fmuls16x16_32: ; Multiplikation mit 0,126 |
18 | clr r2 ; Null |
19 | fmuls r23, r21 ; ((signed)ah*(signed)bh)<<1 |
20 | movw r19:r18, r1:r0 |
21 | fmul r22, r20 ; (al*bl)<<1 |
22 | adc r18, r2 |
23 | movw r17:r16, r1:r0 |
24 | fmulsu r23, r20 ; ((signed)ah*bl)<<1 |
25 | sbc r19, r2 |
26 | add r17, r0 |
27 | adc r18, r1 |
28 | adc r19, r2 |
29 | fmulsu r21, r22 ; ((signed)bh*al)<<1 |
30 | sbc r19, r2 |
31 | add r17, r0 |
32 | adc r18, r1 |
33 | adc r19, r2 |
MfG Spess
Vielen Dank ... das werde ich gleich heute Abend testen. Gruss Uwe
Hi Ich habe das Ganze noch mal etwas überarbeitet
1 | ldi r18, Low($17F) |
2 | ldi r19,High($17F) ; ADC-Wert |
3 | |
4 | ;################################### |
5 | |
6 | ; in: r19:r18 ADC-Wert |
7 | ; out: r22 Vorkomma-Wert |
8 | ; r21 $00 -> xx,0 |
9 | ; $80 -> xx,5 |
10 | ; r25 '+' positiver Wert |
11 | ; '-' negativer Wert |
12 | |
13 | ldi r22, Low(1060) |
14 | ldi r23,High(1060) |
15 | |
16 | sub r22,r18 ; 1060 - ADC-Wert |
17 | sbc r23,r19 |
18 | |
19 | ldi r20,Low(Q15(0.126)) |
20 | ldi r21,High(Q15(0.126)) |
21 | |
22 | ; r18..r16 = r23:r22 * r21:r20<<1 |
23 | |
24 | clr r2 ; Null |
25 | |
26 | fmul r23, r21 ; (ah*bh)<<1 |
27 | mov r18, r0 |
28 | |
29 | fmul r22, r20 ; (al*bl)<<1 |
30 | adc r18, r2 ; Übertrag von fmul |
31 | movw r17:r16, r1:r0 |
32 | |
33 | fmul r23, r20 ; (ah*bl)<<1 |
34 | add r17, r0 |
35 | adc r18, r1 |
36 | |
37 | fmul r21, r22 ; (bh*al)<<1 |
38 | add r17, r0 |
39 | adc r18, r1 |
40 | |
41 | ldi r25,'+' ; Vorzeichen |
42 | |
43 | ;-------------------------------- |
44 | clr r20 |
45 | clr r21 |
46 | ldi r22,100 ; r22..r20= 100,0.... |
47 | |
48 | sub r20,r16 |
49 | sbc r21,r17 |
50 | sbc r22,r18 ; 100 - (...) |
51 | |
52 | brpl aaa ; wenn postiv nach aaa |
53 | |
54 | ;-------------------------------- |
55 | |
56 | ldi r25,'-' ; Vorzeichen |
57 | |
58 | com r20 ; 2er-Komplement |
59 | com r21 ; von r22..r20 |
60 | com r22 |
61 | subi r20,Low(-1) |
62 | sbci r21,byte2(-1) |
63 | sbci r22,byte3(-1) |
64 | |
65 | aaa: ser r16 ; Werte zum |
66 | ldi r17,$3F ; Runden |
67 | |
68 | add r20,r16 ; auf xx,0/xx,5 |
69 | adc r21,r17 ; Runden |
70 | adc r22,r2 |
71 | andi r21,$80 ; |
MfG Spess
Hallo... das sieht ja schon ganz gut aus - mit runden und Vorzeichen. Aber meine Formal "geht von hinten durch die Brust ins Auge", ist viel zu kompliziert. Nach einiger Zeit bin ich drauf gekommen. ADC / 8 - 34 ist genau das selbe. ADC / 8 ist die Auflösung (0,125°C je ADC-Wert), und bei ADC = 0 müssten es -34°C sein. Das kann man auch später noch korrigieren. Dein Programm von Gestern hatte ich getestet, funzt. Gruss Uwe
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.