Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Выход из обработчика прерывания АЦП
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
int0x25
Здравствуйте, запускаю таймер, который должен каждые 10 мс запускать АЦП и потом должно быть обработано прерывание конца преобразования. Но у меня почему то только один раз выполняется код в обработчике прерывания АЦП, а после этого даже не обрабатываются прерывания TC2. Наверное, я что то не дописал в обработчике прерывания АЦП, подскажите пожалуйста, что именно.
Код
__irq void tc2_int (void)
{
  AT91S_TC* pTC2 = AT91C_BASE_TC2;
  AT91F_ADC_StartConversion(AT91C_BASE_ADC);    
  *AT91C_AIC_EOICR = pTC2->TC_SR;
}

__irq void ADC_inter(void)
{
  GetData();    
  AT91F_AIC_ClearIt(AT91C_BASE_AIC, AT91C_ID_ADC);
}

void Init_ADC()
{
  AT91S_AIC* pAIC = AT91C_BASE_AIC;
  AT91F_ADC_SoftReset(AT91C_BASE_ADC);
  AT91F_ADC_CfgPMC();
  AT91F_ADC_CfgModeReg(AT91C_BASE_ADC,ADC_Mode);
  AT91F_ADC_EnableChannel(AT91C_BASE_ADC, AT91C_ADC_CH4);
  
  pAIC->AIC_SMR[AT91C_ID_ADC] = AT91C_AIC_PRIOR_LOWEST | AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL;
  pAIC->AIC_SVR[AT91C_ID_ADC] = (unsigned long) ADC_inter;
  AT91F_ADC_EnableIt(AT91C_BASE_ADC,AT91C_ADC_CH4);
  AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_ADC);

  pAIC->AIC_IECR = (1 << AT91C_ID_ADC);
}
aaarrr
1. В обработчике нет записи AIC_EOICR
2. Вызов AT91F_AIC_ClearIt смысла не имеет, т.к. прерывание настроено на работу по уровню
3. Бит EOC до начала следующего преобразования не сбросится, используйте DRDY

Ну и еррату на модуль АЦП почитать стоит, она весьма богатая.
int0x25
aaarrr, спасибо большое, помогли. Действительно, в документации все написано, просто надо просто внимательнее читать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.