>
> ;=====================================================
> #define I2CBRG 0x3F
> #define INPADDR b'0100000' ; PCF8574 address
> ;=====================================================
> START
> bcf STATUS,IRP
> bcf STATUS,RP1 ; setup bank 1 stuff
> bsf STATUS,RP0
>
> ; TRIS Setup
> movlw b'101111'
> movwf TRISA
> movlw b'00000000'
> movwf TRISB
> movlw b'11011000' ; <- note setting as inputs
> movwf TRISC
> movlw b'00000000'
> movwf TRISD
> movlw b'111'
> movwf TRISE
> ;=====================================================
> ; I2C Setup
> movlw (1<<SMP)|(0<<CKE) ; normal rate, no SMBUS
> movwf SSPSTAT
>
> movlw I2CBRG ; setup I2C Baud Rate Generator
> movwf SSPADD
>
> bcf STATUS,RP0 ; back to bank 0
>
> movlw (1<<SSPEN) | b'1000' ; SSP ON, I2C Master mode
> movwf SSPCON
>
> clrf SSPCON2
> ;=====================================================
>
> And this example for reading 8 input bits from a PCF8574 chip:
>
> ;=====================================================
> WAITSET MACRO REG,BIT ; wait for bit set
> btfss REG,BIT
> goto $-1
> ENDM
>
> ;=====================================================
>
> bcf PIR1,SSPIF ; clear any previous interrupt
> bsf STATUS,RP0
> bsf SSPCON2,SEN ; send I2C START
> bcf STATUS,RP0
> WAITSET PIR1,SSPIF
> bcf PIR1,SSPIF
>
> movlw (INPADDR<<1)|1 ; send address, read mode
> movwf SSPBUF
> WAITSET PIR1,SSPIF
> bcf PIR1,SSPIF
>
> bsf STATUS,RP0
> btfsc SSPCON2,ACKSTAT ; ACK received?
> goto IN_NAK ; Nope. Problem.
>
> bsf SSPCON2,RCEN ; OK, receive data
> bcf STATUS,RP0
> WAITSET PIR1,SSPIF
> bcf PIR1,SSPIF
> movf SSPBUF,W ; get data
> movwf INPUT_VALUE
>
> bsf STATUS,RP0
> bsf SSPCON2,ACKDT ; NAK (we do not want any more data)
> bsf SSPCON2,ACKEN ; send it
> bcf STATUS,RP0
> WAITSET PIR1,SSPIF
> bcf PIR1,SSPIF
>
> goto IN_DONE ; all done, STOP
>
> IN_NAK bcf STATUS,RP0
> ; put your error set-up here, but jump
> ; to / fall down to IN_DONE for I2C stop
>
> IN_DONE bsf STATUS,RP0
> bsf SSPCON2,PEN ; send I2C STOP
> bcf STATUS,RP0
> WAITSET PIR1,SSPIF
> bcf PIR1,SSPIF
>
> ; all done now
>
> ;=====================================================
>
> (writing is the same, but with the LSB of the address set to 0 and
> writing afterwards and checking for NAK, same as when sending the address)
>
> Regards,
> --
> Hector Martin (
hector
KILLspammarcansoft.com)
> Public Key:
http://www.marcansoft.com/hector.asc
>