Forum: Mikrocontroller und Digitale Elektronik Assembler, Nachkommastelle, DS75


von Sven Bauer (Gast)


Angehängte Dateien:

Lesenswert?

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.

von eProfi (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


Lesenswert?

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.

von Sven Bauer (Gast)


Lesenswert?

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 ...

von (prx) A. K. (prx)


Lesenswert?

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).

von Falk B. (falk)


Lesenswert?


von Sven Bauer (Gast)


Lesenswert?

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 ...

von (prx) A. K. (prx)


Lesenswert?

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.

von Sven Bauer (Gast)


Lesenswert?

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"?

von (prx) A. K. (prx)


Lesenswert?

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.

von Uwe (Gast)


Lesenswert?

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

von Sven Bauer (Gast)


Angehängte Dateien:

Lesenswert?

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