Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STR912][C/OpenOCD] Dziwnie działające WIU

DwuArm 02 Wrz 2009 11:06 768 2
  • #1 02 Wrz 2009 11:06
    DwuArm
    Poziom 9  

    Witam,
    Chciałbym uzyskać następujący efekt: Wyświetlać na GPIO8 stan GPIO6. Porty GPIO6 i GPIO8 są ustawione. Do GPIO6 podłączone są SW a do GPIO8 diody. Obsługa GPIO6 ma odbywać się przez przerwanie typu wektoryzowane IRQ. Ja ustawiam przerwanie Vic1.9.
    Chciałbym w obsłudze przerwania czytać WIU->PR i według tego reagować (wywoływać dalszy kod)

    Oto mój kod ustawiający urządzenia (fragment):

    Code:

    #define VIC1_WIU0 (1<<9)
    SCU->PRR1 |= __WIU; //Reset
        SCU->PCGR1 |= __WIU;//Clock
       
        WIU->MR = 0x00020000;   //tylko z portu 'IOPort6'
        WIU->TR = 0x00000000;   //0->Falling Edge, 1->Rising Edge
       
        WIU->CTRL = 0x2; //WIU Interrupts Enable
        //SCU->WKUPSEL = WKUPSEL_EXTINT;
       
        SCU->PCGR0 |= __VIC; //Clock
        SCU->PRR0 &= ~__VIC; //Reset
        SCU->PRR0 |= __VIC;
       
        //Do wektora podstaw adres procedury obslugi
        VIC1->VAiR[9] = (unsigned long)irqIntHandler;
        //Ustaw slot na przerwanie od WIUOC
        VIC1->VCiR[9] = 0x29;
       
        //Zakwalifikuj przerwanie WIU jako IRQ
        VIC1->INTSR |= ~VIC1_WIU0;//0->IRQ, 1->FIQ
        VIC1->INTSR = 0x0;
        //Vic interrupt enable register
        VIC1->INTER = 0x200;


    A to kod obsługi (nie optymalny-testowy):
    Code:

    unsigned int rejestr = 0 ;
        unsigned char zm = 0;
        //Licznik przerwan
        //Przepisz kto zglosil do ledow
           
        rejestr = WIU->PR;
        zm = (16>>rejestr);
        GPIO8->DR[0xff<<2] = zm;
        //Kasuj zrodlo przerwan
        WIU->PR = 0xffffffff;
        //Koniec przerwania
        VIC1->VAR = 0;


    Problem to maska WIU->MR. Zachowuje się w następujący sposób:
    maska[23:16]:Opis reakcji GPIO6
    00:Nie Działają SW. (i to jest akurat dobrze )
    01:Działają SW na P6[0:1](a powinien P60)
    02:Działają SW na P6[0:1](a powinien P61)
    04:Działają SW na P6[2:3](itd)
    08:Działają SW na P6[2:3]
    0A:Działają SW na P6[0:3]
    0E:Działają SW na P6[0:3]
    Nie potrafię ustawić tak maski by działały wybrane SW. Każdy SW jest podłączony osobno, naciśnięcie go powoduje stan niski na wejściu GPIO6.

    Z góry dziękuję za wskazówki.
    Pozdrawiam Tomasz

    0 2
  • #2 02 Wrz 2009 13:40
    flapo213
    Poziom 21  

    Witaj.

    Kolego prawdopodobnie pomyłka jest przy przesuwaniu. Niestety nie jest to za szczęśliwie wykonane przez st-ka. Ja przerzucę w domu conieco kodu to może znajdę interesującą Cię część.

    Pozdrawiam

    0
  • #3 02 Wrz 2009 13:55
    DwuArm
    Poziom 9  

    Cytat:
    Kolego prawdopodobnie pomyłka jest przy przesuwaniu.

    Zwróciłeś uwagę na to co się najbardziej rzuca w oczy ?
    Code:
    zm = (16>>rejestr); 

    Obsługa przerwania jest, jakby to ująć, nie napisana.

    Moje pytanie dotyczy maski przerwań zewnętrznych. Rejestru WIU->MR.
    Pozdrawiam.

    0