That's a great start Ken!
INT_ENABLE is a Darrel Taylor command for his DT_INTS. This is the same as enabling, or disabling a certain interrupt. To set up CCP interrupts, you first add a line like my code had:
Code:
INT_Handler CCP1_INT, PWMeasure, ASM, yes
Then enable it:
@ INT_ENABLE CCP1_INT
But you will also have to configure it. Make portc.2 an input. And configure your CCP1
CCP1CON = %00000101 ;capture every rising edge
Now I used Chuck's code to do the capture. It needs the sub16.inc include file to be included, and we will need some variables like
Code:
risetime var word ;used for pulse width measure start of pw
falltime var word ;time at end of pulse width
falltime_l var falltime.byte0
falltime_h var falltime.byte1
risetime_l var risetime.byte0
risetime_h var risetime.byte1
Code:
asm
PWMeasure
BTFSS CCP1CON, CCP1M0 ; Check for falling edge watch
GOTO FALL_EDGE ; Go pick up the falling edge
MOVF CCPR1L,W ; else store leading edge value
MOVWF _risetime_l ; into 16 bit word risetime
MOVF CCPR1H,W
MOVWF _risetime_h
BCF CCP1CON, CCP1M0 ; Now capture the trailing edge
GOTO ISR_2 ; Exit the interrupt service routine
FALL_EDGE:
BSF CCP1CON, CCP1M0 ; Re-set for trailing edge capture
MOVF CCPR1L,W ; Store the captured value into
MOVWF _falltime_l ; falltime_l and ...
MOVF CCPR1H,W
MOVWF _falltime_h ; ... falltime_h
;
; 16 bit subtract
; falltime = falltime - risetime
;
SUB16 _falltime, _risetime
ISR_2
INT_RETURN
endasm
Now, if you read the data sheet, you see in 11.1 Table 11-1 that capture mode uses timer1. So you will have to set this. Looks like it may be same settings as I have in T1CON. This will also start the timer. It runs continuously, and we don't care about interrupts on T1. We just want to read the timer at interrupt high edge of CCP1, and read timer on low edge of pulse. Then we should have a value present at falltime, representing the length of the pulse.
Bookmarks