LPC21xx to ADUC7026 how to setup Interups

nobody wrote on Wednesday, October 19, 2005:

i started yesterday porting FreeRTOS on ADUC7026, with KEIL LPC2129  Demo as startpoint. So i did the following changes in FreeRTOS\Demo\ARM7_LPC2129_Keil:

/********in FreeRTOSConfig.h **********/

change #include <lpc21xx.h>
to #include <aduc7026.h>
change  #define configTOTAL_HEAP_SIZE    ((size_t) 14812 )
to  #define configTOTAL_HEAP_SIZE        8192

#define configCPU_CLOCK_HZ            ( ( unsigned portLONG ) 45000000 )   

/***** In startup.s *******/

setup PLL Multiplier to 1 ;(No division of the core frequency)

/*******  in PartTest.c*****************************/

change IOSET0   to GP4SET and IOCLR1 to GP4CLR
( GP4CLR is connected to a LEd on the Evaluation board)

/*** ******** in MAIn in setupHardware() ********************/

setting up the ADC and the DAC.
Setting up the GPIO Port 4 as Output.

/********** in Port.c ***************/

prvSetupTimerInterrupt() in Source/portable/Keil/ARM7/port.c
configures the ADUC7026 timer 0 to generate the RTOS tick.

–Generating RTOS TICK:
    // timer0 configuration
    T0LD = 0xB020;
// 45088/45088000Hz = 1ms
    T0CON = 0xC0;// count down
// periodic mode enable time 0

Now My problem ist that ADUC7026 Doesnot use vectored Interrupt System. Please Could you have any idea, any reference , how i can setup my Interupts registers, so that FreeRTOS work in supervisor mode. Or simply suitably work?

ADUC7026 Interrupt System is described here at page 63


Here is the current source code of the funktion
static void prvSetupTimerInterrupt( void )
unsigned portLONG ulCompareMatch;

    // timer0 configuration
    T0LD = 0xB020;                    // 45088/45088000Hz = 1ms
    T0CON = 0xC0;                    // count down
                                    // periodic mode enable time 0

    /* Setup the VIC for the timer. */
    VICIntSelect &= ~( portTIMER_VIC_CHANNEL_BIT );
    VICIntEnable |= portTIMER_VIC_CHANNEL_BIT;
    /* The ISR installed depends on whether the preemptive or cooperative
    scheduler is being used. */
    #if configUSE_PREEMPTION == 1
            extern void ( vPreemptiveTick )( void ) __arm __task;
            extern void ( vPreemptiveTick )( void ) __task;

        VICVectAddr0 = ( unsigned portLONG ) vPreemptiveTick;
        extern void ( vNonPreemptiveTick )( void ) __irq;

/########## I have not changed the following code from FreeRTOS Demo #########
        VICVectAddr0 = ( portLONG ) vNonPreemptiveTick;


    /* Start the timer - interrupts are disabled when this function is called
    so it is okay to do this here. */

I will be very gratiffull for any Help.

nobody wrote on Thursday, October 20, 2005:

I have never used an ADUC7026, but from a quick glance at the rather minimal datasheet (link in previous post), it appears that there is a very simple interrupt system.  When you get an IRQ interrupt you just have to look at the interrupt bit mask to see the origin of the interrupt and branch to the correct handler.  There must be example on the AD WEB site of efficient ways of doing this?

As far as FreeRTOS goes there is not going to be much difference between this type of interrupt and an automatically vectored interrupt once you are in the handler itself.  The only difference is how you get to the handler.

I should try getting the periodic interrupt working first in the absence of FreeRTOS (the datasheet gives info on how to do this).  Then just hook up the RTOS tick routine to the interrupt once you know it is working correctly.  The syntax of how to write the routine will be the same as per the LPC Keil demo.  Just make sure that the method of jumping the the handler leaves the registers (link register, stack pointer) in tact and unmodified between the interrupt occurring and the ISR entry.

Can the Keil IDE simulate the ADUC devices?  If so this should make it simpler and Richard is normally quite good at having a look at your code.