Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.93/46: Рейтинг темы: голосов - 46, средняя оценка - 4.93
wypuk
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
1

Вопрос по АЦП

09.10.2012, 00:12. Просмотров 8300. Ответов 23
Метки нет (Все метки)

Без прелюдии и сразу к делу!))
Короче вопрос такой: даю я команду АЦП (tiny45) начать преобразование сигнала (как я понял преобразование это длится 13 тактов АЦП (не машинных)), после этого нужно дождаться преобразования и продолжить выполнение программы с полученным результатом. Не получится ли так: я дал команду начать преобразование, потом следом комманду прочитать результат - и в итоге результат не тот?
Правильно ли так: дал команду начать преобразование, зациклился в ожидании появления флага , прочитал результат, и дальше по программе?

И еще вопрос. Использую внешнее прерывание INT0. при появлении события на PB2 выполняю процедуру прерывания, при этом флаг I регистра SREG сбрасывается и по идее прерывание по появлению флага АЦП уже не сработает? (конечно, если заново не установить бит I в Sreg)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2012, 00:12
Ответы с готовыми решениями:

Вопрос по АЦП. + 1V на ножках.
Добрый день. Прошу подсказки. Настраиваю АЦП на прием напряжения с термосопротивления. По ходу...

мелкий вопрос по АЦП
Здрасьте, использую gcc пишу а си, имеется небольшой ламерский вопрос по ацп в авр: когда...

Вопрос по точности АЦП в Atmega48
Делаю измеритель на микроконтроллере и столкнулся с таким моментом. Если брать Atmega8, то он при...

АЦП, вопрос по книге Ю.Ревич "Практическое программирование
Ю.Ревич "Практическое программирование МК AVR на языке ассемблер" страница 46 Заметки на полях ...

Вопрос о влиянии низкой тактовой частоты на работу АЦП
Доброго, джентльмены. Ваяю приборчик на Тини26 с использованием АЦП. Главное требование -...

23
omooro
0 / 0 / 0
Регистрация: 11.06.2010
Сообщений: 351
09.10.2012, 02:23 2
Цитата Сообщение от wypuk
Правильно ли так: дал команду начать преобразование, зациклился в ожидании появления флага , прочитал результат, и дальше по программе?
Если заняться больше нечем во время преобразования, энергопотребление и уменьшение шумов не беспокоит, то можно так.

Цитата Сообщение от wypuk
И еще вопрос. Использую внешнее прерывание INT0. при появлении события на PB2 выполняю процедуру прерывания, при этом флаг I регистра SREG сбрасывается и по идее прерывание по появлению флага АЦП уже не сработает? (конечно, если заново не установить бит I в Sreg)
Да, не сработает. Но как только флаг в sreg будет выставлен обратно (например после выполнения reti), и если флаг прерывания АЦП тоже выставлен на этот момент, и прерывание от АЦП включено, тогда сработает.
0
wypuk
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
09.10.2012, 10:22 3
Цитата Сообщение от omooro
Да, не сработает. Но как только флаг в sreg будет выставлен обратно (например после выполнения reti), и если флаг прерывания АЦП тоже выставлен на этот момент, и прерывание от АЦП включено, тогда сработает.
Т.е. если я уже в первом прерывании от INT0 обработал полученное значение АЦП, чтобы после выхода из этого прерывания не вызвалось прерывание от АЦП и заново не повторять процедуру обработки того же значения я должен предварительно сбросить флаг АЦП?
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
09.10.2012, 10:55 4
Мудрено ты накрутил.
Прерывание по INT0 - причем здесь готовое значение АЦП? Зачем его в прерывании отрабатывать?
Обычно делается не так. В INT0 отработал (коротко) то, что связано с этим событием. Например, поставил флаг, что это событие произошло. А в прерывании АЦП отаботал то, что связано с этим прерыванием - слизнул код АЦП. И поставил флаг, что новый код готов. А уж в фоновой программе по совпадению этих флагов сотворил свою обработку, которую ЩАС предлагал засунуть в INT0.
0
09.10.2012, 10:55
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
09.10.2012, 10:56 5
Не нужно проверять в Int0 АЦП. Просто разрешайте прерывания в Int0 (asm sei). тогда в int0 нормально сработает прерывание от АЦП - а из него выскочите обратно в Int0
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
09.10.2012, 11:02 6
Цитата Сообщение от Johmmy0007
в int0 нормально сработает прерывание от АЦП - а из него выскочите обратно в Int0
Зачем учишь неправильным подходам, дорогой? Чтобы ждать в INT0 прерывание от АЦП - там сидеть надо. Это ж вааще ужасть, в прерывании сидеть! А если не сидеть - то правильно выскочить из него быстрячком. И тогда уж не задаваться целью "обеспечить возможность отработки прерывания в прерывании". Цель вредная в принципе.
0
ptoop
0 / 0 / 0
Регистрация: 19.09.2010
Сообщений: 1,761
09.10.2012, 11:10 7
Зачем сидеть? На случай, если данные готовы, вполне себе вариант, но очень корявый. ОЧЕНЬ!
АЦП довольно медленная штука, а вложенные прерывания оправданы только в том случае, если нужна незамедлительная реакция независимо ни от чего. Обычно прерывание, которое вкладывается, содержит всего несколько команд, и совместно с ним невозможны другие прерывания (допустим, когда в программе используется только два перывания - критичное и не очень). Разумеется код на асме, и контроль всего.

