2
votes

I'm trying to use the capture module on a PIC 16LF1827, but the ISR is never entered. I started with a basic falling-edge interrupt (worked), then added in the timer 1 configuration (still working), then disabled the IOC interrupt and configured/enabled the relevant CCP interrupt (ISR is never entered). The code is below: the commented section is the original basic IOC setup.

I've verified with the MPLab debugger that the ISR is not entered, and confirmed this by hooking it up to a logic analyzer and watching RB1.

#include "htc.h"

//config1
//internal osc, no wdt, use power-up timer, enable reset
//  no code protection, brown-out-reset enabled, clkout is gpio, 
//  internal-external switchover off, failsafe clock monitor off
__CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_ON 
  & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_ON 
  & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF);

//config2 (following MPLab's complaints when running debugger)
//low-voltage programming off, debug on, brown-out reset at 2.7 v
//  stack over/under flow triggers reset, no 4x pll, 
//  no flash write protection
__CONFIG(LVP_OFF & DEBUG_ON & BORV_27 
  & STVREN_ON & PLLEN_OFF & WRT_OFF);

void interrupt isr(void){
    //bounce pin 1
    LATB ^= 0b10;
    LATB ^= 0b10;
    if(IOCIF && IOCBF0){
        IOCBF0 = 0;
        IOCIF = 0; 
    }
    if (CCP1IF){
        CCP1IF = 0;
    }
}

void main(void){
    //configure internal oscillator: 
    //PLL = 0, source = from config 1, frequency = 4 mhz 
    //0b0: SPLLEN_OFF
    OSCCONbits.SPLLEN = 0b0;
    //0b00: use config word 1
    OSCCONbits.SCS = 0b00;
    //0b1101: 4 mhz frequency
    OSCCONbits.IRCF = 0b1101;

    //configure peripherals
    //PORT A: LEDs (output), digital
    TRISA = 0x00;
    ANSELA = 0;
    //PORT B: digital, 0 = input, 1 = output, rest don't care
    TRISB = 0b11111101;
    ANSELB = 0;

    //configure timer 1 (not needed for basic IOC)
    //source = instruction clock, prescale = 1:1, disable LP osc, do synchronize (DC)
    //0b00: instruction clock
    T1CONbits.TMR1CS = 0b00;
    //0b00: 1:1
    T1CONbits.T1CKPS = 0b00;
    //0b0: lp osc off
    T1OSCEN = 0b0;
    //0b0: synch (ignored)
    nT1SYNC = 0b0;

    //interrupts
    /*
    //IOC enabled on falling edge for port B 0
    IOCBN0 = 0b00000001;
    IOCIE = 1;
    */

    //Capture on falling edge for port B 0
    //notes in 23.1 of DS: disable interrupt, set operating mode, clear flag, enable interrupt
    CCP1IE = 0b0;
    //0b100: every falling edge
    CCP1CONbits.CCP1M = 0b100;
    CCP1IF = 0b0;
    CCP1IE = 0b1;
    //enable peripheral interrupts, global interrupts
    PEIE = 1;
    GIE = 1;

    //start timer 1
    TMR1ON = 1;
    while(1){
        //Toggle led 0
        LATA ^= 0b1;
    }
}

I'm using the HI-TECH C compiler (lite), running in MPLab.

Any suggestions would be greatly appreciated. My apologies if I butcher terminology, this is my first project on a PIC.

1
Doug, while StackOverflow is really good, be sure to mirror you question on the specialized PIC forums: HI-TECH forum forum.htsoft.com/all/postlist.php/Cat/0/Board/pic , Microchip forum microchip.com/forums .Nick Alexeev

1 Answers

1
votes

Your setting for TRISB1 is as an output. According to the datasheet, the capture pin needs to be configured as an input. For the GPIO pins, setting the TRIS bit a 0 is an output, 1 is for an input.

EDIT: Forgive the initial stupid answer as I didn't realize you were using PORTB1 as a GPIO indicator for your scope.

So initially you used PORTB0 as your capture pin correct (using IOC)? The capture module uses a different GPIO port for its input (PORTB3 for CCP1). Did you move the connection to PORTB3 for your capture source?

EDIT: After some more looking through the PIC datasheet I noticed that CCP1's GPIO pin can be moved from PORTB3 to PORTB0 but I don't see any reference to how you set the APFCON0.CCP1SEL bit. That would be something else to check.