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