Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC2138: АЦП в режиме прерываний.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
e-not
Если в функции обработки прерывания по завершению преобразования АЦП0 я после чтения результата вставлю запуск
очередного преобразования (AD0CR_bit.START = 1), то контроллер виснет. Но если в функции обработки прерывания
я устанавливаю флаг завершения преобразования, а следующее преобразование запускаю в main, то все работает.

// так работает
void ADC0Init()
{
PINSEL0_bit.P0_5 = 0x03;
AD0CR_bit.SEL = 0x80;
AD0CR_bit.CLKDIV = 5;
AD0CR_bit.BURST = 0;
AD0CR_bit.CLKS = 0;
AD0CR_bit.PDN = 1;
AD0CR_bit.START = 0;
}

void ADC0_int()
{
AdcResult = AD0DR_bit.VVDDA; //AdcResult и AdcReady - глобальные
AdcReady = 1;
}

void main()
{
AD0CR_bit.START = 1;
while (1)
{
if (AdcReady )
{
AdcReady = 0;
AD0CR_bit.START = 1;
}
}
}

// так виснет
void ADC0_int()
{
AdcResult = AD0DR_bit.VVDDA;
AD0CR_bit.START = 1;
}

void main()
{
AD0CR_bit.START = 1;
while (1)
{
}
}
Может, кто подскажет?
defunct
Цитата(e-not @ Feb 25 2006, 02:06) *
я устанавливаю флаг завершения преобразования, а следующее преобразование запускаю в main, то все работает.
....
Может, кто подскажет?


Что же вам еще подсказать, если и так все работает?

ps: не вижу смысла в запуске АЦП в прерывании от АЦП. Вы насильно вводите систему с состояние коллапса. Другое дело запускать AЦП по прерыванию таймера с заданной частотой дискретизации, а по прерыванию от АЦП считывать рез-тат АЦП.
e-not
Спасибо за совет.
zltigo
Цитата(e-not @ Feb 25 2006, 02:06) *
AD0CR_bit.CLKDIV = 5;

Для такой частоты тактировки ADC у Вас просто захлебывается контроллер - за 66 тактов
он даже из обработчика перывания (если у Вас после START и возврата в обертку еще команды есть, то наверняка) может не успеть выйти. При тактировки "разумными" частотами проблем не будет.
Естественно, что и для "рабочего" варианта Вы не получите полного потока отсчетов - они
просто массово теряются. Подумайте над необходимой Вам частотой отсчетов.
Вообще в START из обработчика абсолютно ничего противоестественного нет. Хотя может Вам просто BURST mode нужен?
TanT
В LPC2378 может быть выбран только один канал АЦП или данные можно получать с нескольких каналов? Мне одновременно требуется обрабатывать два канала АЦП, крутил, вертел и ничего - тока по одному получается. Прерывание может быть от любого канала, но в этот момент хотелось бы принять данные с обоих каналов. Реально такое осуществить? Как?
etoja
Цитата(TanT @ Mar 27 2009, 15:57) *
В LPC2378 может быть выбран только один канал АЦП или данные можно получать с нескольких каналов? Мне одновременно требуется обрабатывать два канала АЦП, крутил, вертел и ничего - тока по одному получается. Прерывание может быть от любого канала, но в этот момент хотелось бы принять данные с обоих каналов. Реально такое осуществить? Как?


Изначально вопрос был о LPC2138. В нём можно запускать синхронно два АЦП. Проверено на частотах квантования до 450КГц.
При этом устанавливал PCLK = CCLK, то есть частота периферии равна частоте ядра. Внуртенняя частота АЦП должна быть не выше 4.5МГц (требование даташита).
TanT
Цитата(etoja @ Mar 27 2009, 16:11) *
Изначально вопрос был о LPC2138. В нём можно запускать синхронно два АЦП. Проверено на частотах квантования до 450КГц.
При этом устанавливал PCLK = CCLK, то есть частота периферии равна частоте ядра. Внуртенняя частота АЦП должна быть не выше 4.5МГц (требование даташита).

В LPC2378 я не обнаружил два регистра управления. А 2138 в наличии увы не имею. То есть хоть расшибись одновременно два канала АЦП на 2378 не обработать?
HARMHARM
Цитата(TanT @ Mar 27 2009, 15:26) *
В LPC2378 я не обнаружил два регистра управления. А 2138 в наличии увы не имею. То есть хоть расшибись одновременно два канала АЦП на 2378 не обработать?

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