ADC umrechnen, mit Komma anzeigen (Assembler)

OP #2494809
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
Gast
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
Gast
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
OP
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.