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 

 Station hängt sich auf Kategorie: C-Control I V1.2/2.0 (von Pit - 2.03.2006 19:36)
Pit nutzt:  CC1-Station V2.0
High,
meine Station hängt sich, wenn ich folgendes Programm (Es wurden von mir Programmteile von DIE HARD verwendet) lade, erst ein paar mal auf, bevor es läuft.
Ich muß die Station mehrmals Resetten und Ein-und Ausschalten bis die Temperaturveränderungen angezeigt werden.
Vor dem Resetten und Schalten wird ein Wert angezeigt, der dann konstant stehen bleibt. Manchmal werden erst auch 2 oder 3 falsche Werte angezeigt, bis die Anzeige bei einem Wert stehen bleibt.

Vielleicht kann mal jemand drüber schauen und hat eine Erklärung.

Grüsse und Danke!!!

Pit


'--------------------------------------------------------------------
' 2 Temperatur Sensoren DS1631 abfragen und Ausgabe auf IIC-BUS LCD
'--------------------------------------------------------------------
'         Programm zur C-Control I Station 2.0 in CCBasic
'--------------------------------------------------------------------
' Die Schreibadresse der DS1631 ist als Konstante definiert.
' In diesem Programm haben die DS1631 die Adressen 156 (Write A2+A1=HI
' A0=LOW) sowie 158 (Write A2 bis A0=HI)
' Damit ergibt sich für eine READ-Operation folgender Wert: 156+1 oder 158+1
' Die Leseadresse berechnet hier der Treiber aus Schreibadresse+1.
'
' Ausgegeben wird die Temperatur auf einem IIC-Bus LCD (PCF8574 an
' Byteport 10 / A2 bis A0=HI).
'-----------------------------------------------------------------------
'Programm:
'Das Unterprogramm DS1631GET_TEMP liefert in TEMP einen 9 Bit-Wert,
'der allerdings linksbündig verschoben ist. Für eine richtige Anzeige
'ist eine entsprechende Korrektur notwendig. Diese 9 Bit liefern eine
'Auflösung von 0.5 Grad.
'Das Programm liest den DS 1631 im "ONE SHOT" Modus, d.h. der Sensor hat
'nur während der Temperaturwandlung/Übertragung mehr Strom (1mA). Sonst
'beträgt die Stromaufnahme des Sensor selbst < 1uA.
'------------------------------------------------------------------------

define EXTPORT     byteport[10]

'--------------------------
'---- SYSTEM MEMORY -------
'--------------------------
define DS1631      byte[5]  'Variable weil 2 Sensoren
'--------------------------
define Pool        158      'Adresse für Sensor 1
define Aussen      156      'Adresse für Sensor 2
'--------------------------
define TEMP        word[1]
define TEMPHI      byte[1]
define TEMPLO      byte[2]
define SCONFIG     byte[3]
define DATA        byte[4]
'--- LCD-I2C INTERFACE  --
define OUTBYTE     byte[6]
define LCD         byte[7]
define BUF         byte[8]
'-------------------------
define sda         port[9]
define scl         port[10]
'--------------------------
'--- DS1631 COMMANDS ------
'--------------------------
define CONVERT          &H51
define STOP_CONVERT     &H22
define READ_TEMP        &HAA
define CONFIG           &HAC
define RESET            &H54
'---------------------------


print"#on_lcd#";        'Initialisierung des Station LCD's
print"#init#";
print"#off#";
sda=on : scl=on

gosub lcd_init          'Initialisierung des IIC LCD's

'-----------------------------------------------------

gosub DS1631RESET
DATA = 1 : DS1631=Pool   : gosub DS1631WRITE_STATUS  ' ONE SHOT MODE
DATA = 1 : DS1631=Aussen : gosub DS1631WRITE_STATUS  ' ONE SHOT MODE
pause 10
data = 0

