list p=18f4523 include GLOBAL INIT_I2C,READ_ID,READ_TEMP,Therm ; EXTERN SendChar #DEFINE ADDRESS_W 0x90 ; ADT7410 Address 0x48 shifted left by 1 #DEFINE ADDRESS_R 0x91 #DEFINE ADT7410_TEMPH 0x00 #DEFINE ADT7410_TEMPL 0x01 #DEFINE ADT7410_STATUS 0x02 #DEFINE ADT7410_CONFIG 0x03 #DEFINE ID 0x0B ; Obtain ID UDATA Temp RES 1 Therm RES 2 MyID RES 1 I2C_START MACRO BSF SSPCON2,SEN BTFSC SSPCON2,SEN GOTO $-2 ENDM I2C_STOP MACRO BSF SSPCON2,PEN BTFSC SSPCON2,PEN GOTO $-2 ENDM I2C_ACKCONF MACRO ; Confirm ACK BTFSC SSPCON2,ACKSTAT GOTO $-2 ENDM I2C_SendAck MACRO BSF SSPCON2,ACKEN BTFSC SSPCON2,ACKEN GOTO $-2 ENDM I2C CODE INIT_I2C ; BSF LATD,RD0 MOVLW 0x03 MOVWF SSPADD ; Baud Rate BSF TRISC,SDA ;Serial data (SDA) – RC4/SDI/SDA BSF TRISC,SCL ;Serial clock (SCL) – RC3/SCK/SCL BSF SSPSTAT,SMP BCF SSPSTAT,CKE MOVLW b'00001000' MOVWF SSPCON1 BSF SSPCON1,SSPEN I2C_START ; Send Start Bit ; Send Address for Write MOVLW ADDRESS_W MOVWF SSPBUF BTFSC SSPSTAT,BF GOTO $-2 I2C_ACKCONF ; Confirm ACK MOVLW ADT7410_CONFIG MOVWF SSPBUF BTFSC SSPSTAT,BF GOTO $-2 I2C_ACKCONF ; Confirm ACK ; Send Address for Write MOVLW b'11000000' MOVWF SSPBUF BTFSC SSPSTAT,BF GOTO $-2 I2C_ACKCONF ; Confirm ACK ; Send Stop I2C_STOP RETURN READ_ID I2C_START ; Send Start Bit ; Send Address for Write MOVLW ADDRESS_W MOVWF SSPBUF BTFSC SSPSTAT,BF GOTO $-2 I2C_ACKCONF ; Confirm ACK ; Send ID Byte MOVLW ID MOVWF SSPBUF BTFSC SSPSTAT,BF GOTO $-2 I2C_ACKCONF ; Confirm ACK ; Send Repeated Start Bit BSF SSPCON2,RSEN BTFSC SSPCON2,RSEN GOTO $-2 ; Send Address for Read MOVLW ADDRESS_R MOVWF SSPBUF BTFSC SSPSTAT,BF GOTO $-2 I2C_ACKCONF ; Confirm ACK ; Receive Data BSF SSPCON2,RCEN BTFSC SSPCON2,RCEN GOTO $-2 MOVFF SSPBUF,MyID BSF SSPCON2,ACKDT ; NoAck for no more data I2C_SendAck ; Send Stop I2C_STOP RETURN READ_TEMP I2C_START ; Send Start Bit ; Send Address for Write MOVLW ADDRESS_W MOVWF SSPBUF BTFSC SSPSTAT,BF GOTO $-2 I2C_ACKCONF ; Confirm ACK ; Send ID Byte MOVLW ADT7410_TEMPH MOVWF SSPBUF BTFSC SSPSTAT,BF GOTO $-2 I2C_ACKCONF ; Confirm ACK ; Send Repeated Start Bit BSF SSPCON2,RSEN BTFSC SSPCON2,RSEN GOTO $-2 ; Send Address for Read MOVLW ADDRESS_R MOVWF SSPBUF BTFSC SSPSTAT,BF GOTO $-2 I2C_ACKCONF ; Confirm ACK ; Receive Data BCF SSPCON2,ACKDT ; Ack for more data BSF SSPCON2,RCEN BTFSC SSPCON2,RCEN GOTO $-2 MOVFF SSPBUF,Therm+1 I2C_SendAck BSF SSPCON2,ACKDT ; NoAck for no more data BSF SSPCON2,RCEN BTFSC SSPCON2,RCEN GOTO $-2 MOVFF SSPBUF,Therm I2C_SendAck ; Send Stop I2C_STOP BCF LATD,RD0 RETURN END