Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LDLE mode в обработчике прерывания
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
MiklPolikov
Хочу в прерывании от PIT запускать ADC и переводить процессор в idle mode для уменьшения шума,
а возвращатся из IDLE mode он будет по прерыванию от ADC.
И не работает- процессор так и остаётся в IDLE.
А если всё то же самое делать не в прерывании от таймера- работает .

Почему так ? В обработчике прерывания нельзя переходить в IDLE mode ?

Спасибо !


__irq void PIT_interrupt(void) //прерывание от PIT
{

x=*AT91C_PITC_PIVR; //сбрасываем флаг прерывания
*AT91C_ADC_CR|=AT91C_ADC_START; //запускаем ADC
AT91C_BASE_PMC->PMC_SCDR|=(1<<0); // idle mode
*AT91C_AIC_EOICR = 0; // возврат из прерывания
}

__irq void ADC_interrupt(void) // прерывание от ADC
{

x=*AT91C_ADC_LCDR; //сбрасываем флаг прерывания
*AT91C_AIC_EOICR = 0; // возврат из прерывания
}
injen-d
Вы останавливаете процессор когда он находится в прерывании от PIT, следовательно он там и останется, и прерывание от ADC не может возникнуть, если оно ниже приоритетом и запрещены вложенные прерывания. Я бы советовал использовать флаг (если это возможно) и устанавливать его в прерывании от PIT, а в основной программе анализировать его, и если установлен - переходить в idle. Конечно можно поэксперементировать с приоритетами прерываний, вдруг поможет? biggrin.gif
MiklPolikov
Спасибо за подсказку !
Сделал приоритет ADC выше PIT и заработало .


Цитата(injen-d @ Aug 3 2008, 21:09) *
Конечно можно поэксперементировать с приоритетами прерываний, вдруг поможет? biggrin.gif
Сергей Борщ
Цитата(MiklPolikov @ Aug 4 2008, 09:29) *
Сделал приоритет ADC выше PIT и заработало .
Как вариант можно было сказать AIC, что текущее прерывание уже обработано: AT91C_AIC_EOICR = 0;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.