INFO - FAQ - CC2-Forum - CCPro-Forum |
|
I'm desperately trying to read I2C DS1631 (Conrad 198298). What is wrong in my program below ?? TEMP is always Zero. 'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 'IIIIIII DEMO ZUM BASIC-COMPUTER UNIT M 1.2/2.0 (by DIE HARD) IIIII 'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII '-------------------------------------------------------------------- ' Beispiel zum BASIC-COMPUTER mit dem Programmer/Application-Board '-------------------------------------------------------------------- ' ANWENDUNG: IIC_BUS - TEMPERATURSENSOR (198298) ' TEMPERATUR DS1631 AM IIC-BUS-BUS ABFRAGEN ' CControl Unit M2 Version 2.02 ' LCD on Byteport[10] '-------------------------------------------------------------------- ' Eine kleine DEMO welchedie TEMPERATUR eines DS1631 am IIC-BUS abfragt ' Beschreibung: ' Der DS1631 wird angesprochen indem zunächst die START-Bedingung und ' danach die ADRESSE zusammen mit dem READ/WRITE-Bit gesendet wird. ' Die Adresse besteht aus einem festen, nicht veränderbaren Anteil und ' einem vom Benutzer wählbaren Teil (drei Jumper). Das letzte Bit ' legt fest ob eine READ (Eingabe) oder WRITE (Ausgabe) über den PCF 8574 ' erfolgt ' Es ist nur die Schreibadresse als Konstante definiert, die Leseadresse ' berechnet der Treiber zu Schreibadresse+1 ' In diesem Beispiel hat der DS1631 die Adresse 7 (alle Bits auf HI) ' d.h. alle Jumper müssen abgezogen sein. ' Damit ergibt sich für eine READ-Operation folgender Wert: ' ' 1 0 0 1 1 1 1 1 READ-Operation ADR 159 ' I------I-----I-I ' FIX ADR ADR R/W ' ' Für eine WRITE-Operation ist das letzte Bit LO und es ergibt sich ' folgender Wert: ' ' 1 0 0 1 1 1 1 0 WRITE-Operation ADR 158 ' I------I-----I-I ' FIX ADR ADR R/W '----------------------------------------------------------------------- '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 liset den DS 1631 im "ONE SHOT" Modus, d.h. der Sensor ist 'nur während der Temperaturwandlung/Übertragung Strom (1mA). Sonst beträgt 'die Stromaufnahme des Sensor selbst < 1uA 'Die Demo ist im neg. Temperaturbereich nicht getestet. '------------------------------------------------------------------------ define EXTPORT byteport[10] 'LCD sur PCF8574 define Led port[4] 'define SDA port[9] 'define SCL port[10] '-------------------------- '---- SYSTEM MEMORY ------- '-------------------------- define DS1631 158 'I2C ADDRESS $9E define TEMP word[1] '--- LCD-I2C INTERFACE ------- define OUTBYTE byte[3] define LCD byte[4] define BUF byte[5] '------------------------------ define TEMPHI byte[6] define TEMPLO byte[7] define SCONFIG byte[8] define DATA byte[9] '-------------------------- '--- DS1631 COMMANDS ------ '-------------------------- define CONVERT &H51 define STOP_CONVERT &H22 define READ_TEMP &HAA define CONFIG &HAC define RESET &H54 '--------------------------- 'SDA = on : SCL =on gosub lcd_init 'initialisation LCD '----------------------------------------------------- 'gosub DS1631RESET DATA = 1 : gosub DS1631WRITE_STATUS ' ONE SHOT MODE 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 'if TEMPHI>=128 then goto NEGTEMP 'ancienne version 'TEMP=TEMP shr 7 : goto show '#NEGTEMP TEMP=(TEMP shr 7)or &HFE TEMP=TEMP SHR 7 if (TEMP and &H0100) = &H0100 then TEMP=(TEMP or &HFE00) '------------------------------------------------------------- '----- AFFICHAGE TEMPERATURE --- '------------------------------------------------------------- #show gosub LCD_CLR TEMP = TEMP / 2 LCD = 1 : gosub L1_GOTOPOS 'LINE 1 POS 1 LCD = 84 : gosub WCAR 'T LCD = 101 : gosub WCAR 'e LCD = 109 : gosub WCAR 'm LCD = 112 : gosub WCAR 'p LCD = 46 : gosub WCAR '. LCD = 32 : gosub WCAR 'space LCD = (Temp / 100) + 48 : gosub WCAR 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 100 goto LOOP 'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 'IIIII DS1631 DRIVER III 'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII '------------------ 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 Led=on else Led=off return '----------------------------------------------------- '================================================== ' PCF 8574 LCD DRIVER AT ADDR 7 / EXT BYTEPORT 10 '-------------------------------------------------- #LCD_INIT EXTPORT = 0 LCD = &H38 : gosub LCD_WRITECMD '&H38 = 2 lignes ++ 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 20 : return #L1_GOTOPOS LCD = LCD + 127 : goto LCD_WRITECMD #L2_GOTOPOS LCD = LCD + 191 : goto LCD_WRITECMD #L3_GOTOPOS LCD = LCD + 147 : goto LCD_WRITECMD #L4_GOTOPOS LCD = LCD + 211 : 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 |