реклама на сайте
подробности

 
 
> Вопрос по АЦП, Free running mode
SasaVitebsk
сообщение Jan 14 2008, 22:53
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 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. Каналы и всё прочее выставляется верно.

Создаётся впечатление, что АЦП не успевает завершить операцию. Но, как я уже писал, при увеличении времени в разы сама ошибка остаётся.

Может я чего не знаю. Может необходимо как то обновить значение. Типа прочитать два раза или что-то ещё.

Я в непонятках.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Apr 15 2008, 09:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



А Flags у вас объявлен как volatile?
Просто похоже данная проблема к АЦП не имеет отношения. Обычный хомут какой-то. Попробуйте по шагам пройти, либо asm просмотрите.
Go to the top of the page
 
+Quote Post
alux
сообщение Apr 15 2008, 12:38
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 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). Не помогло.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 15 2008, 14:07
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
alux
сообщение Apr 15 2008, 16:12
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 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. В общем, обнуление флага сделал в критической секции. Проблема осталась. Мне кажется проблема кроется в чем-то другом. Мои идеи иссякли. help.gif

PS2. Эксперимент с присвоением константы 123 переменной tmp показывает, что проблема кроется в АЦП? Т.е. так, как я описывал выше?


PS3. Прошу прощения за свою невнимательность... Проблемы, как таковой и не было!!!
Если мерять реальное напряжение (у меня меряется напряжение на фотодатчике), то все нормально - никаких нулей нет! При отсутствии отраженного сигнала (напряжение минимально), получаю промежуточные нули. Видимо, это действительно связано с шумами таймера, которое отражается в виде меандра амплитудой около 30 (в кодах АЦП).

Спасибо, СергейБорщ, SasaVitebsk, что указали на потенциальный источник ошибок.

Сообщение отредактировал alux - Apr 15 2008, 17:13
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 00:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.01442 секунд с 7
ELECTRONIX ©2004-2016