Dear Néstor,

> your answer is very appreciated. I have refactored the code as you
> told, I put all the global variables in a header file, called
> "defs.h". I have also taken out all the calls to functions from the
> interrupt. Now, interrupt handler routine is a lot simpler. Just one
> thing: I haven't been able to disable the interrupt and save the stack
> with the code you gave me. Apparently, it should work, since I'm using
> a PIC 16F877, which seems to have 16 stack bytes. Am I missing
> something from your explanation?


What do you mean with you "haven't been able to disable interrupts and
save the stack" --- could you do either but not both, or none? How did
you find out that you did not succeed in performing the task?!?

Do you get compile time errors?
Run-time errors?
What precisely are the symptoms/error indications?



To make stack saving a bit more efficient, this afternoon I tried
(something like)

static void
Intr(void) __interrupt(0)
{
   char int_status;
   char int_stack[16];
   __data char *src;
   __data char *dst;
   unsigned char u;

   // disable interrupts (same as the macro)
   int_status = INTCON & 0xC0;
   INTCON &= 0x3F; // GIE = PIE = 0;

   // save pseudo stack
   src = (__data char *)0x70; // &STK00
   dst = &int_stack[0];
   for (u = 0; u < 16; u++)
   {
     *dst++ = *src++;
   }

   // handle timer interrupt
   if (T0IF)
   {
     T0IF = 0; // re-arm for next interrupt
     // --- more handler code ---
   }

end:
   // restore stack
   src = &int_stack[0];
   dst = (__data char *)0x70; // &STK00
   for (u = 0; u < 16; u++)
   {
     *dst++ = *src++;
   }

   // restore/re-enable interrupts
   INTCON |= int_status; // restore GIE and PIE
}

... and the .asm looks good (did not test on real hardware, though).

No meddling with GIE/PIE or T0IF/T0IE should be required in the
interrupt handler iff INTCON is masked and restored as shown.
Of course, you will have to enable GIE/PIE and T0IE at some point
in your program to enter the interrupt handler, but this seems to
be done in the menu handling code (if I recall correctly).

Rather puzzled,
Raphael

------------------------------------------------------------------------------
The NEW KODAK i700 Series Scanners deliver under ANY circumstances! Your
production scanning environment may not be a perfect world - but thanks to
Kodak, there's a perfect scanner to get the job done! With the NEW KODAK i700
Series Scanner you'll get full speed at 300 dpi even with all image 
processing features enabled. http://p.sf.net/sfu/kodak-com
_______________________________________________
Sdcc-user mailing list
Sdcc-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sdcc-user

Reply via email to