This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Fast External Interrupt

I need to implement a fast external interrupt with a C167CR micro on a Phytec phyCORE-167 board.
At the moment, I have my external interrupt signal connected to pin P2.15
and program it as follows:

      EXICON = 0x4000;    // Set Ext Trigger Interrupt for rising edge
response
      CC15IC = 0x4c;              // Enables Ext Trigger Interrupt, Global
Level = Lowest, Priority Level = Medium
      IEN = 1 ;                         // Enable Interrupts

When an interrupt occurs, I then want to set another port pin which is done
within the interrupt handler, as shown below:
     void Boxcar_irq (void) interrupt CC15INT = 31
     {
         CC15IC = 0x0;                // Disable further interrupts
         EXTTRIG_GATE = 1;     // Sets pin P2.1 High

         return;
     }
This arrangment works, i.e. the interrupt is trapped and the port pin set
low, but the response time I am getting is 5.4uS.
I have measured this as the time from the rising edge of the external
trigger signal to the rising edge of P2.1.
I do not have any other interrupts running or enabled so I don't set this
interrupt to highest priority.

Can you suggest a way that I can improve the interrupt response time.
I would like to get below 1uS if possible.

My application program is approx 20kB in size and runs from external RAM using.

Any ideas?

Best Regards,
Kieran Dobbyn

Parents
  • If you're running 20Mhz, the external interrupt latency is still 200usec, I believe. Then the push of registers will use up more. You can speed it up by using a separate register bank for the interrupt, (see 'using' keyword)

    eg.
    void boxcar_irq( void ) interrupt CC15NT = 31 using rb_Boxcar { ... }
    
    This still requires a context save and switch but is faster than a lot of pushes. The best speed will be gotten by writing the whole thing in an assembly module so you can avoid saving anything, since nothing is destroyed.
    Best luck
    Scott

Reply
  • If you're running 20Mhz, the external interrupt latency is still 200usec, I believe. Then the push of registers will use up more. You can speed it up by using a separate register bank for the interrupt, (see 'using' keyword)

    eg.
    void boxcar_irq( void ) interrupt CC15NT = 31 using rb_Boxcar { ... }
    
    This still requires a context save and switch but is faster than a lot of pushes. The best speed will be gotten by writing the whole thing in an assembly module so you can avoid saving anything, since nothing is destroyed.
    Best luck
    Scott

Children
No data