Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: DS1631: 10, 11 oder 12 Bits Konfigurieren/lesen Kategorie: C-Control I V1.2/2.0 (von Daniel, Homepage - 26.10.2005 14:36)
 Als Antwort auf Re: DS1631: 10, 11 oder 12 Bits Konfigurieren/lesen von Henrik - 25.10.2005 21:08
Daniel nutzt:  CC1-M-Unit V1.2/2.0

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

Bisherige Antworten:

Re: DS1631: 10, 11 oder 12 Bits Konfigurieren/lesen (von Henrik - 26.10.2005 15:15)
    Re: DS1631: 10, 11 oder 12 Bits Konfigurieren/lesen (von Daniel - 26.10.2005 17:16)
        Re: DS1631: 10, 11 oder 12 Bits Konfigurieren/lesen (von Daniel - 29.10.2005 9:00)