Forum: Mikrocontroller und Digitale Elektronik DS1621 LSB immer Null ?


von Michael Lehr (Gast)


Lesenswert?

Hallo,

kennt sich jemand mit dem DS1621 aus ?

Beim Auslesen der Temperatur ist das LSB immer Null.
Muß ich irgendwas einstellen um 9-Bit Auflösung zu kriegen ?

Merkwürdig ist auch, dass ich im Single_Shot Modus niemals
ein DONE Flag im configuration-Register bekomme.

Ist das Ding etwa kaputt ?

Vielen Dank vorab

von Forest (Gast)


Lesenswert?

Hey du, das kenn ich ;o) !!!
Versuche mal 7 Bit auszulesen statt 8, wenn du mit einer Schleife
arbeitest, einfach 7 durchläufe eingeben. Frag mich nicht warum!? Das
hat ich nochnicht herausgefunden, aber daran lag es bei mir!!!
Womit arbeitst du? Batronix at89Cxx51?
Hast du das mit der höheren Auflösung vom Ds1621 schonmal hinbekommen?
Register "Counter" & "Slope" auslesen und mit der Formel
ausrechnen? Da bin ich nehmlich grad am Rätseln!
mfg
 Forest

von Michael Lehr (Gast)


Lesenswert?

Danke,
werde ich mal versuchen !
Ich arbeite im moment mit nem AVR AT90S8535 in ASM an der Sache.
Meine I2C Routinen sind von Atmel, mal sehen ob die sich so einfach
anpassen lassen. Funktionieren ansonsten einwandfrei.
Die höhere Auflösung halte ich eigentlich für Unsinn.
Bei 2°C Abweichung des DS1621 ist eigentlich schon die eine
Nachkommastelle nur Kosmetik ( wenn mann absolute werte braucht ).
Ich schau mir das aber trotzdem mal an, wo liegt das Problem genau ?

von Sebastian Wille (Gast)


Lesenswert?

Hi,

also ich hab' ihn auch in ASM angesteurt (mit meinen eigenen
I2C-Routinen). 9 Bit geht einwandfrei.

Auf Wunsch such' ich mal das Proggi raus.

Sebastian

von Forest (Gast)


Lesenswert?

2°C Toleranz? Wußte ich gar nicht, wo steht den das?
Das Problem liegt eigentlich darin, das ich keine konstanten Werte von
"Count" und "Slope" bekommen, somit kommen am Ende der Formel auch
nur instabiele Werte raus.
Das Problem mit dem 9. Bi,t vom Temperaturwert und das Done Bit, hab
ich folgendermaßen herausgefunden, hab mir die Routine allerdings
selber ausgedacht, weiß nicht wie es Atmel gemacht hat.

Das Bit vom Port, wo die SDA Leitung vom I²C Bus dranhängt, schiebe ich
in Register C. C Routiere ich dann links mit dem Akku. Das ganze 8 mal.
Dann hab ich das ganze Byte im Akku stehen. So funktioniert es mit
allen I²C Bausteinen die ich bisher hatte (PCF....).

Funktioniert beim DS1621 auch, aber nur mit dem MSB Byte von der
Temperatur, Done Bit fehlt, und beim auslesen von Slope und Count hängt
sich das Ding auf! Irgendwann bin ich auf die Idee gekommen daß das LSB
ein mal zu weit rotiert wird und das höchste Bit rausfällt. So war es
dann auch. Hab aber keine Ahnung warum!!?!?? Mit 7 mal hat es dann
Funktioniert. Mit 7 mal rotieren, kam dann auch das Done Bit zum
Vorschein, und beim auslesen vom Slope und Count ist der Sensor dann
auch nicht mehr "Abgestürzt". Das MSB Byte muß ich allerdings immer
noch mit 8 mal Routieren auslesen, sonst stimmt die Temperatur nicht.
Hier meine Routine:

read_data:
  MOV R7,#08h            'Anzahl der Subroutine durchläufe
poi3:  SETB scl               'SCL auf High setzen
  call wait_i2c          'kurz warten
  MOV C,sda              'SDA in C kopieren
  RLC A                  'Akku mit C links Routieren
  CLR scl                'SCL auf Low setzen
  call wait_i2c          'kurz warten
  DJNZ R7,poi3           'R7 - 1 wenn nicht 0 dann springe poi3
  RET

Kein Plan warum, aber es geht! Vielleicht liegt es an diesem Mysterium
das Count und Slope nicht konstant sind?! Muß ich mir nochmal den Kopf
drüber zerbrechen. Aber wenn der Sensor wirklich
2°C Toleranz hat, kann ich mir das Schenken!
Mfg
Forest

von Forest (Gast)


Lesenswert?

@Sebastian
Kannst mal Posten dein Prog. Dann hab ich ein Vergleich, und vielleicht
find ich mein Fehler. War schon am überlegen ob es an dem Programm von
Batronix liegt, dem Vertraue ich nehmlich auch nicht so! Kann ja nicht
sein das es mal so Funkt, und dann wieder so. Vielleicht bin ich ja
auch nur einfach zu Doof g
mfg

von Sebastian Wille (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

hier ist mal mein Prog. Ist für den Mega8, die Temperatur wird auf dem
USART ausgegeben.

Sind einige Kommentare im Programm, bei Fragen einfach hier posten.

Sebastian

von Michael Lehr (Gast)


Lesenswert?

Hallo Forest,

hab mich geirrt mit der Toleranz, war ein anderer Sensor den ich im
Kopf hatte. Auf Seite 15 des DataSheet sind die Fehlergrenzen
angegeben.

Gruß Michael

von Michael Lehr (Gast)


Lesenswert?

Hallo Sebastian,

Habe mal den oben genannten Source Code für meinen AVR angepasst.

Jetzt geht es !

Aber: Du betreibst den Bus ja nur mit 400 Hz .

Ich kann so ca. bis 1.2 kHz aufdrehen.
Darüber gehts wieder nicht.

Das erste Byte kann ich sogar mit 120 kHz auslesen !

Schreiben kann ich problemlos bis 250 kHz.

Ist mir irgendwie ein Rätsel.

Trotzdem vielen Dank

von Sebastian Wille (Gast)


Lesenswert?

Hi Michael,

schön, daß ich Dir helfen konnte! :-)

Wie kommst Du auf 400 Hz? Ich komme auf ca. 1 kHz bei 4 MHz. Naja,
macht ja auch kein großer Unterschied. Laut Datenblatt geht der DS1621
bis 100kHz (im "Fastmode" bis 400 kHz). Fall Du mehr als 120 kHz
willst, mußt Du vielleicht noch Deine Kabellänge verkürzen. Hat aber
überhaupt kein Sinn, da eine Konvertierung 750ms dauert!

Viel Spaß noch!

Sebastian

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.