|
Вопрос по АЦП, Free running mode |
|
|
|
Jan 14 2008, 22:53
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
При работе с АЦП делаю заранее заданное демпфирование по каналам. То есть порядок выборки каналов у меня постоянно скачет. Это поменять нельзя. АЦП запущено в "Free running mode" и проверяется по таймеру. Время с момента переключения канала и до выборки значения АЦП вдвое превышает означенные 25 тактов (пробовал и увеличивать). По каким-то, для меня непонятным причинам, иногда (достаточно редко) с АЦП в память попадает не текущее значение АЦП (точнее не то, что должно быть), а с предыдущего канала. Причём если я в данной точке останавливаюсь по JTAG, то в АЦП микросхемы вижу правильное значение. Например: Код 127 default: 128 x0=Adc[TekChan].X1=ADCH; // Прочитать значение АЦП \ ??pvPWWLvl1_7: \ 000000B8 91300079 LDS R19, 121 \ ??pvPWWLvl1_9: \ 000000BC 8334 STD Z+4, R19 \ 000000BE 2E23 MOV R2, R19 То есть по databreakpoint останавливаюсь в последней строчке и вижу в АЦП значение FF к примеру, а в ячейку уже занесено 83. Каналы и всё прочее выставляется верно. Создаётся впечатление, что АЦП не успевает завершить операцию. Но, как я уже писал, при увеличении времени в разы сама ошибка остаётся. Может я чего не знаю. Может необходимо как то обновить значение. Типа прочитать два раза или что-то ещё. Я в непонятках.
|
|
|
|
|
 |
Ответов
|
Apr 15 2008, 12:38
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(SasaVitebsk @ Apr 15 2008, 12:19)  А Flags у вас объявлен как volatile? Flags объявлен глобально, без volatile. volatile в данном случае здесь ни при чем. Но на всякий случай проверил: с volatile проблема осталась. На мой взгляд проблема как-то связана с прерываниями. Если за время обработки прерывания от таймера1 произошло несколько прерываний от АЦП (которые имеют низкий приоритет), то после окончания обработки прерывания от таймера1 попадаем в обработчик прерывания от АЦП. В момент между считываниями ADCL и ADCH возможна ситуация, когда происходит следующее преобразование АЦП, и предыдущий результат теряется. Но не обнуляется ведь! Это только моя версия происходящего. Какие будут еще ваши предположения? PS. Чем объяснить такую строгую периодичность: после трех правильных данных идут три нулевых? PS2. Версию, что таймер своими шумами влияет на работу АЦП, я тоже отбрасываю. Может быть нехватка стека? Но я не использую ресурсоемких функций. И пробовал увеличить CSTACK(0x100), RSTACK(0x64). Не помогло.
|
|
|
|
|
Apr 15 2008, 14:07
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(alux @ Apr 15 2008, 15:38)  volatile в данном случае здесь ни при чем. Но Flags должен быть volatile, также как и tmp. Лучше сразу писать правильно, чем ждать, когда начнется "при чем". Есть еще одно потенциальное место для бага: Flags &= ~DISPLAY; Оно компилируется примерно в такое: Код register Tmp = Flags; (1) Tmp = Tmp & DISPLAY; (2) Flags = Tmp; (3) Что произойдет, если между командами 1 и 3 произойдет прерывание, изменяющее Flags? Обращения к подобным переменным надо делать атомарными, т.е. с запретом прерываний. Цитата(alux @ Apr 15 2008, 15:38)  Но не обнуляется ведь! Попробуйте присваивать tmp в прерывании константу, т.е. исключите АЦП из получения результата.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 15 2008, 16:12
|
Знающий
   
Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447

