Подскажите голову сломал не могу избавится от редко проявляющейся проблеме. перестает работать прерывания от внешнего воздействия на гожку порта.
Ножка порта подключена к ИК датчику.
при нормальной работе когда жмем на пульт то все ок.
как только на вход подается "короткая" (помеха, наводка от прикосновения руку к ножке) пачка импульсов то прерывание после не отрабатываются.
уже и не знаю что и делать.
Код
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);
}
Сообщение отредактировал rezident - Feb 24 2010, 17:28
Причина редактирования: Оформление цитаты исходника.