I can successfully get CCP1 to work and display the measured period on an LCD using Timer 1, but adding CCP2 using Timer 3 does not work. It never interrupts and jumps to CCP2_INT. Pretty sure this has something to do with setting up 2 priority interrupts, but haven't found the problem. Anyone have some insight?
Code:'PIC18F4620 CCP1 & CCP2 test OSCCON=%01110000 ' SET TO 8 MHZ internal oscillator DEFINE OSC 08 ' 8MHZ clock speed DEFINE INTHAND CCP_INT ' Declare high-pri interrupt handler ADCON1 = 15 ' All digital CMCON = 7 ' Turns off comparators define LCD_COMMANDUS 1500 ' set command delay in us define LCD_DATAUS 50 ' set data delay in us define LCD_DREG PORTD ' set LCD data port define LCD_DBIT 4 ' set LCD starting data bit define LCD_RSREG PORTD ' define RS port define LCD_RSBIT 2 ' define RS bit define LCD_EREG PORTD ' set LCD ENABLE port define LCD_EBIT 3 ' set LCD ENABLE bit define LCD_BITS 4 ' set LCD bits 4 or 8 define LCD_LINES 2 ' set # of LCD rows 2 or 4 '******************************************************************************* '************************** V A R S / C O N S ******************************** '******************************************************************************* 'CCP1 INTERRUPT 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 Period var word 'CCP2 INTERRUPT Symbol Capture2 = PIR2.2 ' CCP2 capture flag SYMBOL CapIE2 = PIE2.2 ' CCP2 interrupt enable bit SYMBOL CapPriEn2 = IPR2.2 ' priority enable bit for CCP2 interrupt SYMBOL PriEnable2 = RCON.7 ' set to enable priority levels on interrupts _T2 VAR WORD BANKA SYSTEM ' 1st capture value PW2 VAR WORD BANKA SYSTEM ' 2nd capture value & ultimately final pulse width CF2 VAR BYTE BANKA SYSTEM ' indicates when last capture is ready Period2 var word 'CONFIGURE DISPLAY pause 100 ln1 con $80 ln2 con $C0 CS con 1 pause 500 LCDOUT $FE,CS CLEAR ' clear RAM on POR TRISC.2 = 1 ' CCP1 input pin (Capture1 input on 18F4620) TRISC.1 = 1 ' CCP2 input pin (Capture2 input on 18F4620) INTCON = 0 ' Interrupts off for now pause 1000 'add bootup delay to allow things to settle GOTO start '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 ASM CCP2_INT BTFSS CCP2CON,0 ; capture from rising edge? BRA Fall ; no .. goto falling edge MOVFF CCPR2L, _T2 ; get low capture byte into _T1 MOVFF CCPR2H, _T2+1 ; get high capture byte into _T1 BRA IntExit ; outta here Fall2 MOVFF CCPR2L, PW2 ; get low capture byte into PW MOVFF CCPR2H, PW2+1 ; get high capture byte into PW BSF CF2,0 ; indicate last capture IntExit2 BTG CCP2CON,0 ; toggle between rising/falling edge captures BCF PIR2,2 ; clear capture interrupt flag bit RETFIE FAST ; return/restore W, STATUS and BSR ENDASM start: '******************** CCP1 / Timer 1 ******************** CCP1CON = %00000111 'Capture mode, capture on 16th rising edge T1CON.7=1 'Enable timer 16 bit ` T1CON.6=1 'Timer1 OSC T1CON.5=1 '1:8 prescaler T1CON.4=1 '1:8 prescaler T1CON.3=0 'Timer1 OSC off T1CON.2=0 'sychro clock T1CON.1=0 'Internal clock 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 '******************** CCP2 / Timer 3 ******************** CCP2CON = %00000111 'Capture mode, capture on 16th rising edge T3CON.7=1 'Enable timer 16 bit ` T3CON.6=1 'Timer1 OSC T3CON.5=1 '1:8 prescaler T3CON.4=1 '1:8 prescaler T3CON.3=0 'Timer 3 source T3CON.2=0 'sychro clock T3CON.1=0 'Internal clock TMR3H = 0 'Clear high byte of TMR1 counter TMR3L = 0 'Clear low byte PriEnable2 = 1 'Enable priority levels on interrupts Capture2 = 0 'Clear capture flag bit CapPriEn2 = 1 'Set CCP1 int to high priority CapIE2 = 1 'Enable the CCP1 capture interrupt INTCON = %11000000 'Global + peripheral ints enabled T3CON.0 = 1 'Turn TMR1 on here goto main '******************************************************************************* '********************** S U B R O U T I N E S ********************************** '******************************************************************************* getCCP1: IF CF.0 THEN ' figure out & print result only after last capture period = PW-_T1 CF.0 = 0 ' clear flag bit ENDIF return getCCP2: IF CF2.0 THEN ' figure out & print result only after last capture period2 = PW2-_T2 CF2.0 = 0 ' clear flag bit ENDIF return '******************************************************************************* '********************** M A I N L O O P ************************************* '******************************************************************************* main: gosub getCCP1 lcdout $fe, ln1, "#1 = ", dec period, " " gosub getCCP2 lcdout $fe, ln2, "#2 = ", dec period2, " " goto main end




Bookmarks