Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как отработать прерывание по перепаду на ножке в SAM7S256
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Тема
Код
#define PIO_INTERRUPT_LEVEL    6
int count_interrupt;
__ramfunc void pio_c_irq_handler ( void )
{
int dummy;
count_interrupt++;
    dummy =AT91C_BASE_PIOA->PIO_ISR;
    //* suppress the compilation warning
    dummy =dummy;

}


int main( void )
//* Begin
{
    unsigned int   loop_count;
    AT91PS_AIC     pAic;
    //* Load System pAic Base address
        pAic = AT91C_BASE_AIC;

    //* Enable User Reset and set its minimal assertion to 960 us
    AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24);

        // First, enable the clock of the PIOB
        AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA );
        AT91F_PIOA_CfgPMC();
    //* open external PIO interrupt
        //* define switch SW3 at PIO input for interrupt IRQ loop
    AT91F_PIO_CfgInput(AT91C_BASE_PIOA, SW3_MASK | SW4_MASK);

    AT91F_AIC_ConfigureIt ( pAic, AT91C_ID_PIOA, PIO_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE, pio_c_irq_handler);
    AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,SW4_MASK);
    //* set the interrupt by software
    AT91F_AIC_EnableIt (pAic, AT91C_ID_PIOA);

for (;;)
    {

    }

//* End
}


Все перепробовал а прерывания от перепада нету! SW4 это PA26 что не так
Сергей Борщ
Цитата(Тема @ Feb 2 2008, 14:49) *
Все перепробовал а прерывания от перепада нету! SW4 это PA26 что не так
Забыл глобально разрешить прерывания ( __enable_interrupts() )? И не описал собственно переход по вектору из AIC:
Код
#pragma vector = 0x18
__irq __arm void IRQ_Switch()
{
    void (*Handler)() = (void(*)())AT91C_BASE_AIC->AIC_IVR;
    Handler();
    AT91C_BASE_AIC->AIC_EOICR = 0;                    // Reset AIC logic
}
Тема
Цитата(Сергей Борщ @ Feb 2 2008, 17:57) *
Забыл глобально разрешить прерывания ( __enable_interrupts() )? И не описал собственно переход по вектору из AIC:
Код
#pragma vector = 0x18
__irq __arm void IRQ_Switch()
{
    void (*Handler)() = (void(*)())AT91C_BASE_AIC->AIC_IVR;
    Handler();
    AT91C_BASE_AIC->AIC_EOICR = 0;                    // Reset AIC logic
}

Прерывания от таймеров проходят, а вот от ножки не хотят sad.gif

3 дня голову ломаю, ничего не помогает.подтяжку отключил, вывод цепляю на + потом на общий, и ничего не происходит...Все остальные прерывания работают
_dem
Вообще хорошо бы не пользоватся библиотечными функциями, особенно при освоении контроллера, а работать с регистрами. Тогда сразу видны явные ошибки.

А лезть за описанием кода каждой функции (макроса), чтобы посмотреть, что Вы сделали, а что забыли - мне лично (думаю, не только мне) надоело на третьем макросе.

А перепад сам чем делается ? Может, нужно пулл-ап включить-выключить ?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.