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

Interrupting the interrupt

Hello,
i have a problem.
There are allways difficulties in programms with IRQ und FIQ. So i wrote this code to investigate where the problem is.

I use two Timer, Timer0 and Timer1 to generate interrupts.

Timer0 generates a periodic normal IRQ every 2000 cycles.

Inside the IRQ routine there is a for(i=80;i;i--) loop with port toggling. So i can watch on my 2-channel storage oszilloscope when this toggling is interrupted by the fast interrupt.

Timer1 generates a periodic fast interrupt FIQ every 1000 cycles.

I interprete the microcontroller datasheet that FIQ has the higher pririty and can interrupt IRQ. Am i right???

Unfortunaltely i can not post a oszilloscope screenshot in this forum.

So i try to describe the result:
On channel 1 there is a train of 40 pulses. Duration is about 33us. You can see, after pulse 31 there a little gap. This is the moment FIQ is started and returns to IRQ. Then the left 9 pulses are there. Than there is a low level for about 17us. This looks all the way i expected things to take place.

On channel 2 there is a port toggling every 25us.
Sometimes the port toggling is replaced by a single needle pulse.

Whats going on there. Unfortunaltely i have no idea where the problem occurs. I expanded FIQ-stack-size from 4 to 80. (startup.s)

//*************************************************************************
#include <ADuC7026.h>
//*************************************************************************
void Port_init(void);
void PLL_init(void);
void Timer_init(void);
void interrupt_init(void);
//*************************************************************************
int main (void)
{
        Port_init();
        PLL_init();
        Timer_init();
        interrupt_init();
        while(1)
        {
                GP4DAT ^= 0x00040000; // P4.2 toggling => program is in main loop
        }
}
//*************************************************************************
void IRQ_Handler()__irq __ram // Timer 0 => Interrupt
{
        unsigned int i;
        T0CLRI = 0;
        for(i=80;i;i--) GP4DAT ^= 0x00010000; // P4.0 shows's Interrupt
}
//*************************************************************************
void FIQ_Handler()__fiq __ram // Timer 1 => Fast Interrupt
{
        T1CLRI = 0;
        GP4DAT ^= 0x00020000; // P4.1 show's Fast Interrupt
}
//*************************************************************************
void interrupt_init(void)
{
        IRQEN = RTOS_TIMER_BIT;         // Timer 0 => Interrupt
    FIQEN = GP_TIMER_BIT;               // Timer 1 => Fast Interrupt
}
//*************************************************************************
void Timer_init(void)
{
        T0LD  = 2000 - 1;       // Timer 0 => periodic Interrupt 2000 cycles
    T1LD  = 1000 - 1;   // Timer 1 => periodic Fast Interrupt 1000 cycles
        T0CON = 0xC0;           // Enabled,Periodic,CLK/1
    T1CON = 0xC0;               // Enabled,Periodic,Binary and CLK/1
}
//*************************************************************************
void PLL_init(void)
{
    PLLKEY1 = 0xAA;
    PLLCON = 0x01;              // clear Bit5 OSEL => External 32.768kHz crystal
    PLLKEY2 = 0x55;
        while(~IRQSIG & PLL_LOCK_BIT){} // waiting for PLL lock
}
//*************************************************************************
void Port_init(void)
{
        GP4DAT |= 0x01000000; // P4.0 is output
        GP4DAT |= 0x02000000; // P4.1 is output
        GP4DAT |= 0x04000000; // P4.2 is output
}
//*************************************************************************

0