Forum: Mikrocontroller und Digitale Elektronik DS1621 höhere Auflösung


von Forest (Gast)


Lesenswert?

Hi Leute,
Hat vielleicht einer Zeit mir auf Deutsch zu erklären wie ich mit dem
Temperatursensor DS1621 eine Höhere Auflösung errechnen kann.
Verstehe den Englischen Text abzulut nicht. Weiß nicht welche Register
ich nun mit wechen werten teilen, addieren, oder subtrieren soll ?!?!?
mfg

von Profi (Gast)


Lesenswert?

Hallo,
verstehe nicht, was es da nicht zu verstehen gibt...

Wenn Du mehr Auflösung willst, musst Du die beiden anderen Register
(COUNT_REMAIN mit dem READ_COUNTER-Befehl und COUNT_PER_C mit dem
READ_SLOPE- mit nachfolgendenm READ_COUNTER-Befehl) auslesen und in die
Formel einsetzen.


Wörtliche Übersetzung:
Höhere Auflösung kann man erreichen, indem man den Temperaturwert liest
und das LSB (das MSB des 2. Bytes) abschneidet {ADÜ: d.h. das 2. Byte
einfach ignoriert}.
Der Wert, der im Zähler verbleibt, kann mit dem READ_COUNTER-Befehl
gelesen werden.
Dieser Wert ist die Variable COUNT_REMAIN, nachdem die Zählzeit
abgelaufen ist.

Wenn man den Wert des Slope Accumulators mit dem READ_SLOPE-Befehl in
das Zähler-Register lädt, kann dieser Wert (COUNTS_PER_C) gelesen
werden; so erhält man die Zahl (Aulösung) pro Grad {ADÜ:  der Wert
COUNTS_PER_C dürfte bei diesem IC immer 16 sein, braucht also nicht
ausgelesen werden}.
Die tatsächlich Temperatur kann dann mit folgender Formel berechnet
werden:

.....
Praktisch würde ich es so machen:
TEMP_READ (nur High-Byte) in ein 16-bit-Register laden
um 4 nach links schieben
4 abziehen (-0.25 aus der Formel)
Count_Remain dazuaddieren
dann hast Du die Temperatur in 16tel Grad.

Ganzzahl-Arithmetik:
Die vollen Grad erhälts Du, wenn Du dieses Register sicherst und um 4
Bit nach rechts schiebst, die Nachkommastellen, indem Du das Register
mit 15 andierst.

Floadting-Arithmetik:
Das Ergebnis (16tel-Grad) einfach durch 16 dividieren.

PS: habe alles aus dem Stegreif gemacht, keine Garantie!
Melde Dich auf jeden Fall nochmal, wenns klappt oder wenns nicht
klappt, das schaffen wir auf jeden Fall.
Poste Deinen Code als Anhang.

von Profi (Gast)


Lesenswert?

Hallo, nochmal ich,

Du kannst auch alle 16 Bits des Temperaturwertes in ein 16-Bit-Register
lesen, dann mit $ff00 andieren und um 4 Bits nach rechts schieben.

Du kannst aber auch einen DS1631, DS1721, DS1731 oder DS1775 nehmen,
die von Haus aus schon 12 Bit können.
DS 1721 und DS1775 sind volatile, d.h. merken sich die Thermostatwerte
nicht ohne Vcc.

Noch eine Anmerkung an ALLE, die nicht verletzen, sondern zum Lernen
anspornen soll:

Ich bitte Euch um mehr Konzentration beim Schreiben, sowohl von Code
als auch von Posts.
In den 4 Zeilen des Ursprungsposts finde ich 12 Rechtschreibfehler
(zumindest nach der alten besseren Regeln) (ich gebe zu, in meinem sind
auch 3, aber es sind auch fast 40 Zeilen)
Im Hinterkopf denke ich mir, wenn schon in der natürlichen Sprache
solche passieren, wie schaut's dann erst mit dem Programmtext aus.
Und wenn's dann nicht funktioniert, wundert's mich nicht.

In Eurerem Interesse also bitte nochmal kritisch lesen, bevor man
abschickt, und lernen, lernen, lernen, was das Zeug hält, es lohnt sich
für später allemal!
Aber das tun wir ja alle hier.

von Walter (Gast)


Lesenswert?

Bevor ich jetzt lange suche:
Wie kann ich denn 2 Register zusammenfassen um auf ein 16 Bit register
zu kommen? Arbeite mit dem Prog-Studio von Batronix und dem 89c2051.

von Walter (Gast)


Lesenswert?

Hab jetzt man Read Counter ausgelesen, der Wert bleib ja gar nicht
konstand!!!

Hab es mir jetzt mal so ausgedacht.
R1 = High Byte der Temperatur
R2 = Read Counter
R3,R4 das 16Bit register R3 MSB ; r4 LSB

MOV A,R1           'Temperatur in Akku
ANL A,#0fh         'rechte 4 Bit herausfiltern
SWAP A             'rechte und linke 4 Bit vertauschen
mov R4,A           'Akku nach R4 kopieren LSB
MOV A,R1           'Temperatur in Akku
SWAP A             'rechte und linke 4 Bit vertauschen
MOV R3,A           'Akku nach R3 kopieren MSB

Jetzt hab ich die Temperatur um 4 Bit nach rechts geschoben. Und wie
Addiere ich jetzt zu beiden Registern R2 (read count) ??????????

von Profi (Gast)


Lesenswert?

Auch ich kann mich mal irren, hab nochmal nachgelesen, es KÖNNTE sein,
dass der Wert COUNTS_PER_C ist nicht konstant 16 ist, sondern  von der
Temperatur abhängen KÖNNTE (zur Korrektur der parabolischen
Abhängigkeit) und doch ausgelesen und zur Berechnung verwendet werden
MÜSSTE. Selbst ausprobieren!
Zitat: At the same time, the counter is preset with a value determined
by the slope accumulator circuitry. This
circuitry is needed to compensate for the parabolic behavior of the
oscillators over temperature.


@Walter: mit dieser Controller-Familie kenne ich mich (noch) nicht aus,
weiß ich nicht.

Das Read-Count Register ändert sich, weil die Temperatur nie ganz
gleich bleibt. Schon durch die Eigenerwärmung beim Ausführen des
Conversion-Befehls erwärmt sich das IC (kein Witz!).
Deshalb keine "Salven abfeuern", sondern immer zwischen 2 Conversions
einige Sekunden warten.
Bedenke, dass die Auflösung 1/16° beträgt. Auch muß die Versorgung dann
schon sehr stabil und rauscharm sein.

von Forest (Gast)


Lesenswert?

Hilfe!!!!
Hab die beiden Bytes Read-Count und Read-Slope ausgelesen.
Read Slope ist immer 13dez
Read Count ist total instabiel
Wie soll man damit Rechnen? Da kommt nur Schrott bei raus.
mfg

von Stefan Noll (Gast)


Lesenswert?

Hi!

Ich hab auf
http://www.wolfgang-back.com/PDF/Messen%20von%20Temperaturen.pdf

eine Möglichkeit gefunden, allerdings funktioniert die nicht so richtig
bei mir....

mfg
stefan noll

von Stefan Noll (Gast)


Lesenswert?

Hi

ich bins nochmals :-)

Die Temperaturconversation muss angehalten werden und rund 1 Sekunde
gewartet werden, bevor Counter & Slope Werte ausgelesen werden sollten.

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.