View previous topic :: View next topic |
Author |
Message |
jumanji
Joined: 09 Jun 2011 Posts: 13
|
help - can't get CCP interrupt to fire (SOLVED) |
Posted: Thu Jun 09, 2011 5:07 pm |
|
|
Ok so I have never used interrupts before and I am trying to use the CCP on a 12F615 to determine the width of a pulse. I have looked at examples and tried many different things but I cannot seem to get the interrupt routine to ever run. I put a breakpoint at the top of the interrupt routine and it never gets there. I have a scope probe on the CCP pin and it is getting a valid pulse every 20ms that is about 1ms wide. Here is my code:
Code: |
#include "12F615.h"
#fuses INTRC_IO,NOWDT,MCLR
#use delay(clock=8000000)
#bit INTF_BIT = 0x0B.1
#define Zero_Cross PIN_A0
#define Fire_Triac PIN_A5
#define PWM_In PIN_A1
// FUNCTION Prototypes
void main(void);
int16 GetRC_PulseWidth(void);
int16 PWMValue;
int16 DutyCycle;
unsigned int16 TriacDelayPeriod;
long rise,fall,pulse_width;
int edgeflag,nop;
//************************************************************************************
//************ Main ****************************************************************
//************************************************************************************
#int_ccp1
void isr()
{
if (edgeflag==1)
{
rise = CCP_1;
setup_ccp1(CCP_CAPTURE_FE); // now configure CCP1 to capture falling
edgeflag=0;
}
else
{
fall = CCP_1;
setup_ccp1(CCP_CAPTURE_RE); // now configure CCP1 to capture rising
PWMValue = fall - rise;
edgeflag=1;
}
}
void main ( )
{
int16 i;
set_tris_a(0x0f);
PWMValue = 182;
fall=0;
rise=0;
edgeflag=1;
SETUP_ADC(No_Analogs),
setup_ccp1(CCP_CAPTURE_RE); // Configure CCP1 to capture rise
setup_timer_1(T1_INTERNAL); // Start timer 1
enable_interrupts(INT_CCP1); // Setup interrupt on falling edge
enable_interrupts(GLOBAL);
nop=1;
do {
if (PWMValue >100)
{
//do something
}
else
{
// do something else
}
}while (1);
|
Last edited by jumanji on Mon Jun 13, 2011 1:22 pm; edited 1 time in total |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Jun 09, 2011 5:24 pm |
|
|
What's the Vdd voltage of the PIC and what are the voltage levels of
the waveform going to the CCP1 pin ?
And what's your compiler version ? |
|
|
jumanji
Joined: 09 Jun 2011 Posts: 13
|
|
Posted: Thu Jun 09, 2011 5:25 pm |
|
|
Vdd = 5V and the pulse is 5V. |
|
|
jumanji
Joined: 09 Jun 2011 Posts: 13
|
|
Posted: Thu Jun 09, 2011 5:28 pm |
|
|
sorry - compiler is v4.121 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
jumanji
Joined: 09 Jun 2011 Posts: 13
|
|
Posted: Fri Jun 10, 2011 6:22 am |
|
|
ok-I tried that but it doesn't make any difference.
I don't know if it makes any difference, but I should mention that I am using the header board that plugs into the debugger (ICD3) and allows you to debug with the 12F615 and not give up the use of the 2 pins needed for programming. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jun 10, 2011 4:11 pm |
|
|
I don't have a 12F615. I do have 12F683 and it's similar. I made the
following test program to blink an LED if I get a CCP1 interrupt when I
press a switch. It works. I get a short blink on the LED every time I
push down the switch. This was tested with vs. 4.121.
Here's the switch circuit:
Code: |
+5v
|
<
> 10K
< ___ Switch
To PIC | _|_|_
pin 5 --------------o o------
(GP2) |
--- GND
-
|
Here is the LED circuit. You can also use 330 or 470 ohms for the resistor.
Code: |
To PIC
pin 2 220 ohms LED
(GP5) ---/\/\/\/------->|----
|
|
----- Ground
---
-
|
Here's the test program.
Code: |
#include <12F683.H>
#fuses INTRC_IO, NOWDT, BROWNOUT, PUT, NOMCLR
#use delay(clock=4M)
#int_ccp1
void ccp1_isr(void)
{
output_high(PIN_A5);
delay_ms(200); // Do a short blink on the LED
output_low(PIN_A5);
}
#define set_options(value) {#ASM \
MOVLW value \
OPTION \
#ENDASM}
//===================================
void main()
{
set_options(0xC0);
setup_ccp1(CCP_CAPTURE_RE);
clear_interrupt(INT_CCP1);
enable_interrupts(INT_CCP1);
enable_interrupts(GLOBAL);
while(1);
} |
|
|
|
jumanji
Joined: 09 Jun 2011 Posts: 13
|
|
Posted: Fri Jun 10, 2011 4:56 pm |
|
|
Thank you for going through the trouble to do this. What hardware are you using to test this? Are you using a debugger or actually programming a device? I have continued to work with this and I have discovered that if I run my code on the simulator that it works - but using the ICD3 and the header board the INTF bit gets set as soon as I enable the interrupts and I am unable to clear it and it never jumps to the isr routine. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Jun 10, 2011 5:03 pm |
|
|
I used a 3M solderless breadboard. I plugged wires and components into
it to make the circuits. I used a PicKit2 programmer to program the PIC
and to supply power to the board. I compiled and programmed the code
in "Release" mode in MPLAB. I just ran it in "standalone" mode, not in
debug mode. |
|
|
jumanji
Joined: 09 Jun 2011 Posts: 13
|
|
Posted: Fri Jun 10, 2011 5:36 pm |
|
|
I am convinced the problem is not the code but somewhere in my debugger setup. I have contacted Microchp to see if this is a known issue. In the meantime I will program an actual device and verify that it is working without the debugger. Thanks again for your help on this. |
|
|
jumanji
Joined: 09 Jun 2011 Posts: 13
|
|
Posted: Fri Jun 10, 2011 6:07 pm |
|
|
ok- just programmed a device and added some code to pulse a pin if I go thru the isr routine and it is working fine. There is definitely something wrong within the debugger system somewhere.... |
|
|
jumanji
Joined: 09 Jun 2011 Posts: 13
|
|
Posted: Mon Jun 13, 2011 1:22 pm |
|
|
Just got a nice email from Microchip. Apparently if you dig into the "limitations" section of MPLAB for this family of devices you find this note: "ECCP capture mode interrupts do not occur when emulating the PIC12F615 and PIC12F617 devices".
Bloody hell. |
|
|
|