;---------------------------------------- Interrupt-Adresse: ORG 4 MOVWF SYS_WSAV ; save register SWAPF STATUS,W CLRF STATUS MOVWF SYS_SSAV MOVFW PCLATH MOVWF SYS_PSAV CLRF PCLATH I2C_ROUTINE BANKSEL BANK0 BTFSS PIR1,SSPIF GOTO EXITINT BCF PIR1,SSPIF BSF PORTE,0 ; LED an, wenn Interrupt für I2C gesetzt ist BANKSEL BANK1 BTFSS SSPSTAT,2 ; SSPSTAT,R/W gesetzt? GOTO INT_I2CREAD ; Wenn nicht, dann soll ich Slave nur empfangen GOTO INT_I2CWRITE ; Wenn ja, dann soll ich Slave schreiben ;---------------------------------------- I2C Lesen: INT_I2CREAD BANKSEL BANK0 BSF PORTE,1 BCF PORTE,2 BANKSEL BANK1 BTFSC SSPSTAT,D_A GOTO BYTE_IST_DATEN GOTO BYTE_IST_ADRESSE BYTE_IST_ADRESSE BANKSEL BANK0 MOVFW SSPBUF ; SSPBUF auslesen MOVWF I2C_BYTE_ADD_0 CLRF SSPBUF BANKSEL BANK1 BCF SSPSTAT,BF BANKSEL BANK0 BSF SSPCON,CKP BCF SSPCON,SSPOV MOVLW D'1' MOVWF BYTEZEIGER GOTO EXITINT BYTE_IST_DATEN BANKSEL BANK0 MOVLW D'1' XORWF BYTEZEIGER,W BZ HOLE_BYTE_01 MOVLW D'2' XORWF BYTEZEIGER,W BZ HOLE_BYTE_02 MOVLW D'3' XORWF BYTEZEIGER,W BZ HOLE_BYTE_03 MOVLW D'4' XORWF BYTEZEIGER,W BZ HOLE_BYTE_04 GOTO EXITINT HOLE_BYTE_01 BANKSEL BANK0 MOVFW SSPBUF ; SSPBUF auslesen MOVWF I2C_BYTE_01 CLRF SSPBUF INCF BYTEZEIGER,F BANKSEL BANK1 BCF SSPSTAT,BF BANKSEL BANK0 BSF SSPCON,CKP BCF SSPCON,SSPOV MOVFW I2C_BYTE_01 ; Addieren von 10 zu dem ersten Datenbyte, was gelesen wurde ADDLW D'10' MOVWF I2CDATEN ; und an Schreibpuffer übergeben GOTO EXITINT HOLE_BYTE_02 BANKSEL BANK0 MOVFW SSPBUF ; SSPBUF auslesen MOVWF I2C_BYTE_02 CLRF SSPBUF INCF BYTEZEIGER,F BANKSEL BANK1 BCF SSPSTAT,BF BANKSEL BANK0 BSF SSPCON,CKP BCF SSPCON,SSPOV GOTO EXITINT HOLE_BYTE_03 BANKSEL BANK0 MOVFW SSPBUF ; SSPBUF auslesen MOVWF I2C_BYTE_03 CLRF SSPBUF INCF BYTEZEIGER,F BANKSEL BANK1 BCF SSPSTAT,BF BANKSEL BANK0 BSF SSPCON,CKP BCF SSPCON,SSPOV GOTO EXITINT HOLE_BYTE_04 BANKSEL BANK0 MOVFW SSPBUF ; SSPBUF auslesen MOVWF I2C_BYTE_04 CLRF SSPBUF INCF BYTEZEIGER,F BANKSEL BANK1 BCF SSPSTAT,BF BANKSEL BANK0 BSF SSPCON,CKP BCF SSPCON,SSPOV BCF PIR1,SSPIF GOTO EXITINT ;======================================== I2C Schreiben: INT_I2CWRITE BANKSEL BANK0 BSF PORTE,2 BCF PORTE,1 ;Erst Adresse auslesen: BANKSEL BANK0 MOVFW SSPBUF ; SSPBUF auslesen MOVWF I2C_BYTE_ADD_1 CLRF SSPBUF ; Dann Schreibvorgang starten: BANKSEL BANK1 ;+ BCF PIE1,SSPIE ;+ BCF SSPSTAT,BF ;+ BANKSEL BANK0 BSF SSPCON,CKP BCF SSPCON,SSPOV ;+ MOVLW D'222' MOVWF SSPBUF CALL INT_WAITMSSP ; BANKSEL BANK1 ; BTFSC SSPCON2,ACKSTAT ; GOTO INT_I2CFAIL BANKSEL BANK1 ;+ BSF PIE1,SSPIE ;+ BANKSEL BANK0 GOTO EXITINT ;======================================== Ende I2C Schreiben: ;---------------------------------------- I2C-Subroutinen: INT_I2CFAIL ; Fehlerbehandlung BANKSEL BANK1 BSF SSPCON2,PEN ; STOP CALL INT_WAITMSSP BANKSEL BANK0 RETURN GOTO EXITINT INT_SEND_I2C_BYTE ; Laden des Aktuellen Bytes in SSPBUF BANKSEL BANK0 MOVWF SSPBUF RETURN INT_WAITMSSP ; Warte bis SSPIF gesetzt ist BANKSEL BANK0 BTFSS PIR1,SSPIF GOTO $-1 BCF PIR1,SSPIF RETURN ;---------------------------------------- EXITINT MOVFW SYS_PSAV MOVWF PCLATH SWAPF SYS_SSAV,W ; Register zurück MOVWF STATUS SWAPF SYS_WSAV,F SWAPF SYS_WSAV,W RETFIE