Vor einem halben Jahr habe ich eine C-Control I Station M2.0 erworben und dazu 3 Temperatursensoren für den IIC Bus um eine Heizungssteuerung zu realisieren.
Sensor 1 ist unverändert, Addresse 158(+1)
Sensor 2 ist auf ad0 auf ground gebrückt, Addresse 156(+1)
Sensor 3 ist auf ad1 auf ground gebrückt, Addresse 154(+1)
Sensor 1 und 2 waren seitdem ohne Pause in Betrieb und verrichten ihren Dienst tadellos.
Vor kurzem wollte ich jetzt neben der Vorlauftemperatur (Sensor 1) und der Boilertemperatur (Sensor 2) noch die Heizkesseltemperatur mit Sensor 3 ermitteln.
Als ich diesen angeschlossen habe und ein entsprechendes Programm geladen habe das mir einfach nur alle drei Werte immer wieder ausliest und ausgibt kam es zu Fehlern.
Der Wert der Sensoren 1 und 3 wurde 0 oder nahm andere fixe Werte an.
Sensor 2 tickerte ohne Probleme weiter.
Verwendeter Code:
DS1631_Generic.bas
Code:
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
'III      BASIC++  DEMO ZUM BASIC-COMPUTER UNIT M 1.2/2.0       IIIII
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
'--------------------------------------------------------------------
' Beispiel zum BASIC-COMPUTER    mit dem Programmer/Application-Board
'--------------------------------------------------------------------
' LIBRARY:                           COMMON DS1631 CONTROL ROUTINES
'                                   
'---------------------------------------------------------------------
'DS1631RESET(ADDR as byte)                    RESET
'DS1631CONVERT(ADDR as byte)                  START CONVERSION
'DS1631GET_STATUS(ADDR as byte)               READ STATUS REGISTER,RETURN BYTE
'DS1631SET_STATUS(ADDR as byte,DATA as byte)  WRITE STATUS REGISTER
'DS1631GET_TEMP(ADDR as byte)                 RETURN WORD WITH TEMP
'-------------------------------------------------------------------

'--------------------------
'--- DS1631 COMMANDS ------
'--------------------------
const CONVERT=51h
const STOP_CONVERT=22h
const READ_TEMP=AAh
const CONF=ACh
const RESET=54h

'-----------------------------------------------------
'------------------   DS1631 RESET  ------------------
'-----------------------------------------------------
FUNCTION DS1631RESET(ADDR as byte)
IIC.INIT
IIC.START
IIC.SEND ADDR
IIC.SEND RESET
IIC.STOP
IIC.OFF
END FUNCTION
'-----------------------------------------------------
'------------------   DS1631 CONVERT  ----------------
'-----------------------------------------------------
FUNCTION DS1631CONVERT(ADDR as byte)
IIC.INIT
IIC.START
IIC.SEND ADDR
IIC.SEND CONVERT
IIC.STOP
IIC.OFF
END FUNCTION
'-----------------------------------------------------
'----------------- GET DS1631 STATUS -----------------
'-----------------------------------------------------
FUNCTION DS1631GET_STATUS(ADDR as byte)
define DATA as byte
IIC.INIT
IIC.START
IIC.SEND ADDR
IIC.SEND CONF
IIC.STOP

IIC.START
IIC.SEND (ADDR+1)
IIC.GET DATA
IIC.STOP
IIC.OFF
RETURN DATA
END FUNCTION
'-------------------------------------------------------
'----------------- SET DS1631 STATUS -----------------
'-------------------------------------------------------
FUNCTION DS1631SET_STATUS(ADDR as byte,DATA as byte)
IIC.INIT
IIC.START
IIC.SEND ADDR
IIC.SEND CONF
IIC.SEND DATA
IIC.STOP
END FUNCTION
'-------------------------------------------------------
'----------------- WAIT DS1631 READY   -----------------
'-------------------------------------------------------
FUNCTION DS1631WAIT_READY(ADDR as byte)
#WT
if (DS1631GET_STATUS(ADDR)) and 80h = 0 then goto WT
END FUNCTION
'-----------------------------------------------------
'----------------- GET DS1631 TEMP -----------------
'-----------------------------------------------------
FUNCTION DS1631GET_TEMP(ADDR as byte)
define TEMP as word
define DATA as byte

IIC.INIT
IIC.START
IIC.SEND ADDR
IIC.SEND READ_TEMP
IIC.STOP

IIC.START
IIC.SEND (ADDR+1)
IIC.GET DATA
TEMP=DATA*256
IIC.GET DATA
TEMP=TEMP+DATA
IIC.STOP
IIC.OFF
RETURN TEMP
END FUNCTION
Auslesen der Sensoren:
Code:
Function sensorenlesen()
LCD.Off
DS1631CONVERT(ADR1)               'DA-Umsetzung starten
DS1631WAIT_READY(ADR1)            'auf Bereitmeldung warten
vorlaufist=DS1631GET_TEMP(ADR1)/256   'Messwert an Variable 
DS1631CONVERT(ADR2)               'DA-Umsetzung starten
DS1631WAIT_READY(ADR2)            'auf Bereitmeldung warten
brauchwasserist=DS1631GET_TEMP(ADR2)/256   'Messwert an Variable  
DS1631CONVERT(ADR3)               'DA-Umsetzung starten
DS1631WAIT_READY(ADR3)            'auf Bereitmeldung warten
kesselist=DS1631GET_TEMP(ADR3)/256   'Messwert an Variable 
Print ";b:" & brauchwasserist & ";v:" & vorlaufist & ";r1:" & r1 & ";r2:" & r2 & ";r3:" & r3 & ";r4:" & r4
LCD.Init switchonly
End Function
Print schickt mir über die RS232 Schnittstelle Informationen zum Zustand der C-Control Station und ihrer Relais/Sensoren. (r1-4 <=> Relais 1-4)
Mache ich eventuel einen Fehler beim Auslesen der Sensoren?
Ein Addresskonflikt fällt aus, da einzeln betrieben (also nur 1+2 oder 2+3) die Daten fehlerfrei gelesen werden (Temperaturüberprüfung mit aufgelegtem Daumen, der Wert stieg sofort an, bzw. sank nach wegnahme des Daumens umgehend wieder).
Oder ist der Bus mit 3 Sensoren überbelastet? (eine übermässige Länge der Kabel liegt nicht vor die Länge ist <3m für alle Kabel. Das Kabel zum Sensor 1 hat ca 2,5m die zu den beiden anderen jeweils ca 1m)

Als Problem kommt noch hinzu: eigentlich müssten noch mindestens 2 weitere Sensoren (Innenraum- und Aussentemperatur) dazu kommen, könnte das auch zu Problemen führen?

Gruss Imrahil