Code:
ASM
__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_ON & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
__CONFIG _CONFIG2, _WRT_OFF & _PLLEN_ON & _STVREN_OFF & _BORV_19 & _LVP_OFF
ENDASM
DEFINE OSC 32
TX VAR PORTA.0
SCL VAR PORTA.1
SDA VAR PORTA.2
SCLB VAR PORTAB.1
SDAB VAR PORTAB.2
SCLF VAR IOCAF.1
SDAF VAR IOCAF.2
BIT_COUNTER VAR BYTE
STOP_COUNTER VAR BYTE
BYTE_READY VAR BIT
BYTEINT VAR BYTE
BYTEINT2 VAR BYTE
BYTEINB VAR BYTE
BYTEIN VAR BYTE[30]
PORTAB VAR BYTE
BYTE_COUNTER VAR BYTE
BYTES_RECEIVED VAR BYTE
STOPFLAG VAR BIT
OSCCON = %01110000
IOCAN = %00000100
IOCAP = %00000110
ON INTERRUPT GoTo INT ' Declare interrupt handler routine
START:
PAUSE_1000
OPTION_REG.7 = 1 ' DISABLE PORTB PULLUPS
PORTA = %00000110 ' SWAP PORTA.0 /PORTA.2 FOR SMALL PCB
TRISA = %00001110 ' SWAP PORTA.0 /PORTA.2 FOR SMALL PCB
ANSELA = $00 ' MAKE ALL INPUTS DIGITAL I/O PINS
WPUA = $00
BIT_COUNTER = 0
BYTE_COUNTER = 0
INTCON = %10001000 ' Enable GLOBAL AND IOCHANGE interrupts
MAIN_LOOP:
IF STOPFLAG = 1 THEN
'/ Here we have the received bytes in the array BYTEIN(x)
' The size of the array is in the variable BYTES_RECEIVED.
' You have to process them and then ...
BYTE_COUNTER = 0 ' in order to get the next bytes
ENDIF
GOTO MAIN_LOOP
'============================================================================
'================ BIT BANGING interrupt handler ============================
'============================================================================
Disable ' Don't check for interrupts in this section
INT:
PORTAB = PORTA 'Buffer the STATUS OF THE PORT
'------------------------- ignore errory databits ------------------------
'using the I2CWRITE command of PBP i got an errory SDA pulse ...
'using the next line i ignore this error-y line ...
'for other uses you may ommit it .
IF SCLB = 0 THEN IOCAF = $00 : RESUME ' IGNORE WHEN CLK = 0
'-----------------------receive data bit -----------------------------------
if SCLF = 1 THEN 'CLK_FLAG SET : IT IS DATA !
'----------------------- store byte ----------------------------------------
IF BIT_COUNTER.3 = 1 THEN ' IF WE GET 8 BITS RESET BITCOUNTER
BIT_COUNTER.3 = 0
BYTEIN(BYTE_COUNTER) = BYTEINT ' AND STORE THE BYTE
BYTE_COUNTER = BYTE_COUNTER + 1
IOCAF.1 = 0 ' CLEAR INT ON CHANGE FLAGS
RESUME
ENDIF
' ------------------------- receive bit ------------------------------------
BYTEINT = (BYTEINT << 1)
BYTEINT.0 = PORTAB.2
BIT_COUNTER = BIT_COUNTER + 1
IOCAF.1 = 0 ' CLEAR INT ON CHANGE FLAGS
RESUME
ENDIF
' --------------------start bit-----------------------------------------------
IF SDAB = 0 THEN
BIT_COUNTER = 0
IOCAF.2 = 0 ' CLEAR INT ON CHANGE FLAGS
RESUME
ENDIF
'---------------------stop bit ----------------------------------------------
STOPFLAG = 1
BYTES_RECEIVED = BYTE_COUNTER
'BYTE_COUNTER = 0 'nevermind BYTECOUNTER WILL RESET AT THE NEXT START BIT ANYWAY
IOCAF.2 = 0 ' CLEAR INT ON CHANGE FLAGS
RESUME
ENABLE
End
Bookmarks