Hallo,
ich habe mir einen Temperatursensor TSIC 306 besorgt. Bevor ich mich an
mein Programm heranmache (Assembler/ATMEGA8), habe ich ein
Verständnisproblem.
Im beigefügten Datenblatt ist eine Tabelle:
Temp C Hex didital
-10 0x199
0 0x200
25 0x2FF
Auflösung 0,1K; Digitaler Anschluss 11 bit
Also wenn 0 Grad einem Hexwert von 0x200 entsprechen, dann sind es doch
bei einer Auflösung von 0,1 K 250 Schritte bis zu 25,0 Grad.
25,0 Grad entsprechen aber 0x2FF (255 Schritte).
Kann mir das bitte jemand erklären?
Vielen Dank
Hi,
Mit Auflösung ist die ECHTE Auflösung des Sensors gemeint.
Also in welcher Auflösung er in der Lage ist zu Messen. Diese muss nicht
exact der digitalen Auflösung entsprechen.
Meines Wissens misst der Tsic mit einer genauigkeit von +/- 0,3°C
Zum berechnen der Temperaturausgabe des TSIC gilt:
Die Schrittweite ist nicht die Auflösung.
Temp C Hex digital
-50.0 0x000
-10 0x199
0.0 0x200
25 0x2FF
150.0 0x7FF
Diese Tabelle ist richtig, die Tabelle geht linear durch, anbei eine
komplette Übersetzungstabelle.
Hallo Martin, tt2t,
Vielen Dank für die Erklärung. Ich habe die möglichen HexWerte mal in
Excel mit der Formel
(Digital signal/2047 * 200 - 50) °C
ausgewertet. Das entspricht dann den Temp-Werten der cvs-Datei von tt2t.
:-)
Ich werde mir mal die Vorgehensweise in deinen C-Code anschauen und
versuchen, es in Assembler umzusetzen.
Vielen Dank euch beiden
Axel
Hi
>Ich werde mir mal die Vorgehensweise in deinen C-Code anschauen und>versuchen, es in Assembler umzusetzen.
Kleiner Tip:
>Digital signal/2047 * 200 - 50
Nimm statt 2047 2048. Das verfälscht das Ergebnis nur unwesentlich,
erleichtert aber das Rechnen in Assembler wesentlich.
MfG Spess
Und dann Formel umstellen und kürzen.
* 100 / 1024
Auch sollte man sich über Fixedpoint Arithmetik Gedanken machen, wenn
man 1 Nachkommastelle haben will.
>> hier ist der ASM-Code drin> Ja, für PIC. Also nicht so richtig passend ATMega8.
Aber die Abfragestrategie ist gut erklärt, die kann man für AVR ja
nachbauen.
Hallo,
> Nimm statt 2047 2048. Das verfälscht das Ergebnis nur unwesentlich,> erleichtert aber das Rechnen in Assembler wesentlich.> Und dann Formel umstellen und kürzen.> * 100 / 1024> Auch sollte man sich über Fixedpoint Arithmetik Gedanken machen, wenn> man 1 Nachkommastelle haben will.
da habe ich ja nochmal richtig viele, gute Tipps bekommen!
Ich bin mir sicher, dass ich mit den verschiedenen Beispielen mein
Programm in Assembler umsetzen kann.
Vielen Dank an Alle
Axel
das mit dem Multiplizieren und Teilen geht noch einfacher:
in *100/1024 ist noch ein Vielfaches von 4 drin, also:
*25/256 (das 256 wird noch interessant)
25x=3*8*x+1*x
der TSIC gibt 11bit mit fuehrenden Nullen aus, also nehmen wir ein 16bit
Register
11bit *3 ergibt 13 bit (0x7FF*3=0x17FD=0b1011111111101)
in asm ergibt sich dann folgendes (nennen wir das Register R1:R2 in dem
der erhaltene Wert vom TSIC steht, das Ergebnisregister R3:R4):
ADD R4,R2 ; 3 mal addieren, entspricht mal 3 (3*x)
ADC R3,R1
ADD R4,R2
ADC R3,R1
ADD R4,R2
ADC R3,R1
LSL R3 ;dann 3 mal linksshift (ist mal 8)(3*8*x)
ROL R4
LSL R3
ROL R4
LSL R3
ROL R4
ADD R4,R2 ; noch einmal das Register R1:R2 dazu (+1x)
ADC R3,R1
(das Register ist dann mit 16bit gefuellt, 13bit +3bit)
und nun die Division durch 256:
gar nix, denn das Ergebnis des vollen Temperaturwerts steht in R3, der
Nachkommaanteil in R4.
wer will, kann nu den Nachkommaanteil noch runden:
die Formel fuers Runden auf 2 Nachkommastellen lautet:
x=INT(100x+0,5)/100 (aeh, das ist aber net in asm....)
fuer eine Stelle dann halt:
x=INT(10x+0,5)/10
gruss
wolf
sry fuer Doppelpost...
hab aber grad gesehen, dass ich vergessen hab, 50 abzuziehen...
also:
Ergebnis des vollen Temperaturwerts steht in R3
davon 50 abziehen:
subi r3,50
(Achtung: SUBI geht nur mit Register R16..R31)