logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ARM ADuC7026 - problem z przerwaniem IRQ od timera 0, IAR, Wiggler, H-Jtag

wladziu22 25 Lut 2008 11:57 1531 1
REKLAMA
  • #1 4843765
    wladziu22
    Poziom 17  
    Posty: 335
    Pomógł: 8
    Ocena: 56
    cześć chłopcy i dziewczęta :)

    Od jakowegoś czasu próbuje rozgryźć przerwania w procku ADUc7026 korzystając z IAR System , Wigglera i H-Jtaga. Wszystko skonfigurowane wg opisu na stronie:
    http://www.hjtag.com/download/USER%20MANUAL%20(EN).pdf

    W związku, ze korzystam z ARMa z firmy Analog Device nie mam możliwości flashowania pamięci wiec ożywając plik startowy dostępny z examplow IARa programuje tylko i wyłącznie RAM i podpinam go pod IARa i doadaje to programu.

    Próba generalna powiodła się pomyślenie i przykładowy programik z migającymi diodkami działa wyśmienicie.
    Gorzej jest gdy chce wywołać przerwanie IRQ od timera 0. Bity ustawiają się, w pracy krokowej widać ze licznik zmniejsza wartość (T0VAL) osiągając 0 skacze gdzieś sobie w "pizdu" i muszę resetować procka. Nawet jak dam w wektorze przerwań komendę: T0CLRI = 0; nie widać efektów zatrzymania przerwania.
    Zapewne robie coś źle .. stad prośba do tych co się tym również interesują o jakiekolwiek wskazówki.
    Poniżej mój prosty kod z przerwaniem:

    #define <aduc7026.h>

    void fnInterrupt_T0(void)
    {
    if ((IRQSTA & RTOS_TIMER_BIT) != 0) // Timer1 IRQ?
    {
    T0CLRI = 0; // Clear Timer IRQ

    /* ......

    diody i takie tam do testow
    .......
    */

    }
    return ;
    }


    //=====================================================================================
    void fnTimer_T0_Set(void)
    {
    REMAP = 0x01; // inicjalizacja mapy pamieci RAMu
    T0CON = 0xC8 // Enable, presk256, periodic (0x88 dla free-runing)
    IRQ = fnInterrupt_T0; // Specify Interrupt Service Rountine
    }
    //======================================================================================
    void fnTimer_T0_En(void)
    {
    IRQEN = RTOS_TIMER_BIT; // Enable Timer0 IRQ (2bit)
    T0LD = 0x40; //0,5 sek przy presk.=256
    }
    //======================================================================================
    void main(void)
    {
    fnTimer_T0_Set();
    fnTimer_T0_En();

    while(1)
    {
    GP4DAT = x; // <- wartisc x z przerwania ..malowazne
    }
    }
  • REKLAMA
  • #2 4846857
    wladziu22
    Poziom 17  
    Posty: 335
    Pomógł: 8
    Ocena: 56
    widze ze niewiele osob interesuje sie ARMami ADi...
    Wczoraj sprobowalem jeszcze uruchomic program dostepny na stronie Analog Devices:

    #include<ADuC7026.h>

    void My_IRQ_Function(void);

    int main (void) {
    REMAP=1; //inicjacja mapy pamięci RAM


    T1LD = 0x20000; // Counter Value
    T1CON = 0xC4; // Enabled,Periodic,Binary and CLK/16
    IRQ = My_IRQ_Function; // Specify Interrupt Service Rountine
    IRQEN = GP_TIMER_BIT; // Enable Timer1 IRQ

    GP4DAT = 0x04000000; // P4.2 configured as an output. LED is turned on

    while (1)
    {
    }
    }

    /********************************************************************/
    /* */
    /* Interrupt Service Rountine */
    /* */
    /********************************************************************/

    void My_IRQ_Function()
    {
    if ((IRQSTA & GP_TIMER_BIT) != 0) // Timer1 IRQ?
    {
    GP4DAT ^= 0x00040000; // Complement P4.2
    T1CLRI = 0; // Clear Timer IRQ
    }
    return ;
    }


    Jednakże efekt był podobny do poprzedniego. Dodam ze w trybie symulacji licznik nie zlicza ...T1VAL jak i T0VAL było 0 ... dziwne jak dla mnie bo powinno działać.
    Może teraz komuś coś do głowy przyjdzie bo mnie już ręce opadają..
REKLAMA