Kauz
02.03.2007, 00:05
Hallo miteinander...
Ich brauch ein bisschen Nachhilfe in Sachen CCBasic und Tempsensor DS1631:
Voraussetzungen Hard und Software:
Applikationsboard mit der Unit-M 2.0 (V2.05)
Vorerst nur einen IIC-Bus Temp-Sensor DS1631 (sollen mal 5-6 werden)
CCBasic von der beiliegenden CD
Voraussetzungen >Kauz< (Andreas):
Vor ca. 3 Jahren habe ich mit der alten M-Unit eine funktionierende Heizungssteuerung gebaut.....
einschliesslich eines Terminalprogramms in VB5 zum Datentransfer..... leider nicht lange.
Weil mir durch aeussere Einfluesse die Unit hops gegangen ist.
Die erweiterten Funktionen (IIC-Bus / LCD-Display) der neuen Unit haben mich zu einem Neustart bewogen.
Nun zu meinem Problem:
Habe den Beispielcode fuer den IIC-Bus Temp-Sensor erfolgreich ausprobiert.
Ich moechte die Auflösung von 0,5C auf 0,25C oder noch kleiner setzen.
Das war dann aber nicht so erfolgreich.
Mein Gedanke war:
Ich schreibe mit DATA nicht den Wert 1 (1Shot) ins Configregister, sondern z.B. den Wert 13 fuer die 12-Bit Aufl”sung.(0-0-0-0-1-1-0-1)
Die Zeile TEMP=TEMP SHR 7 ändere ich auf TEMP=TEMP SHR 4
Bei der Ausgabe auf das LCD teile ich TEMP nicht durch 2 sondern durch 16.....
Mit der anschliessenden Ausgabe von TEMPLO habe ich mich noch nicht befasst,
weil die vorher genannten Aenderungen keine schluessigen Ergebnisse lieferten.
Bei den vielen Versuchen bin ich ber die Frage > wo bekommt die Variable TEMP eigentlich den gemessenen Wert vom Sensor zugewiesen? < gestolpert.
und warum bleiben die Bits mit der Wertigkeit 4 und 8 nicht gesetzt, wo doch Write_Status nur einmal beim Programmstart durchlaufen wird?
Ich nehme jegliche Hilfe an, soll heissen:
Ein geaendertes Beispielprogramm mit einer hoeheren Aufloesung zum weiteren Selbststudium,
oder auch Erklaerungen zu den beiden Fragen.... nachlegen kann ich ja immer noch.
(das Datenblatt zum DS1631 hat mir auch nicht weitergeholfen....
scheinbar verstehe ich entscheidene Stellen nicht)
Besten Dank im Voraus an alle
Gruss Andreas
PS: Dies ist mein erstes Posting... hab ich was falsch gemacht?.... dann ruhig meckern.
Falls der Demo-Code nicht parat ist:
'--------------------------
'------ I/O PORTS ---------
'--------------------------
define LIGHT port[16]
'--------------------------
'---- SYSTEM MEMORY -------
'--------------------------
define TEMP word[1]
define TEMPHI byte[1]
define TEMPLO byte[2]
define SCONFIG byte[3]
define DATA byte[4]
'--------------------------
define DS1631 158 'IIC ADDRESS $9E
'--------------------------
'--- DS1631 COMMANDS ------
'--------------------------
define CONVERT &H51
define STOP_CONVERT &H22
define READ_TEMP &HAA
define CONFIG &HAC
define RESET &H54
'---------------------------
#INIT
LIGHT=off
'----------- EINSCHALT MELDUNG ------------------------
print"#ON_LCD#";
print"#INIT#";
print"READ DS1631 TEMP";
print"#OFF#";
'-----------------------------------------------------
'gosub DS1631RESET
DATA=1:gosub DS1631WRITE_STATUS ' ONE SHOT MODE #### DATA=13 ####
pause 10
data=0
'-------------------------------------------------------------
'----- LOOP READING TEMPERATURE ---
'-------------------------------------------------------------
#LOOP
gosub DS1631CONVERT
#WAIT_READY
gosub DS1631GET_STATUS
if (DATA and &H80)=0 then goto WAIT_READY
gosub DS1631GET_TEMP
TEMP=TEMP SHR 7 ### TEMP=TEMP SHR4 ###
if (TEMP and &H0100) = &H0100 then TEMP=(TEMP or &HFE00)
print"#ON_LCD#";"#L201#";"TEMP: ";TEMP/2;".";(TEMPLO and 1)*5;" C ";"#OFF#";
goto LOOP
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIII
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII III
'IIIII DS1631 DRIVER III
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII III
'------------------ 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 LIGHT=on else LIGHT=off
return
Ich brauch ein bisschen Nachhilfe in Sachen CCBasic und Tempsensor DS1631:
Voraussetzungen Hard und Software:
Applikationsboard mit der Unit-M 2.0 (V2.05)
Vorerst nur einen IIC-Bus Temp-Sensor DS1631 (sollen mal 5-6 werden)
CCBasic von der beiliegenden CD
Voraussetzungen >Kauz< (Andreas):
Vor ca. 3 Jahren habe ich mit der alten M-Unit eine funktionierende Heizungssteuerung gebaut.....
einschliesslich eines Terminalprogramms in VB5 zum Datentransfer..... leider nicht lange.
Weil mir durch aeussere Einfluesse die Unit hops gegangen ist.
Die erweiterten Funktionen (IIC-Bus / LCD-Display) der neuen Unit haben mich zu einem Neustart bewogen.
Nun zu meinem Problem:
Habe den Beispielcode fuer den IIC-Bus Temp-Sensor erfolgreich ausprobiert.
Ich moechte die Auflösung von 0,5C auf 0,25C oder noch kleiner setzen.
Das war dann aber nicht so erfolgreich.
Mein Gedanke war:
Ich schreibe mit DATA nicht den Wert 1 (1Shot) ins Configregister, sondern z.B. den Wert 13 fuer die 12-Bit Aufl”sung.(0-0-0-0-1-1-0-1)
Die Zeile TEMP=TEMP SHR 7 ändere ich auf TEMP=TEMP SHR 4
Bei der Ausgabe auf das LCD teile ich TEMP nicht durch 2 sondern durch 16.....
Mit der anschliessenden Ausgabe von TEMPLO habe ich mich noch nicht befasst,
weil die vorher genannten Aenderungen keine schluessigen Ergebnisse lieferten.
Bei den vielen Versuchen bin ich ber die Frage > wo bekommt die Variable TEMP eigentlich den gemessenen Wert vom Sensor zugewiesen? < gestolpert.
und warum bleiben die Bits mit der Wertigkeit 4 und 8 nicht gesetzt, wo doch Write_Status nur einmal beim Programmstart durchlaufen wird?
Ich nehme jegliche Hilfe an, soll heissen:
Ein geaendertes Beispielprogramm mit einer hoeheren Aufloesung zum weiteren Selbststudium,
oder auch Erklaerungen zu den beiden Fragen.... nachlegen kann ich ja immer noch.
(das Datenblatt zum DS1631 hat mir auch nicht weitergeholfen....
scheinbar verstehe ich entscheidene Stellen nicht)
Besten Dank im Voraus an alle
Gruss Andreas
PS: Dies ist mein erstes Posting... hab ich was falsch gemacht?.... dann ruhig meckern.
Falls der Demo-Code nicht parat ist:
'--------------------------
'------ I/O PORTS ---------
'--------------------------
define LIGHT port[16]
'--------------------------
'---- SYSTEM MEMORY -------
'--------------------------
define TEMP word[1]
define TEMPHI byte[1]
define TEMPLO byte[2]
define SCONFIG byte[3]
define DATA byte[4]
'--------------------------
define DS1631 158 'IIC ADDRESS $9E
'--------------------------
'--- DS1631 COMMANDS ------
'--------------------------
define CONVERT &H51
define STOP_CONVERT &H22
define READ_TEMP &HAA
define CONFIG &HAC
define RESET &H54
'---------------------------
#INIT
LIGHT=off
'----------- EINSCHALT MELDUNG ------------------------
print"#ON_LCD#";
print"#INIT#";
print"READ DS1631 TEMP";
print"#OFF#";
'-----------------------------------------------------
'gosub DS1631RESET
DATA=1:gosub DS1631WRITE_STATUS ' ONE SHOT MODE #### DATA=13 ####
pause 10
data=0
'-------------------------------------------------------------
'----- LOOP READING TEMPERATURE ---
'-------------------------------------------------------------
#LOOP
gosub DS1631CONVERT
#WAIT_READY
gosub DS1631GET_STATUS
if (DATA and &H80)=0 then goto WAIT_READY
gosub DS1631GET_TEMP
TEMP=TEMP SHR 7 ### TEMP=TEMP SHR4 ###
if (TEMP and &H0100) = &H0100 then TEMP=(TEMP or &HFE00)
print"#ON_LCD#";"#L201#";"TEMP: ";TEMP/2;".";(TEMPLO and 1)*5;" C ";"#OFF#";
goto LOOP
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIII
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII III
'IIIII DS1631 DRIVER III
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII III
'------------------ 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 LIGHT=on else LIGHT=off
return