Hi again everyone, I've been trying to interface my PIC16F690 with a DS1621 Digital Thermometer. I haven't been able to find many resources and the code I have found within the forum I could not get to work. The code which I have tried to adapt now is for a DS1624 and the commands seem identical to me but yet it returns "0.00". my serial communication is working 100% and I have gone over my wiring a lot. Open to any suggestions/changes. I have got A0, A1, A2 all grounded which gives the device an address of %10010000. Aswell as 4.7k pick ups on the sda scl lines. I thought it possibly could be because I am using Port A.0 and A.1? Not sure.
Code:DEFINE OSC 4 DEFINE HSER_RCSTA 90h DEFINE HSER_TXSTA 20h DEFINE HSER_SPBRG 25 DEFINE HSER_CLROERR 1 SDA VAR PORTA.0 SCL VAR PORTA.1 i2c_read CON 1 'R/W configuration bit (1 = read) i2c_write CON 0 'R/W configuration bit (0 = write) i2c_out VAR BYTE 'data to sent over I2C bus i2c_in VAR BYTE[2] 'data received over I2C bus i2c_ack VAR BIT 'acknowledgement bit temp VAR WORD Hserout ["Starting"] GOSUB Config_Register 'Set Configuration GOSUB Start_Convert 'Start continuous conversion TOP: PAUSE 2000 GOSUB Read_Temp 'Read the current temperature i2c_in[2] = i2c_in[1] >> 3 'Shift 5 decimal bits to LS position temp = (i2c_in[1]*1000) 'PIC Doesn’t like decimals, but there is a way to work around this HSEROUT [DEC i2c_in[0],".",DEC2 (temp ** 2048)/100,13,10]'Outputs temperature to termina GOTO top 'Loops forever Config_Register: 'Set continuous conversion GOSUB I2C_START 'Start Condition i2c_out = %10010000 'Send Address, (device= %1001, A0= 0, A1= 0, A2= 0, R/W= 0) GOSUB I2C_TX 'Send data in “i2c_out” i2c_out = $AC 'Send “Access Configuration” command GOSUB I2C_TX 'Send data in “i2c_out” i2c_out = $00 'Send “Continuous Conversion” command GOSUB I2C_TX 'Send data in “i2c_out” GOSUB I2C_STOP 'Stop Condition RETURN Start_Convert: 'Start Conversion GOSUB I2C_START i2c_out = %10010000 'Send Address, (device= %1001, A0= 0, A1= 0, A2= 0, R/W= 0) GOSUB I2C_TX i2c_out = $EE 'Send “Start to Convert” command GOSUB I2C_TX GOSUB I2C_STOP RETURN Read_Temp: 'Read temperature GOSUB I2C_START i2c_out = %10010000 'You must “write” the command to read the temperature before GOSUB I2C_TX 'reading it, therefore R/W still is 0 i2c_out = $AA 'Send “Read Temperature” command GOSUB I2C_TX GOSUB I2C_START '* Reissue Start Condition * i2c_out = %10010001 'Send Address, (device= %1001, A0= 0, A1= 0, A2= 0, R/W= *1*) GOSUB I2C_TX 'Transmit address with R/W bit as 1 (“read”) GOSUB I2C_RX 'Start getting data coming in GOSUB I2C_STOP 'Issue stop condition RETURN I2C_START: 'I2C start (start communication on I2C bus) HIGH SDA HIGH SCL LOW SDA LOW SCL RETURN I2C_STOP: 'I2C stop (terminate communication on I2C bus) LOW SDA HIGH SCL HIGH SDA PAUSE 1 RETURN I2C_RX: 'I2C receive -> receive data from slave SHIFTIN SDA,SCL,0,[i2c_in[0]] 'Shift in first byte MSBpre SHIFTOUT SDA,SCL,1,[%0\1] 'Send acknowledge (ACK) = 0 SHIFTIN SDA,SCL,0,[i2c_in[1]] 'Shift in second byte MSBpre SHIFTOUT SDA,SCL,1,[%1\1] 'Send not acknowledge (NACK) = 1 RETURN I2C_TX: 'I2C transmit -> send data to the slave SHIFTOUT SDA,SCL,1,[i2c_out] 'Shift out “i2c_out” MSBfirst SHIFTIN SDA,SCL,0,[i2c_ack\1] 'Receive ACK bit RETURN END



thank you for explaining. I wanted to ask another question I thought I would just keep it in this thread since its small.


Bookmarks