This should work;
Code:
' Measuring signal pulse widths with capture module & interrupt
' Procedure for high-going pulse:
' 1. Configure CCP to capture on rising edge
' 2. Setup Timer1 so it will not overflow during max pulse width time
' 3. Enable ccp capture
' 4. Once capture flag bit is set, save captured value as T1
' 5. Reconfigure CCP to capture on falling edge
' 6. On 2nd capture, save 2nd value as PW
' 7. Subtract T1 from PW for the pulse width value
DEFINE OSC 4 ' 4MHz for 1uS resolution TMR1 counts
DEFINE INTHAND CCP_INT ' declare high-pri interrupt handler
Symbol Capture = PIR1.2 ' CCP1 capture flag
SYMBOL CapIE = PIE1.2 ' CCP1 interrupt enable bit
SYMBOL CapPriEn = IPR1.2 ' priority enable bit for CCP1 interrupt
SYMBOL PriEnable = RCON.7 ' set to enable priority levels on interrupts
T1 VAR WORD BANKA SYSTEM ' 1st capture value
PW VAR WORD BANKA SYSTEM ' 2nd capture value & ultimately final pulse width
CF VAR BYTE BANKA SYSTEM ' indicates when last capture is ready
CLEAR ' clear RAM on POR
TRISC.2 = 1 ' CCP1 input pin (Capture input on 18F242)
INTCON = 0 ' Interrupts off for now
GOTO Init ' jump over interrupt handler
ASM
CCP_INT
BTFSS CCP1CON,0 ; capture from rising edge?
BRA Fall ; no .. goto falling edge
MOVFF CCPR1L, T1 ; get low capture byte into T1
MOVFF CCPR1H, T1+1 ; get high capture byte into T1
BRA IntExit ; outta here
Fall
MOVFF CCPR1L, PW ; get low capture byte into PW
MOVFF CCPR1H, PW+1 ; get high capture byte into PW
BSF CF,0 ; indicate last capture
IntExit
BTG CCP1CON,0 ; toggle between rising/falling edge captures
BCF PIR1,2 ; clear capture interrupt flag bit
RETFIE FAST ; return/restore W, STATUS and BSR
ENDASM
Init: ' initialize a few things first
CCP1CON = %00000101 ' Capture mode, capture on rising edge
T1CON = 0 ' TMR1 prescale=1, clock=Fosc/4, TMR1=off
TMR1H = 0 ' Clear high byte of TMR1 counter
TMR1L = 0 ' Clear low byte
PriEnable = 1 ' enable priority levels on interrupts
Capture = 0 ' clear capture flag bit
CapPriEn = 1 ' set CCP1 int to high priority
CapIE = 1 ' enable the CCP1 capture interrupt
INTCON = %11000000 ' global + peripheral ints enabled
T1CON.0 = 1 ' Turn TMR1 on here
Main:
' do other stuff here as required
IF CF.0 THEN ' figure out & print result only after last capture
PW = PW-T1 ' High pulse width = PW-T1
CF.0 = 0 ' clear flag bit
HSEROUT [DEC PW,"uS High",13,10]
ENDIF
GOTO Main
END
Bookmarks