
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
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 |