Короче в данном случае - ну нафиг.
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
09.10.2012, 11:13 8
Цитата Сообщение от drvtos
Цитата Сообщение от Johmmy0007
в int0 нормально сработает прерывание от АЦП - а из него выскочите обратно в Int0
Зачем учишь неправильным подходам, дорогой? Чтобы ждать в INT0 прерывание от АЦП - там сидеть надо. Это ж вааще ужасть, в прерывании сидеть! А если не сидеть - то правильно выскочить из него быстрячком. И тогда уж не задаваться целью "обеспечить возможность отработки прерывания в прерывании". Цель вредная в принципе.

Э, дарагой,
Где я написал - ждать в Int0? не надо приписывать, чего я не говорил - я написал как не пропустить, если данные АЦП нужны срочно. В прерывании сбрасываем показания в буфер и выходим.
Это как раз - самый нормальный подход, прерывания для того и придуманы
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
09.10.2012, 11:32 9
Цитата Сообщение от Johmmy0007
я написал как не пропустить, если они нужны срочно. В прерывании сбрасываем показания в буфер и выходим
Это как раз - самый нормальный подход
Давай сначала. Не пропустить и так и так не пропустим. Когда прерывания заперщены (вошли в отработку другого прерывания), то готовность АЦП взведет свой флаг, хотя это и не вызовет прерывания. А после выхода из INT0 прерывание от АЦП произойдет. Верно?
"Суперсрочность" слизывания кода АЦП - это ж какая срочность, что нельзя закончить (кашерно короткое) прерывание от INT0, выйти, прерваться по АЦП и прочесть его код? Не, ну можно умозрительно придумать дикий случай, когда вот прям ТАКА-ТАКА АЦП кончил, так тут же нужно сломя голову слизывать (у меня порношкола получается, заметил?) - но это не жизненный случай. Реально, если с кодом АЦП нужно что-то еще делать, то его прерывание вполне может подождать. И в INT0 нефиг засиживаться.

Резюмирую еще раз, чтобы новички не запутались в наших порнографиях:
1) Прерывания должны быть достаточно короткими, чтобы не морочить себе голову реакцией на иное прерывание в отработке данного
2) в прерываниях обрабатывать код АЦП не очень хорошо, если это... ну не очень простая обработка
3) все обработки желательно свести в фоновую программу, которой предоставлять "вести с полей" - коды, принятые во время прерывания. флаги, взведенные в прерываниях и прочее.

