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
Ich nutze den ATMega 8 seit April 2008, programmierte bis November mit BASCOM und nun das hier ... Es geht vorran.
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.