Nach zwei Tagen Fummelei ist es mir endlich gelungen den DS75 an einem
ATMega 8 zu betreiben. Ich lasse mir das was der DS75 anwortet auf einem
Display ausgeben.
Nun habe ich so meine liebe Not mit der Nachkommastelle. Von den 8 Bit
werden nur die ersten 4 genutzt.
0001 0000 = 0,0625
0010 0000 = 0,1250
0100 0000 = 0,2500
1000 0000 = 0,5000
Mit den Befehlen ROR habe ich schon gespielt und alles verschoben um
dann Multipplikationen durchzuführen.
Ich weiss es doch auch nicht, ich bin doch dumm. Kann mir mal einer
zeigen was zu tun ist?
Ich habe es zwar hinbekommen einen Display zu betreiben der an ein 4094
Schieberegister angeschlossen ist, aber hier gerate ich dann doch in
Not.
Möglichkeit 1:
Da es nur 16 Zahlen sind, kannst Du eine Tabelle verwenden. Da Du 2^2=4
Nachkommastellen hast, schiebe die Eingangszahl um 4-2=2 nach rechts und
verwende diese Zahl als Index in ein 64 Byte großes Char-Feld.
Möglichkeit 2 BCD-Arithmetik:
Du prüfst jedes dieser 4 Bits ab und addierst jede einzelne Ziffer zum
Ergebnis.
Möglichkeit 3 Fixedpointarithmetik:
Du multiplizierst die um 4 Bit nach rechst geschobene Zahl mit
10000/16=625 und gibst das Ergebnis als Dezimalzahl aus (entweder das
gesamte Ergebnis oder getrennt in Vorkomma- und Nachkommazahl).
Möglichkeit 4: Beitrag "ADC-Wert z.B. in Spannung umrechnen und dezimal ausgeben mittels Tabellen, auch Linearisieren"
Möglichkeit 5: Beitrag "Re: 16-Bit-Zahl ausgeben, nur wie?"
Bitte berichte uns, wie Du es gelöst hast.
Viel Erfolg
Mehr als eine Nachkommastelle ist eigentlich nicht sinnvoll. Der
einfachste Ansatz dafür ist dann: dasoben skizzierte Nachkommabyte mit
10 multiplizieren und die obere Produkthälfte verwenden. Dann kommt zwar
.3 statt .375 raus, aber so genau ist der Sensor sowieso nicht. Runden
geht zwar auch, macht es aber deutlich komplizierter, weil sich die auch
in den Vorkommaanteil fortsetzt. Analog mit 100 wenn's unbedingt 2
Nachkommastellen sein sollen.
Kurz vor der verzweifelung habe ich es unbefriedigenderweise mit BASCOM
gelöst.
Nun werde ich mir eure Lektüren ein zwanzigstes und dreissigstes mal
antun. Irgendwann muss ich durch diesen Kram ja mal durchsteigen. Das
gibts doch nich. Was ich an Quellcode fabriziert habe ist aus Frust
alles auf nimmerwiedersehen im Papierkorb gelandet.
Und nochmal das ganze ...
Also dann ausführlicher, für eine Nachkommastelle.
Umrechnung das Nachkommateils in einen Wert 0..9: Nimm das vor dir
erwähnte Byte mit den 0000.0000 bis 1111.0000 und multipliziere das mit
10. Ergebnis ist ein 16-Bit Wert in R0 und R1. Die obere Produkthälfte
ist das was du suchst, die untere Produkthälfte interessiert nicht.
Code: 2 Assembler-Befehle (LDI,MUL).
Momentchen mal, ich glaube so langsam klingelt das hier. Ich habe das
nun einmal mit dem "tollen" Taschenrechner ausgerechnet um das vor mir
auf "Papier" zu haben. Ich gehe für das folgende Beispiel davon aus,
dass das Byte für die Nachkommastelle 1111.0000 ist. Meine Rechnung auf
"Papier" sieht nun wie folgt aus:
????.????.1111.0000 = 240
x 10
0000.1001.0110.0000 = (9) 96
????.????.0110.0000 = 96
x 10
0000.0011.1100.0000 = (3) 192
????.????.1100.0000 = 192
x 10
0000.0111.1000.0000 = (7) 128
????.????.1000.0000 = 128
x 10
0000.0101.0000.0000 = (5) 0
Ich nehme also das Ergebnis aus R1 und lege das in einem Hilfsregister
ab. Optimal wäre hier wohl zu poppen und pushen (wie im richtigen leben)
:P
Weiter nehme ich an, dass ich R0 solange mit 10 multipliziere, bis es 0
ist. Ob ich da nun mit BRNE oder BREQ arbeite wird sich zeigen. Ist das
hier jetzt nach einem weiteren mal schlafen richtig angekommen?
Ich könnte wohl daher gehen und das solange machen bis R0 = 0 ist oder
solange wie es Bits gibt (8 mal). Wobei ersteres wohl mehr Sinn macht.
Kann ich mit R0 und R1 direkt Multiplikationen durchführen, so, dass
sich R0 und R1 selber überschreiben? Ich nehme an ja.
Ich mach dann jetzt mal 'n bischen ...
Yep. Nun hast du das was dir oben fehlte. Den Nachkommaanteil genauer
als der Sensor hergibt. Was als Trendanzeige immerhin noch nützlich sein
kann.
> Weiter nehme ich an, dass ich R0 solange mit 10 multipliziere, bis es 0> ist. Ob ich da nun mit BRNE oder BREQ arbeite wird sich zeigen. Ist das> hier jetzt nach einem weiteren mal schlafen richtig angekommen?
Nicht bei mir. Was soll das werden? Mehr Stellen? Stimmt zwar, ist aber
grober Unfug bei +/-2°C Genauigkeit des Sensors.
Nun g die Herrschaften von Maxim/Dallas haben das genau deswegen
gemacht.
Das 0,0625 Grad Auflösung Spielerei ist, ist mir auch klar. Vor Monaten
experimentierte ich mit dem Sensor direkt am Druckerport des PC und
zeichnete sich verändernde Daten auf. Das Teil war nur am wackeln. Eine
höhere Auflösung als 0,25 Grad macht in der Tat wenig Sinn.
Um Sinn oder Unsinn geht es mir jedoch nicht. Das der Sensor bis 0,0625
Grad messen kann wird einen Grund haben, der sich mir auch nicht
unbedingt erschliessen will.
Der Sensor mag eine Fehlertoleranz von +/- 2 Grad haben, zeigt mir
jedoch stets das an was auch mein altes analoges Glasrohr-Thermometer
anzeigt. Schlecht ist der/die/das DS75 auf keinen Fall.
Damit nicht genug. Hier die "Formel" die ich vor wenigen Minuten
schrieb. Erwartet wird die Nachkommastelle in R16.
Funktionsname:
LDI R17, 0d10
LDI R18, 0d48
MUL R16, R17
PUSH R16
MOV R16, R1
ADD R16, R18
RCALL Print_R16 ; !!!
POP R16
MOV R16, R0
CPI R16, 0x00
BRNE Funktionsname ; !!!
RET
Ob diese "Formel" nun Sinn oder Unsinn ist, mögen die entscheiden, die
es wie ich, noch nie gemacht haben. Optimieren kann man ALLES. Oder was
sagt der "Profi"?
Die Herren Maxim/Dallas mögen das gemacht haben, weil ein binärer Zähler
einfacher ist als ein dezimaler oder weil sonst irgendeine Frequenz zu
niedrig gewesen wäre oder ihnen grad danach war. Das jedenfalls taugt
wenig als Argument. Als Trendanzeige ist eine Nachkommastelle durchaus
nützlich und zumindest beim etwas genaueren DS18B20 auch einigermassen
stabil.
Aber egal, wenn du die Stellen haben willst, dann mach es so.
Hi!
>Um Sinn oder Unsinn geht es mir jedoch nicht. Das der Sensor bis 0,0625>Grad messen kann wird einen Grund haben, der sich mir auch nicht>unbedingt erschliessen will.
Man muss es ja nicht unbedingt anzeigen, aber man kann damit zb. auf
0,5°C wunderbar regeln.
Viel Erfolg, Uwe