Forum: Mikrocontroller und Digitale Elektronik ADC umrechnen, mit Komma anzeigen (Assembler)


von Uwe O. (orti)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Uwe O. (orti)


Lesenswert?

Vielen Dank ... das werde ich gleich heute Abend testen.

Gruss Uwe

von spess53 (Gast)


Lesenswert?

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

von Uwe O. (orti)


Lesenswert?

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
Noch kein Account? Hier anmelden.