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

Strange Interrupt leads to Abort Mode

I've got a unexpected problem with Interrupts.
Would be nice to discuss it.

I use Timer0 to have about 16000 fast interrupts (FIQ) per second.
There is a AD-Conversation and a few lines of long long int aritmetic to compute. Inside this FIQ-routine there is a static counter. When it reaches 16000 it is reseted and a Software interrupt (SWI) is generated every second.

The SWI-routine has do to some computations and then to display it all on a special three wire conected display.

The programm does not work with 16000 Timer0 Interrupts per second.
It is terminated by Abort-Mode. This comes a little unexpected to my. The effect is gone if i turn down FIQ frequency downto 100Hz. Is it possible that interrupts create a stack overflow?

Should i post my code?

Parents
  • Here's the code:

    //*************************************************************************
    void FIQ_Handler()__fiq __ram
    {
            static long long unsigned int ACC1,ACC2,ACC3;
            static unsigned int int_counter;
    
            T0CLRI = 0;
            ADCCON = 0x6A3;                 // software conv., single-ended, conv. enabled
            while (!ADCSTA){}               // wait for end of conversion
    
            ACC1 += ADCDAT >> 16;
            ACC2 += ACC1;
            ACC3 += ACC2;
    
            if (!(int_counter++ & 0x3FFF)) // every 16384
            {
                    SWICFG = 2; // create a softwareinterrupt
                    ACC3_transfer = ACC3;
            }
    }
    //*************************************************************************
    void IRQ_Handler()__irq
    {
            static long long unsigned int ACC3D,D1,D2,D3,D1D,D2D;
            char text[10];
    
            D1 = ACC3_transfer - ACC3D;
            D2 = D1 - D1D;
            D3 = D2 - D2D;
            ACC3D = ACC3_transfer;
            D1D = D1;
            D2D = D2;
    
            sprintf(text,"%8.d",(D3 * 125) >> 27);
            SDA5708_printf(text);
            SWICFG = 0; // clear softwareinterrupt BIT
    }
    //*************************************************************************
    


    The sence of this floating average computation is to increase resolution of my 12 Bit AD-Conversation while distortions are decreased.
    YEAH it works properly with lower rates. But with higher rates, 16384 for example, my arm likes to have a vacation in abort mode. :-)

Reply
  • Here's the code:

    //*************************************************************************
    void FIQ_Handler()__fiq __ram
    {
            static long long unsigned int ACC1,ACC2,ACC3;
            static unsigned int int_counter;
    
            T0CLRI = 0;
            ADCCON = 0x6A3;                 // software conv., single-ended, conv. enabled
            while (!ADCSTA){}               // wait for end of conversion
    
            ACC1 += ADCDAT >> 16;
            ACC2 += ACC1;
            ACC3 += ACC2;
    
            if (!(int_counter++ & 0x3FFF)) // every 16384
            {
                    SWICFG = 2; // create a softwareinterrupt
                    ACC3_transfer = ACC3;
            }
    }
    //*************************************************************************
    void IRQ_Handler()__irq
    {
            static long long unsigned int ACC3D,D1,D2,D3,D1D,D2D;
            char text[10];
    
            D1 = ACC3_transfer - ACC3D;
            D2 = D1 - D1D;
            D3 = D2 - D2D;
            ACC3D = ACC3_transfer;
            D1D = D1;
            D2D = D2;
    
            sprintf(text,"%8.d",(D3 * 125) >> 27);
            SDA5708_printf(text);
            SWICFG = 0; // clear softwareinterrupt BIT
    }
    //*************************************************************************
    


    The sence of this floating average computation is to increase resolution of my 12 Bit AD-Conversation while distortions are decreased.
    YEAH it works properly with lower rates. But with higher rates, 16384 for example, my arm likes to have a vacation in abort mode. :-)

Children