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 > '------------------------------------------------------- > Many thanks for your help. Works fine. Daniel |
Antwort schreiben |