'==================== I2C =============== I2C_IDLE: asm { BankSel SSPSTAT I2C_IDLE2: clrwdt btfsc SSPSTAT, R_W goto I2C_IDLE2 I2C_IDLE3: clrwdt movf SSPCON2,w andlw 0x1F btfss STATUS,Z goto I2C_IDLE3 bcf STATUS, RP0 } return I2C_START: asm { BankSel SSPCON2 bsf SSPCON2,SEN I2C_START2: clrwdt btfsc SSPCON2,SEN goto I2C_START2 bcf STATUS,RP0 } return I2C_RSTART: asm { BankSel SSPCON2 bsf SSPCON2,RSEN I2C_RSTART2: clrwdt btfsc SSPCON2,RSEN goto I2C_RSTART2 bcf STATUS,RP0 } return I2C_adress: asm { bsf STATUS,RP0 bcf STATUS,RP1 movf SLAVE,w ; adresse slave *2 bcf STATUS,RP0 movwf SSPBUF bsf STATUS,RP0 I2C_adresse2: clrwdt btfsc SSPSTAT,R_W goto I2C_adresse2 bcf STATUS,RP0 } return I2C_ACK: gosub I2C_idle asm { BankSel SSPCON2 btfsc SSPCON2,ACKSTAT goto I2C_Error } return I2C_NOACK: asm { BankSel SSPCON2 bsf SSPCON2, ACKDT bsf SSPCON2, ACKEN bcf STATUS,RP0 } return I2C_SetACK: asm { BankSel SSPCON2 bcf SSPCON2, ACKDT bsf SSPCON2, ACKEN bcf STATUS,RP0 } return I2C_STOP: gosub I2C_idle asm { BankSel SSPCON2 bsf SSPCON2, PEN bcf STATUS,RP0 } return I2C_READ: gosub I2C_idle asm { BankSel SSPCON2 bsf SSPCON2, RCEN call I2C_idle bcf STATUS,RP0 } rtmp = SSPBUF return I2C_Write: gosub I2C_idle asm { movlw rtmp movwf SSPBUF } return I2C_ERROR: ' err=1 gosub I2C_STOP gosub I2C_START return ' Pcf8583 ' A3 read ' A2 Write ' ' I = Adresse à lire ' R = octet à ecrire ' R octet lu ' read24C: Rtmp = 0xA0 goto ReadPcf2 readPcf: rtmp = 0xA2 readPcf2: reset err Slave = RTMP gosub I2c_START gosub I2C_Adress gosub I2C_Ack if err =1 then goto readPcf2 Delayus(30) Slave = ITMP gosub I2C_Adress gosub I2C_Ack if err =1 then goto readPcf2 Delayus(30) gosub I2c_RSTART Slave = RTMP +1 gosub I2C_Adress gosub I2C_Ack if err =1 then goto readPcf2 Delayus(30) asm { bsf STATUS,RP0 bsf SSPCON2,ACKDT ; dernier charactère } gosub I2C_Read gosub I2C_SetAck goto I2C_STOP Write24C: Slave = 0xA0 goto WritePCF2 WritePcf: Slave = 0xA2 WritePcf2: gosub I2c_START gosub I2C_Adress gosub MiTemp gosub I2C_Ack Delayus(30) Slave = ITMP gosub I2C_Adress gosub MiTemp gosub I2C_Ack Delayus(30) gosub I2C_Write gosub MiTemp gosub I2C_Ack Delayus(30) goto I2C_STOP MiTemp: Delayus(10 ); return