|
|
View previous topic :: View next topic |
Author |
Message |
danielz85
Joined: 22 Sep 2012 Posts: 37
|
manual setting/clearing INTERRUPT BIT |
Posted: Wed Jan 02, 2013 7:48 am |
|
|
hi,
For timing accuracy, I wish to use TIMER2 interrupt flag in the main loop.
such that each time the interrupt is set, the mc performs some opertations, for instance print some value in this case...
However, it seems that the following simple code doesn't work. It prints non-stop the string even though it should roughly print it every second.
Can someone please tell me why?
Thanks
Code: | #include <16F1783.h>
#bit TIMER2IF=0x11.1
//#INCLUDE <stdlib.h>
#include "consts.c"
#fuses INTRC_IO, NOWDT, NOBROWNOUT, PUT,NOMCLR
#use delay(clock=1M)
#use rs232(baud=4800,xmit=pin_B7,rcv=pin_B6)
void main()
{
setup_timer_2(T2_DIV_BY_64,200,16);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
while (TRUE)
{
if (TIMER2IF==1)
{
TIMER2IF==0;
printf("abc");
}
}
}
|
|
|
|
asmallri
Joined: 12 Aug 2004 Posts: 1634 Location: Perth, Australia
|
|
Posted: Wed Jan 02, 2013 7:54 am |
|
|
You have enabled a timer 2 interrupt but do not have a timer 2 interrupt handler. You are using polled mode to interrogate timer 2 status - this is valid. Simply remove the two interrupt enable lines. _________________ Regards, Andrew
http://www.brushelectronics.com/software
Home of Ethernet, SD card and Encrypted Serial Bootloaders for PICs!! |
|
|
danielz85
Joined: 22 Sep 2012 Posts: 37
|
|
Posted: Wed Jan 02, 2013 8:07 am |
|
|
problem solved
thanks asmallri |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19515
|
|
Posted: Wed Jan 02, 2013 8:16 am |
|
|
Use:
Code: |
void main(void) {
setup_timer_2(T2_DIV_BY_64,200,16);
enable_interrupts(INT_TIMER2); //It is OK to enable this, but not
//necessary. It _is_ needed if (for instance), you want this to wake
//the chip
//enable_interrupts(GLOBAL); //You must not enable this without
//a handler
while (TRUE) {
if (interrupt_active(INT_TIMER2)) { //This tests the flag for you
clear_interrupts(INT_TIMER2); //This clears the interrupt
printf("abc");
}
}
}
|
The handler, is called, in the following situation:
Timer2 interrupt flag is set.
and Timer2 interrupt enable is set
and global interrupt enable is set.
If you do not have a handler present, you must ensure that all three of these do not happen. If they do, the code will call the non existent handler - crash......
Just leave the global flag off. You don't actually have to enable the individual interrupt for this test operation, but you _do_, if you want the interrupt to do other things (like wake the chip). Only 'enabled' interrupts will do this. Hence it is common practice to always enable any interrupt you are 'using'.
Best Wishes |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Wed Jan 02, 2013 10:51 am |
|
|
Code: | void main()
{
setup_timer_2(T2_DIV_BY_64,200,16);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
while (TRUE)
{
if (TIMER2IF==1)
{
TIMER2IF==0;
printf("abc");
}
}
}
| I would not expect the line preceeding your printf statement to have the effect of clearing the interrupt flag.
Hence the continuous printing.
Mike |
|
|
|
|
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
|