|
Цитата(Сергей Борщ @ Apr 15 2008, 17:07)  Попробуйте присваивать tmp в прерывании константу, т.е. исключите АЦП из получения результата. Присвоил переменным Flags, value, tmp квалификатор volatile. В прерывании АЦП делаю tmp=123;. В итоге на терминал выводится последовательность 123 без промежуточных нулей. Цитата(Сергей Борщ @ Apr 15 2008, 17:07)  Обращения к подобным переменным надо делать атомарными, т.е. с запретом прерываний. В главном цикле при обнулении флага сделал так: Код oldState = __save_interrupt(); __disable_interrupt(); Flags &= ~DISPLAY; // Critical section goes here __restore_interrupt(oldState); .................. Еще вычитал в документации, что для неразрывного кода используется ключевое слово __monitor. Но оно, насколько я понял, относится к функциям. PS. В общем, обнуление флага сделал в критической секции. Проблема осталась. Мне кажется проблема кроется в чем-то другом. Мои идеи иссякли.  PS2. Эксперимент с присвоением константы 123 переменной tmp показывает, что проблема кроется в АЦП? Т.е. так, как я описывал выше? PS3. Прошу прощения за свою невнимательность... Проблемы, как таковой и не было!!! Если мерять реальное напряжение (у меня меряется напряжение на фотодатчике), то все нормально - никаких нулей нет! При отсутствии отраженного сигнала (напряжение минимально), получаю промежуточные нули. Видимо, это действительно связано с шумами таймера, которое отражается в виде меандра амплитудой около 30 (в кодах АЦП). Спасибо, СергейБорщ, SasaVitebsk, что указали на потенциальный источник ошибок.
Сообщение отредактировал alux - Apr 15 2008, 17:13
|
|
|
|
Сообщений в этой теме
SasaVitebsk Вопрос по АЦП Jan 14 2008, 22:53 Baser Может быть там присутствуют наложения циклов АЦП и... Jan 15 2008, 08:38 GDI При переключении мультиплексора, вроде, рекомендую... Jan 15 2008, 08:52 Сергей Борщ Я тоже склоняюсь к мысли, что это биения от несовп... Jan 15 2008, 08:58 xemul Цитата(Сергей Борщ @ Jan 15 2008, 11:58) ... Jan 15 2008, 12:04 GDI Ну может не в даташитах но на форуме эта тема под... Jan 15 2008, 10:04 Сергей Борщ Цитата(GDI @ Jan 15 2008, 12:04) "ну... Jan 15 2008, 10:48  singlskv Цитата(Сергей Борщ @ Jan 15 2008, 13:48) ... Jan 15 2008, 20:56   SasaVitebsk Цитата(singlskv @ Jan 16 2008, 00:56) Он ... Jan 15 2008, 23:54    pokos Цитата(SasaVitebsk @ Jan 16 2008, 02:54) ... Jan 16 2008, 08:24     SasaVitebsk Цитата(pokos @ Jan 16 2008, 12:24) Ну, во... Jan 16 2008, 11:36    singlskv Цитата(SasaVitebsk @ Jan 16 2008, 02:54) ... Jan 18 2008, 09:36     _Pasha Цитата(singlskv @ Jan 18 2008, 13:36) ...... Jan 18 2008, 14:26      singlskv Цитата(_Pasha @ Jan 18 2008, 17:26) Вообщ... Jan 18 2008, 14:35   Сергей Борщ Цитата(singlskv @ Jan 15 2008, 22:56) Ну ... Jan 16 2008, 15:19    singlskv Цитата(Сергей Борщ @ Jan 16 2008, 18:19) ... Jan 16 2008, 20:16 pokos Насколько я понимаю процесс жизнедеятельности этог... Jan 15 2008, 14:01 xemul Цитата(pokos @ Jan 15 2008, 17:01) Наскол... Jan 15 2008, 14:32 Сергей Борщ Цитата(pokos @ Jan 15 2008, 16:01) Наскол... Jan 15 2008, 14:36 Anjey_N Хочу тоже задать вопрос!
МК ATmega8, задейств... Jan 15 2008, 17:03 Baser Цитата(Anjey_N @ Jan 15 2008, 19:03) При ... Jan 15 2008, 17:24  Anjey_N Цитата(Baser @ Jan 15 2008, 21:24) Можно ... Jan 15 2008, 17:40 SasaVitebsk Не буду утверждать, так как для каких либо утвержд... Jan 15 2008, 17:46 pokos "ADMUX can be safely updated in the following... Jan 16 2008, 11:49 oran-be Я отжимался со свободным режимом - отлично работае... Jan 16 2008, 18:26 _Pasha В самом первом посте увидел инструкцию STD. У меня... Jan 16 2008, 21:18 _Diman_ Разьясните пожалуйста пару моментов.
13 - 260 ... Jan 16 2008, 21:42 _Pasha Цитата(_Diman_ @ Jan 17 2008, 01:42) По э... Jan 16 2008, 22:09 _Diman_ Небольшоё, аккумулятор-> 510 ом и 0,2uF на земл... Jan 16 2008, 23:20 SasaVitebsk Ещё раз поясняю младший бит не может "отличат... Jan 16 2008, 23:33 IGK Цитата(SasaVitebsk @ Jan 17 2008, 01:33) ... Jan 17 2008, 15:38 SasaVitebsk Сейчас изделие отправили на натурные испытания на ... Jan 17 2008, 17:08 _Pasha Цитата(IGK @ Jan 17 2008, 19:38) Но есть ... Jan 17 2008, 20:14 IGK Цитата(_Pasha @ Jan 17 2008, 22:14) Чушь... Jan 17 2008, 22:47 _Pasha Цитата(singlskv @ Jan 18 2008, 18:35) А г... Jan 19 2008, 04:54 SasaVitebsk Ну это не мой вариант. Я работаю с 8-ми битным реж... Jan 19 2008, 14:18 singlskv Цитата(SasaVitebsk @ Jan 19 2008, 17:18) ... Jan 19 2008, 15:55  _Pasha Цитата(singlskv @ Jan 19 2008, 19:55) Ну ... Jan 19 2008, 19:43   singlskv Цитата(_Pasha @ Jan 19 2008, 22:43) Вы, с... Jan 19 2008, 20:04    _Pasha Цитата(singlskv @ Jan 20 2008, 00:04) Вы ... Jan 19 2008, 20:45 defunct 2 SashaVitebsk.
IMHO считывать АЦП по таймеру нем... Jan 20 2008, 01:56 alux Имею проблему с выводом по UART результата измерен... Apr 15 2008, 08:02 SasaVitebsk Предложу вам другой вариант работы с флагами. Комп... Apr 15 2008, 20:36
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|