|
Опрос АЦП внутри прерывания |
|
|
|
Dec 7 2013, 06:41
|
Знающий
   
Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458

|
Всем привет! Перенес код опроса АЦП (ATmega16) внутрь обработчика прерываний от таймера, АЦП напрочь перестал работать, оба байта стабильно 00, 00. Есть какие-то подводные камни при запуске однократного преобразования АЦП в теле обработчика прерывания? (Сам факт вызова процедуры обработчика прерывания вижу на осциллографе.) Этим кодом пользовался много раз: Код //АЦП доступен, прерывания разрешены //ADCSRA: 7-ADEEN 6-ADSC 5-ADATE 4-ADIF 3-ADIE 2-ADPS2 1-ADPS2 0-ADPS0 // 1 0 0 0 0 1 1 1 ADCSRA = 0x87; ... ADCSRA |= 0x40; //Начать одиночное преобразование АЦП while( (ADCSRA & 0x40)==0x40 ); //ждем завершения преобразования ADSC (13-14 тактов) c1 = ADCL; //Читаем результат преобразования сначала младший c2 = ADCH; //затем старший (иначе не работает!) VADC = c1 + c2*256;
|
|
|
|
|
 |
Ответов
|
Dec 7 2013, 09:12
|
Знающий
   
Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458

|
Цитата(Abell @ Dec 7 2013, 11:03)  А Вы не обрабатывайте АЦП в прерывании, Вы обрабатывайте его в главном цикле, так-то оно правильней будет... за 13-14 тактов многое может произойти, да так, что и выйти корректно из прерывания может не получиться, или выйти не туда  Ну так оно и было, все работало. Мне нужно обеспечить гарантированное время в петле регулирования. Все что связано с регулированием (измерение и вычисление управляющего воздействия) засунул в прерывание от таймера, а интерфейсную часть (опрос клавиатуры и вывод на LCD) оставил в основном цикле. И... неожиданно обломался. Уже пару дней перечитываю даташит - ну не вижу я ни одной причины по которой нельзя опросить АЦП внутри обработчика прерывания! Времена на стадии отладки сделал огромные (21 mS), при входе в прерывание выставляю на пин "1" на осциллографе вижу, что прерывание случилось, при выходе из прерывания сбрасываю пин в "0", то есть, все работает, но не измеряет. Опора как была так и есть. В общем, фигня какая-то.  Клавиатура работает, LCD тоже, то есть структура программы не рушится, если случаются вложенные прерывания, они отрабатывают корректно.
|
|
|
|
|
Dec 7 2013, 17:15
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(AndreyVN @ Dec 7 2013, 13:12)  Мне нужно обеспечить гарантированное время в петле регулирования. Все что связано с регулированием (измерение и вычисление управляющего воздействия) засунул в прерывание от таймера, а интерфейсную часть (опрос клавиатуры и вывод на LCD) оставил в основном цикле. И... неожиданно обломался. Уже пару дней перечитываю даташит - ну не вижу я ни одной причины по которой нельзя опросить АЦП внутри обработчика прерывания! А вы старт АЦП делайте из прерывания, а ожидание и прием данных в основном цикле. Тогда и синхронизация будет отличная и ждать долго не придется (т.к. пока выйдет из прерывания и в основном цикле до опроса дело дойдет, глядишь, преобразование само закончится без дополнительного ожидания). Для этого лишь надо кроме старта еще самодельный флаг выставить, что с АЦП данные надо востребовать, а в основном цикле его проверяете, и если стоит, то ждете готовности и опрашиваете. P.S. Сама делала так: таймер запускала на удвоенную частоту опроса, в четных перерываниях от таймера делала старт АЦП, а в нечетных его опрашивала без ожидания.
|
|
|
|
Сообщений в этой теме
AndreyVN Опрос АЦП внутри прерывания Dec 7 2013, 06:41  Abell Цитата(AndreyVN @ Dec 7 2013, 13:12) Ну т... Dec 7 2013, 09:41   AndreyVN Цитата(Abell @ Dec 7 2013, 12:41) Ну пуст... Dec 7 2013, 10:02    stells Цитата(AndreyVN @ Dec 7 2013, 14:02) А у ... Dec 7 2013, 10:19   AndreyVN Цитата(Xenia @ Dec 7 2013, 20:15) А вы ст... Dec 7 2013, 18:59 stells я сталкивался с неправильной обработкой АЦП в подп... Dec 7 2013, 09:30 _Pasha Мега8 недалеко ушла от 16-й, все работало и работа... Dec 7 2013, 19:17 AndreyVN Цитата(_Pasha @ Dec 7 2013, 22:17) Мега8 ... Dec 7 2013, 19:36 Сергей Борщ Цитата(AndreyVN @ Dec 7 2013, 08:41) оба ... Dec 8 2013, 00:31 AndreyVN ЦитатаА где вы их проверяете? В этом же прерывании... Dec 8 2013, 06:22  Сергей Борщ Цитата(AndreyVN @ Dec 8 2013, 08:22) Выво... Dec 8 2013, 08:57   AndreyVN Цитата(Сергей Борщ @ Dec 8 2013, 11:57) П... Dec 8 2013, 09:17    _Pasha Цитата(AndreyVN @ Dec 8 2013, 12:17) Нет,... Dec 8 2013, 11:52     WHALE Цитата(_Pasha @ Dec 8 2013, 15:52) Ну вот... Dec 8 2013, 19:26      AndreyVN Цитата(WHALE @ Dec 8 2013, 23:26) ТС так ... Dec 9 2013, 04:25     demiurg_spb Цитата(_Pasha @ Dec 8 2013, 15:52) Ну вот... Dec 9 2013, 05:51 Сергей Борщ Цитата(WHALE @ Dec 8 2013, 21:26) А он не... Dec 9 2013, 14:38
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|