|
|
View previous topic :: View next topic |
Author |
Message |
wojc0008
Joined: 13 Mar 2004 Posts: 7
|
16F684 and capture interrupt |
Posted: Fri Nov 26, 2004 3:10 pm |
|
|
I have been using the CCP_1 interrupt to cature data on a 16F876 with no problems. Now when I use the same code, compiled for the 16F684, the interrrupt will never trigger. There is definitely data on the CCP input pin. Has anyone run into this problem? My test code is below. Thanks for your help!
CCS PCM version 3.190
Code: | #include <16F684.h>
#use delay(clock=4000000)
#fuses INTRC_IO, NOWDT, PUT, NOPROTECT, NOMCLR, NOBROWNOUT
long pulse_width;
#int_CCP1
CCP1_isr()
{
pulse_width = get_timer1();
set_timer1(0); //reset timer on every edge change
}
void main()
{
setup_oscillator(OSC_4MHZ | OSC_INTRC);
set_tris_c (0xFF); //set all as inputs
setup_timer_2(T2_DIV_BY_16,78, 16);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_ccp1(CCP_CAPTURE_RE); //switch to rising edge
enable_interrupts(GLOBAL);
enable_interrupts(INT_CCP1);
while(1)
{
}
} |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Nov 26, 2004 3:54 pm |
|
|
The problem is that the following line of code is not
being compiled correctly by your version of the compiler.
Code: | setup_ccp1(CCP_CAPTURE_RE); //switch to rising edge |
The compiler is writing to the wrong register address.
Below, I have modified your original program with a new routine
to hopefully setup the CCP correctly. The changes are shown
in bold.
#include <16F684.h>
#use delay(clock=4000000)
#fuses INTRC_IO, NOWDT, PUT, NOPROTECT, NOMCLR, NOBROWNOUT
long pulse_width;
#byte CCP1CON = 0x15
#byte PWM1CON = 0x16
#byte ECCPAS = 0x17
//------------------
#int_CCP1
CCP1_isr()
{
pulse_width = get_timer1();
set_timer1(0); //reset timer on every edge change
}
//------------------
// This routine attempts to copy how CCS sets up the CCP
// in later versions of the compiler.
void my_setup_ccp1(int8 value)
{
output_float(PIN_C5);
CCP1CON = 0;
CCP1CON = value;
PWM1CON = 0;
ECCPAS = 0;
}
//==================
void main()
{
setup_oscillator(OSC_4MHZ | OSC_INTRC);
set_tris_c (0xFF); //set all as inputs
setup_timer_2(T2_DIV_BY_16,78, 16);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
// setup_ccp1(CCP_CAPTURE_RE); // Comment out this line.
my_setup_ccp1(CCP_CAPTURE_RE); // Use this routine instead.
enable_interrupts(GLOBAL);
enable_interrupts(INT_CCP1);
while(1)
{
}
} |
|
|
wojc0008
Joined: 13 Mar 2004 Posts: 7
|
Correct! |
Posted: Fri Nov 26, 2004 4:21 pm |
|
|
Thanks so much. I've been trying to figure it out and actually bought the ICD2 header for the 16f684 (which I guess I don't need now!).
Thanks so much. The interrupt works great now! |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|