'-------------------------------------------------------------
'-----            Temperatur Leseschleife                  ---
'-------------------------------------------------------------
#LOOP
'-------------------------------------------------------------
'-----            AUSGABE AUF DAS IIC-BUS LCD              ---
'-------------------------------------------------------------
DS1631=Pool : gosub GETTEMP           'Zuweisung des Sensors 1
'Ausgabe der Pooltemperatur in Zeile 1
  TEMP = TEMP / 2
  LCD = 3 : gosub L1_GOTOPOS 'LINE 1 POS 3
  LCD = 80   : gosub WCAR 'P
  LCD = 111  : gosub WCAR 'o
  LCD = 111  : gosub WCAR 'o
  LCD = 108  : gosub WCAR 'l
  LCD = 32   : gosub WCAR 'space
  LCD = 32   : gosub WCAR 'space

  LCD = ((Temp - ((Temp / 100) * 100)) / 10) + 48 : gosub WCAR
  LCD = (Temp - ((Temp / 10) * 10)) + 48 : gosub WCAR
  LCD = &H2E : gosub WCAR '.

  LCD = ((TEMPLO and 1)*5) + 48 : gosub WCAR

  LCD = 223 : gosub WCAR '°
  LCD = 67 : gosub WCAR  'C
  LCD = 32 : gosub WCAR  'space


DS1631=Aussen : gosub GETTEMP          'Zuweisung des Sensors 2
'Ausgabe der Außentemperatur in Zeile 2
  TEMP = TEMP / 2
  LCD = 1 : gosub L2_GOTOPOS 'LINE 2 POS 1
  LCD = 65   : gosub WCAR 'A
  LCD = 117  : gosub WCAR 'u
  LCD = 115  : gosub WCAR 's
  LCD = 115  : gosub WCAR 'S
  LCD = 101  : gosub WCAR 'e
  LCD = 110  : gosub WCAR 'n
  LCD = 32   : gosub WCAR 'space
  LCD = 32   : gosub WCAR 'space

  LCD = ((Temp - ((Temp / 100) * 100)) / 10) + 48 : gosub WCAR
  LCD = (Temp - ((Temp / 10) * 10)) + 48 : gosub WCAR
  LCD = &H2E : gosub WCAR '.

  LCD = ((TEMPLO and 1)*5) + 48 : gosub WCAR

  LCD = 223 : gosub WCAR '°
  LCD = 67 : gosub WCAR  'C
  LCD = 32 : gosub WCAR  'space

Pause 20
goto LOOP
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII



'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
'IIIII             DS1631  DRIVER                 III
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
#GETTEMP
gosub DS1631CONVERT
#WAIT_READY
gosub DS1631GET_STATUS
if (DATA and &H80)=0 then goto WAIT_READY
gosub DS1631GET_TEMP
TEMP=TEMP SHR 7
if (TEMP and &H0100) = &H0100 then TEMP=(TEMP or &HFE00)
'------------------   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#";
return
'-----------------------------------------------------



'-------------------------------------------------------
'--- PCF 8574 LCD DRIVER AT ADDR 7 / EXT BYTEPORT 10 ---
'-------------------------------------------------------
#LCD_INIT
print "#on_iic#";
print "#init#";
print "#start#";
print "#stop#";
print "#off#";
EXTPORT=0
LCD=&H38:gosub LCD_WRITECMD
EXTPORT= &B00000010:EXTPORT= &B01000010:EXTPORT= &B00000010:
LCD=&H28:gosub LCD_WRITECMD:LCD=&H0C:gosub LCD_WRITECMD
#LCD_CLR
LCD=&H02:gosub LCD_WRITECMD:LCD=&H01:gosub LCD_WRITECMD:pause 5:return
#L1_GOTOPOS
LCD=LCD +&H7F:goto LCD_WRITECMD
#L2_GOTOPOS
LCD=LCD +&HBF:goto LCD_WRITECMD
#LCD_WRITECMD
BUF = off:goto LCD_WRITE
#WCAR
BUF = &B00100000
#LCD_WRITE
'--------- ------WRITE HI NIBBLE ------------------------
OUTBYTE=BUF or (LCD shr 4)
EXTPORT=OUTBYTE or &B01000000:EXTPORT=OUTBYTE and &B10111111
'--------------- WRITE LO NIBBLE ------------------------
OUTBYTE=BUF or (LCD and &H0F)
EXTPORT=OUTBYTE or &B01000000:EXTPORT=OUTBYTE and &B10111111
return
'-------------------------------------------------------

 Antwort schreiben

Bisherige Antworten: