Hallo,
so mache ich es , ist zwar assembler aber vllt verstehst du es ja !
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Read_MCP_LCD_Data
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
call i2c_on
movlw B'01000000'
call i2c_tx
movlw H'12'
call i2c_tx
call i2c_ron
movlw B'01000001'
call i2c_tx
call i2c_rx
movfw RXData
movwf MCP_PORTAin
call i2c_off
und hier der auszug von i2c_ron
; I2C-Bus im Master-Mode übernehmen - repeated START
i2c_ron
bcf PIR1, SSPIF ; SSPIF Bit zurücksetzen
bsf STATUS, RP0
bsf SSPCON2, RSEN ; repeated start condition
bcf STATUS, RP0
btfss PIR1, SSPIF ; Bus schon frei ?
goto $-1 ;
bcf PIR1, SSPIF ; ja, Bus ist übernommen
return
erst musst du den bus übernehmen und dann die adresse des MCP schicken
mit letztem bit write dann musst du das GPIO register auswählen entweder
A oder B 0x12 oder 0x13 . dann musst du ein i2c reset ausführen dann
sendest du nochmal die i2c adresse nur jetzt das letzte bit als read .
jetzt kannst du den MCP auslesen das ganze noch in eine ramzelle
schreiben damit es nicht verloren geht und dann nicht vergessen den i2c
bus wieder frei zu geben !
mfg