Замечу, что бывает по-разному. У меня есть прога, в которойв прерывании от УАРТа стоит нехилый такой switch с разбором, чего же делать с очередным фактом приема или передачи байта по УАРТу. Но свитч этот с виду страшненький, а реально очень короткий, ибо быстренько определяем, какая фаза обработки сообщения, в ней делаем пару операций - и улетаем. Так что все не догма. Но если понимешь, что творишь, в каких временных рамках,в каком контексте...
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
09.10.2012, 12:02 10
>>Не пропустить и так и так не пропустим.
А вообще где написано, что нельзя сидеть в прерываниях? Нельзя сидеть только в одном случае - если их несколько и нежелательно пропускать их обработку. Если у ТС одно - от кнопки почему бы не посидеть и не сделать всю обработку там, чем ставить какие-то флаги выходить, анализировать флаги, потом обрабатывать. Никаких явных противопоказаний использования нормального кода в прерываниях нет - наоборот программа будет стройней, логичней и красивей. И если код Int0 долгий, то прерывания АЦП можно и пропустить, если он настроен на постоянный опрос (обычно именно в таких случаях и используют прерывания АЦП).
Так что вопрос тут спорный
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
09.10.2012, 12:54 11
Цитата Сообщение от Johmmy0007
>>Не пропустить и так и так не пропустим.
А вообще где написано, что нельзя сидеть в прерываниях? Нельзя сидеть только в одном случае - если их несколько и нежелательно пропускать их обработку. Если у ТС одно - от кнопки почему бы не посидеть и не сделать всю обработку там, чем ставить какие-то флаги выходить, анализировать флаги, потом обрабатывать. Никаких явных противопоказаний использования нормального кода в прерываниях нет - наоборот программа будет стройней, логичней и красивей. И если код Int0 долгий, то прерывания АЦП можно и пропустить, если он настроен на постоянный опрос (обычно именно в таких случаях и используют прерывания АЦП).
Так что вопрос тут спорный
Вообще-то такие допущения расслабляют. Сейчас "а, пойдет и так", потом "а, сойдет и так". И в один прекрасный момент въезжаем в пень. И не можем понять, что же случилось. Поэтому нужно самого себя настроить делать как следует. Потому что в дальнейшем гораздо труднее перестроиться. Если непонятно, поясняю. Ты не делаешь сразу как должно, делать "как сойдет" и не учишься делать как должно. И когда жареный петух клюнул, нужно переучиваться делать как должно, и тратишь гораздо больше времени на перестройку.
Пример. Человек пофигист по жизни. Все делает спустя рукава. И когда наступает серьезный момент в жизни, он в растерянности. Делать-то как нужно не научен. И поэтому, если не перестроится, ничего у него в жизни не получится. И в тот серьезный момент, если он не поменяется, то как всегда все просрет. И самое главное здесь то, что впоследствии он тратит время на перестройку гораздо больше. И то время, которое он пожалел на самое простое, просто придерживаться правила "делать как должно" и приобретать опыт и навыки в этом направлении, тратит сейчас. Хотя мог сейчас заниматься более приятными вещами.
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
09.10.2012, 13:00 12
Много написали, я так и не понял, о чём.

>>Поэтому нужно самого себя настроить делать как следует.

А как следует? Подход может быть разный в разных ситуациях. Что будет правильней заранне не определено
0
ptoop
0 / 0 / 0
Регистрация: 19.09.2010
Сообщений: 1,761
09.10.2012, 13:10 13
Ну да, это как GOTO :)
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
09.10.2012, 13:11 14
Ну, не стоит тут холивар смертоносный разводить. Конечно, случаи бывают. Я специально привел пример, когда у меня довольно много кода в отработчике прерываний, а ведь это тоже иногда считается не камильфо.
Но все же, согласись, если в достаточно сложной проге не работать правильно, не организовать программу стройно, то там уже в каше много чего можно наглупостить. Так? Так, сам знаю. А привычка вырабатывается на простых прогах, тоже ведь верно уважаемый dymyurk1978 заметил. Поэтому лучше все же в прерываниях не сидеть. Кстати, атмеловцы ведь не бараны, что сделали по умолчанию невозмжным прерывание прерывания. Они сделали так потому, что в 99,9% случаев это не мешает. И незачем объезжать на кривой телеге то, что просто и качественно.
0
Johmmy0007
1 / 1 / 0
Регистрация: 30.08.2011
Сообщений: 9,944
09.10.2012, 13:18 15
>>Кстати, атмеловцы ведь не бараны, что сделали по умолчанию невозмжным прерывание прерывания. Они сделали так потому, что в 99,9% случаев это не мешает. И незачем объезжать на кривой телеге то, что просто и качественно.

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

Ну опять про кривую телегу давай не будем, какой поход кривее, зависит от ситуации, о чём я и пишу.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
09.10.2012, 13:26 16
ТС. Скажите, что вы делаете. Зачем АЦП, зачем внешнее прерывание. Я вам примерно напишу, как можно сделать.
0
drvtos
1 / 1 / 0
Регистрация: 25.05.2010
Сообщений: 3,610
09.10.2012, 13:39 17
Цитата Сообщение от dymyurk1978
ТС. Скажите, что вы делаете.
Да кому это интересно?
шутка :)
0
Stiit.mi
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
09.10.2012, 13:53 18
Чисто теоретически тут есть два варианта. Например, последнее значение АЦП нужно при обработке int0. В этом случае можно проверить флаг окончания преобразования АЦП, считать значение, сбросить флаг прерывания АЦП, и закончить int0. После этого прерывание от АЦП не вызовется. Если АЦП не готово, то просто грустно выходим из прерывания int0 и ждем, пока сработает прерывание АЦП

