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