|
|
View previous topic :: View next topic |
Author |
Message |
spear Guest
|
Interrupt problem |
Posted: Mon Aug 25, 2008 1:33 am |
|
|
Dear Sir/Madam
I use ccs c pic c compiler in my office. I have a problem with rs232
interrupt modules. I attached my code at the end of the mail. In my
code, in spite of disable the rs232 interrupts, interrupts are working.
I cannot solve this problem, would you help me ? It is important.
Code: |
#int_rda
void isr(void)
{
disable_interrupts(GLOBAL);
disable_interrupts(int_rda);
data = getc();
if(data=='!'|| data=='u' )
{
output_toggle(PIN_A3);
a=0;
while(a<71)
{
while(goster<15)
{
output_d(a);
output_b(0x05);
Delay_us(1000);
a=a+1;
output_d(a);
output_b(0x2A);
Delay_us(1000);
a=a+1;
output_d(a);
output_b(0x5C);
Delay_us(1000);
a=a+1;
output_d(a);
output_b(0x2A);
Delay_us(1000);
a=a+1;
output_d(a);
output_b(0x05);
Delay_us(1000);
a=a-4;
goster=goster+1;
}
goster = 0;
a=a+1;
}
a=0;
}
enable_interrupts(GLOBAL);
enable_interrupts(int_rda);
}
|
|
|
|
Ttemah Guest
|
|
Posted: Mon Aug 25, 2008 9:37 am |
|
|
First, _never_ enable the global interrupt inside an interrupt event. This is an absolute 'no no' on the PIC. The PIC has _hardware_that disables the global interrupt when interrupt events are called, and re-enables it, when they exit, _after the exit occurs_. If you re-enable interrupts _inside_ the handler, an interrupt can interrupt itself. Since the PIC does not support 're-entrancy' (where a routine calls itself), this potentially leads to disaster.
You can completely remove the code to enable/disable the interrupts.
Second, 'think again', about having such huge delays inside the interrupt handler. The PIC, has a grand total of just two characters of serial buffering (except for a few of the latter models with more). If your baud rate is (say) 9600bps, a character can arrive every 1.04mSec. With a delay of 1Sec inside the interrupt handler, you could potentially miss nearly 1000 characters.... Either set a flag, to say that you want the toggle and delay, and do this in the main code, or use a hardware timer, with it's own interrupt to handle this. A glance at the code, suggests the routine can actually take up to about a second to complete. Ouch. If you generate a hardware timer interrupt at 1mSec intervals, and have this walk through the five required output toggles, and the number of loops required, your hardware can carry on handling the RS232 when needed.
Third, make sure you have the keyword 'errors' in your RS232 definition. Without this, the serial hardware, will go into a 'hung' state, if even one character is not handled.
Best Wishes |
|
|
|
|
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
|