В 99% случаев по прерыванию АЦП значение переносится в какую-то переменную и там хранится. Скорее всего с каким-нить усреднением. Тогда, если не критично именно последнее значение, то в прерывании int0 ничтоже сумнявшись берем эту переменную и не парим мозг.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
09.10.2012, 19:13 19
Цитата Сообщение от wypuk
Без прелюдии и сразу к делу!))
Короче вопрос такой: даю я команду АЦП (tiny45) начать преобразование сигнала (как я понял преобразование это длится 13 тактов АЦП (не машинных)), после этого нужно дождаться преобразования и продолжить выполнение программы с полученным результатом. Не получится ли так: я дал команду начать преобразование, потом следом комманду прочитать результат - и в итоге результат не тот?
Правильно ли так: дал команду начать преобразование, зациклился в ожидании появления флага , прочитал результат, и дальше по программе?

И еще вопрос. Использую внешнее прерывание INT0. при появлении события на PB2 выполняю процедуру прерывания, при этом флаг I регистра SREG сбрасывается и по идее прерывание по появлению флага АЦП уже не сработает? (конечно, если заново не установить бит I в Sreg)
Не понимаю зачем такие сложности. Не знаю, как в вашем проекте. Насколько часто нужно запускать АЦП. Открыл свой последний проект с использованием АЦП. В девайсе было реализовано следующее: Переменные резисторы. В зависимости от положений роторов переменных резисторов меняется частота следования импульсов и число импульсов. То есть один резистор меняет частоту, второй - число импульсов. От 1 до 10.
Человеко-интерфейсы относительно медленные. Поэтому в данном случае АЦП не нужно слишком часто запускать. Я сделал тогда каждые 10 мс. Прерывания АЦП не использовал.
Код
Main:
wdr
rcall   Service_Timers
rcall   Proc_ADC
rcall   Proc_Pump
sleep
nop
rjmp   Main
Код
Proc_ADC и Proc_Pump - конечные автоматы. Proc_Pump нас не интересует. Состояния автомата Proc_ADC:
// current state            next state
_PROC_ADC_INIT            _PROC_ADC_TIMEOUT         // Инициализация, запуск таймера на 10 мс.
_PROC_ADC_WAIT_TIMEOUT         _PROC_ADC_WAIT_CONVERT      // Ожидание срабатывания таймера 10 мс. Инициализация ADC, запуск ADC.
_PROC_ADC_WAIT_CONVERT      _PROC_ADC_CONVERT_COMPLETE   // Ожидание преобразования.
_PROC_ADC_CONVERT_COMPLETE   _PROC_ADC_INIT            // Считывание результата в буфер и обработка.
Подпрограммы все написаны так: никаких долгих циклов. Выполнение кода и выход; проверка условий и выход; проверка условий, выполнения кода и выход. Как вы видите, в данный момент нет никаких метаний и телодвижений с прерываниями.
0
wypuk
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
15.10.2012, 10:56 20
Цитата Сообщение от dymyurk1978
ТС. Скажите, что вы делаете. Зачем АЦП, зачем внешнее прерывание. Я вам примерно напишу, как можно сделать.
Необходимо постоянно отслеживать сигнал с фотодатчика (АЦП PB4). Временные интервалы отсчетов - хотя бы раз в 2мс (если чаще, то лучше). Если сигнал превышает 1-й заданный уровень в течение какого-то промежутка времени (10-20 мс), то выставляем шимом 1-ю скважность сигнала на 1-м выходе (PB1). Если нет, то заново следим за АЦП.
При внешнем сигнале Int0 (PB2) выставляем 1-ку на 2-м выходе (PB3). Отслеживаем АЦП и если сигнал превышает 2-й заданный уровень в течение 2-го промежутка времени (5-10 мс), то выставляем шимом 2-ю скважность сигнала на 1-м выходе (PB1). Если нет, то задаем 3-ю скважность сигнала на 1-м выходе (PB1).
0
15.10.2012, 10:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2012, 10:56

Расширение АЦП микроконтроллера и подключение к АЦП датчиков
Здравствуйте. У меня встала задача сделать устройство для элеватора, для контроля температуры в 864...

Mega16 и неиспользуемый АЦП (питание ацп?)
Если я не использую АЦП контроллера нужно ли подавать на АЦП питание? Если нет, то просто оставить...

Вопрос по выбору АЦП
Всем привет! Есть теоретический вопрос, суть его такова : имеется два аналого-цифровых...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru