PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : M-Unit und DS1631-Aufloesung



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

Kauz
10.03.2007, 05:43
Hallo in die Runde...

da sich keiner meinem Problem annehmen wollte,
habe ich selbst weiter gesucht und versucht:

Herausgekommen ist eine etwas andere Vorgehensweise:
Ich benutze nur die beiden Byte-Variablen TEMPHI und TEMPLO.

Für den Positiven Bereich steht in TEMPHI immer die Gradzahl vor dem Komma...
sie wird gleich so uebernommen.
TEMPLO wird um 4Stellen nach rechts verschoben, mit 100 mal genommen
und dann durch 16 geteilt.
Das ergibt eine zweistellige ganze Zahl für die Nachkommastellen.
Diese Variante funktioniert in der 9-Bit, 10-Bit, 11-Bit und 12-Bit Auflösung.

Für die Minustemperaturen ist eine Anpassung, Umrechnung,
oder wie man es auch nennen will nötig.

Diese ist mit einem Gelkissen aus dem Gefrierfach bis -4,5 Grad getestet.


Vielleicht gibt es ja doch den ein oder anderen Neuling, der auch dieses
Problem hat.

Wenn jemand interessiert ist, hier posten oder E-Mail an mich.

Gruss Andreas

Manf
10.03.2007, 06:47
Irgendwie war die Beteiligung an dem Thema etwas gering, man kann es hier nachsehen:
https://www.roboternetz.de/phpBB2/topic_view_users.php?t=28296
Ich finde es grundsätzlich interessant, setze allerdings den Sensor zur Zeit auch nicht ein.
Schön dass die Lösung gefunden wurde und es ist in jedem Fall gut, sie so für weitere Anwender aufzuheben.
Manfred