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. Hi...... yes, and I desperately tried to find out why. This is the reason: define TEMP word[1] define TEMPHI byte[6] !!!!!!!! define TEMPLO byte[7] !!!!!!! The word TEMP is base for the calculation. This calculation is done with HBYTE and LOBYTE of TEMP seperately. Therefore TEMPHI and TEMPLO have to be assigned as byte[1] and byte[2] Below you find a running version of your program. Use this one for further development, because i changed some more details. e.g added a delay, and changed some delays to smaller values for speed up. ciao..... 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] define TEMPHI byte[1] define TEMPLO byte[2] define SCONFIG byte[3] define DATA byte[4] define DELAY byte[5] '--- LCD-I2C INTERFACE ------- define OUTBYTE byte[6] define LCD byte[7] define BUF byte[8] '------------------------------ '-------------------------- '--- DS1631 COMMANDS ------ '-------------------------- define CONVERT &H51 define STOP_CONVERT &H22 define READ_TEMP &HAA define CONFIG &HAC define RESET &H54 '--------------------------- 'SDA = on : SCL =on print"#ON_LCD#"; print"#INIT#"; print"READ DS1631 TEMP"; print"#OFF#"; gosub lcd_init 'initialisation LCD 'goto show'********************************************** '----------------------------------------------------- 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 TEMP=TEMP SHR 7 if (TEMP and &H0100) = &H0100 then TEMP=(TEMP or &HFE00) 'print temp '------------------------------------------------------------- '----- AFFICHAGE TEMPERATURE --- '------------------------------------------------------------- #show gosub LCD_CLR 'temp=100 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 20 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 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 '--------------- SOME LCDs NEED SOME DELAY HERE --------- FOR DELAY=0 TO 255 NEXT return '------------------------------------------------------- |
Antwort schreiben |