Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Зависание прерывания SAM7S Keil (не сразу)
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
nicks80
Подскажите голову сломал не могу избавится от редко проявляющейся проблеме. перестает работать прерывания от внешнего воздействия на гожку порта.
Ножка порта подключена к ИК датчику.
при нормальной работе когда жмем на пульт то все ок.
как только на вход подается "короткая" (помеха, наводка от прикосновения руку к ножке) пачка импульсов то прерывание после не отрабатываются.
уже и не знаю что и делать.

Код
RAM_FUNC    
void cpu_io_irq(void) __irq  
{
    unsigned int status = AT91C_BASE_PIOA->PIO_ISR;
    // MY<
//    unsigned int     mask = AT91C_BASE_AIC->AIC_IMR; // MASK iNTERRUPT
//    unsigned short tempFMR = AT91C_BASE_MC->MC_FMR;
    // MY>
    status &= AT91C_BASE_PIOA->PIO_IMR;

    // MY<
//    AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; /// DISABLE ALL INTERRUPT
    // MY>


    if(status & REM_INPUT_PIN)
    {
        rem_interupt();    
    }


    if(status & PWM_PIN_FUSE)
    {
    //    pwm_interupt();
    }
    // MY<
//    AT91C_BASE_MC->MC_FMR = tempFMR;
//    AT91C_BASE_AIC->AIC_IECR = mask;
    // MY>
    AT91C_BASE_AIC->AIC_EOICR =  status;
}

void init_io(void)
{
    /// PWM
    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;

    /// Interupt
    AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA );

    AT91C_BASE_SYS->PIOA_PPUDR    =        REM_INPUT_PIN | PWM_PIN_FUSE;
    AT91C_BASE_PIOA->PIO_IFER     =        REM_INPUT_PIN | PWM_PIN_FUSE;

    AT91F_PIO_CfgInput(AT91C_BASE_PIOA, REM_INPUT_PIN|PWM_PIN_FUSE);
    AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_PIOA, AT91C_AIC_PRIOR_HIGHEST,AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE, (void (*)() )cpu_io_irq);
    AT91F_PIO_InterruptEnable(AT91C_BASE_PIOA,REM_INPUT_PIN|PWM_PIN_FUSE);
    AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_PIOA);
}
aaarrr
Внимательнее надо быть. Источник прерывания внутренний, поэтому
SRCTYPE_EXT_NEGATIVE_EDGE = Positive edge triggered
В данном случае использовать прерывание по фронту смысла просто нет.
nicks80
Цитата(aaarrr @ Feb 24 2010, 17:39) *
Внимательнее надо быть. Источник прерывания внутренний, поэтому
SRCTYPE_EXT_NEGATIVE_EDGE = Positive edge triggered
В данном случае использовать прерывание по фронту смысла просто нет.

Я просматриваю состояние ноги при заходе в прерывание.
Суть в другом. оно перестает обрабатываться.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.