
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
> > > Does anyone know how to config the DS1631 (using Die Hard program) to read 10, 11 or 12 bits Temperatures, that is 0.25, 0.125 or 0.0625 °C increments ? I am not clever enough to change the Config Register (R0 & R1 bits according to Dallas datasheet). > > > Well... try the following. It works out with minus degrees as well: > > '----------- Beispiel für C-Control1 Version 2x ------------------- > ' > '--- Nützliche Funktionen für die Auswertung des Temperatursensors- > '-------------------------- DS1621 -------------------------------- > ' > 'Dieses Demoprogramm unterstützt die erweiterte Genauigkeit des > 'IC. Gerundet wird auf 10tel Grad Celsius. Theoretisch kann > 'eine Auflösung von 0,07 Grad Celsius erreicht werden, in der > 'Praxis ist das aber unsinnig. > 'Es wird nun auch der negative Temperaturbereich ausgewertet. > 'Dies frisst ein paar Byte Programmspeicher und ein Variablenbit, > 'daher sollte man, wenn keine Minusgrade zu erwarten sind, die > 'vereinfachte Lösung wählen. > > 'Henrik Reimers Jan. 2005 http://www.henrik-reimers.de > '------------------------------------------------------------------- > > > '---- Variablen definieren----------------------------------------- > > DEFINE value AS WORD > DEFINE temperatur AS WORD > DEFINE temp AS BYTE > DEFINE data AS BYTE > DEFINE counter AS BYTE > DEFINE slope AS BYTE > DEFINE dev AS BYTE > DEFINE minusflag AS BIT > '---- Funktionsdeklarationen -------------------------------------- > > DECLARE FUNCTION readtemp() > > '------------------------------------------------------------------ > > #INIT > '*** entbehrlich wenn die Pullups nicht eingeschaltet werden müssen > > CONFIG.INIT 'auf Config Register umleiten > CONFIG.GET TEMP 'den aktuellen Wert lesen > temp = temp OR 30h > CONFIG.PUT TEMP 'Bits setzten und zurück schreiben > CONFIG.OFF 'Umleitung abschalten > > 'sollte immer sofort erfolgen, bevor I2C benutzt wird > > LCD.INIT > LCD.PRINT "1621 TEST" > PAUSE 100 > LCD.OFF > > '--------- HAUPTPROGRAMM ----------------------------------------- > > #main > > #main1 > dev = 144 'Alle Useraddresseingänge auf 0 - ggf. > 'anpassen. > readtemp() 'ruft die readroutine für ds1621 auf > > LCD.INIT SWITCHONLY > LCD.clr > LCD.POS 1,4 > IF minusflag THEN LCD.PRINT "-" > LCD.POS 1, 5 > LCD.PRINT value/10 & "," & value mod 10 & " ßC " > LCD.OFF > > GOTO main1 > > '---- Funktionen ------------------------------------------------- > > FUNCTION readtemp() > > IIC.INIT > > IIC.start > IIC.SEND DEV > IIC.SEND EEh 'temperaturmessung anstoßen > IIC.STOP > > PAUSE 10 > > IIC.start > IIC.SEND dev > IIC.SEND 22h 'temperaturmessung stoppen > IIC.stop > > '--------------------------- > > IIC.start > IIC.SEND DEV > IIC.SEND AAh 'temperaturmessung Lesekommando > IIC.stop > > IIC.start > IIC.SEND (DEV+1) 'lowtemperaturbyte auslesen > IIC.GET value > > minusflag = OFF > IF value > 128 THEN > minusflag = ON > value = (255-value)+1 > END IF > temperatur = value > > IIC.stop > '------------------------------ > IIC.start > IIC.SEND DEV > IIC.SEND A8h 'Counter Lesekommando > IIC.stop > > IIC.start > IIC.SEND (dev+1) 'Counter auslesen > IIC.GET value > counter = value > IIC.stop > '----------------------------- > > IIC.start > IIC.SEND DEV > IIC.SEND A9h 'Slope Lesekommando > IIC.stop > > IIC.start > IIC.SEND (DEV+1) 'Slope auslesen > IIC.GET value > slope = value > IIC.stop > > IIC.OFF > IF minusflag THEN > value=((temperatur * 100 - 25)-((slope-counter)*100/slope*100)/100)/10 > ELSE > value=((temperatur * 100 - 25)+((slope-counter)*100/slope*100)/100)/10 > END IF > > END FUNCTION > > > Regards > Henrik > > Thank You Henrik, but I'm a bit old fashioned (and >60) and I do use traditional CCBasic 2.0 with a driver developed by Die Hard (see below), modified recently by himself. I would rather be able to modify the driver for 11 bits precision. Cheers Daniel 'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 'IIIII DS1631 DRIVER V. 19.10.2005 III 'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII '------------------ DS1631 RESET ------------------ #DS1631RESET print"#ON_IIC#";"#START#";:put DS1631:put RESET:print"#STOP#";"#OFF#"; goto IIC_STATUS '------------------ DS1631 CONVERT ------------------ #DS1631CONVERT print"#ON_IIC#";"#START#";:put DS1631:put CONVERT:print"#STOP#";"#OFF#"; goto IIC_STATUS '----------------- GET DS1631 STATUS ----------------- #DS1631GET_STATUS print"#ON_IIC#";"#START#";:put DS1631:put CONFIG:print"#STOP#";"#OFF#"; print"#ON_IIC#";"#START#";:put DS1631+1:get DATA:print"#STOP#";"#OFF#"; goto IIC_STATUS '----------------- WRITE DS1631 STATUS ----------------- #DS1631WRITE_STATUS print"#ON_IIC#";"#START#";:put DS1631:put CONFIG:put DATA:print"#STOP#";"#OFF#"; goto IIC_STATUS '----------------- GET DS1631 TEMPERATURE ----------------- #DS1631GET_TEMP print"#ON_IIC#";"#START#";:put DS1631:put READ_TEMP:print"#STOP#";"#OFF#"; print"#ON_IIC#";"#START#";:put DS1631+1:get TEMPHI:get TEMPLO:print"#STOP#";"#OFF#"; goto IIC_STATUS '----------------------------------------------------- '----- CONFIG REGISTER ABFRAGE UND ERROR CLEAR ------- '----------------------------------------------------- #IIC_STATUS print"#ON_CONFIG#"; 'UMLEITUNG ZUM CONFIG MODULE get SCONFIG 'CONFIG REGISTER LESEN put (SCONFIG and &B10111111) 'IIC ERROR FLAG IN CONFIG LÖSCHEN print"#OFF#"; 'if (SCONFIG and &B01000000)>0 then Led=on else Led=off return 'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII Meine Homepage: http://www.dufour.ch |
| Antwort schreiben |