Господа, доброго времени суток. Пишу диплом, по причинам, не зависящим от меня, тему выдали поздно, и в результате штудировать учебники времени нет. А с Си и AVR я знаком до ужасного плохо. В чем соль. Нужно последовательно считывать данные с трех каналов АЦП и передавать их в UART. Но пока что мне не удается даже циклически отправлять значения с одного канала. Перепробовал кучу вариантов, приведу здесь тот, который мне кажется наиболее логичным. И насколько мне известно, механизм срабатывания прерываний такой же. Возникает прерывание - считыванием данные - отправляем - запускаем новое преобразование - ждем прерывания. Но у меня срабатывает только один раз. Предположение номер один - прерывания от UART и АЦП мешают друг другу. Предположение номер два - функция uart_putf() слишком большая для того, чтобы ее тыкать в прерывание. И в силу своей необразованности не могу ничего сделать. Пишу в AVR Studio. Может, поможете чем-нибудь?
не надо мудрить: алгоритм решения вашей задачи до смешного прямолинеен: в цикле считываем канал АЦП и отправляем результат - никаких прерываний. вот канва кода:
Можете задействовать только одно прерывание - от АЦП. И по нему считывать результат и отправлять в UART. Единственное, нужно настроить UART на такую скорость, чтобы он успевал отправлять результаты между измерениями.
P.S. пипец у Вас темы для дипломов... На уровне детского сада... Где учитесь, если не секрет? Сделаю себе пометку, чтобы не отдавать сына в это учебное заведение.
Кажется, я выспался и разобрался. Проблема была действительно в том. что обработчик прерывания для UART (а он используется в функции uart_putf() ), вложенный в обработчик прерывания АЦП - плохая идея. В общем, функцию-то написал, а как это должно работать, не продумал. Если в основной программе отправлять данные, прочитанные в переменные, то, вроде бы, все нормально. ARV, так-то да, и у меня что-то подобное по смыслу даже вышло поначалу. Но хотелось же на прерываниях сделать. ИС-пытатель, в харьковском авиационном. А я разве называл тему диплома и полную задачу?:)
сдается мне, что работает у вас исключительно по недоразумению насколько я могу полагаться на собственное знание avr-gcc, у вас отключена оптимизация - и только по этой причине код работоспособен и даже то, как он работоспосбен, будет для вас источником граблей в будущем - хотя бы по тому, что запуск преообразования вы делаете и из прерываний, и из основного цикла.
если у вас нет особых причин использовать прерывания, я продолжу рекомендовать мой подход
Насчет недоразумений - я более, чем уверен, что это так Каждый учился по-разному, нам в универе на ассемблере MC 51 вбили, что прерывания - это хорошо и ими нужно разгружать процессор. У Шпака в "Программировании на языке С.." тоже натолкнулся на такие рекомендации. Поэтому и уперся. Более того, в ближайшей перспективе есть желание проверить режим подавления помех АЦП и что он дает. А насколько я понял из даташита, работает он по прерываниям, т.к. основной процессор уходит в сон. Зачем? Ну, чем точнее данные об угловом положении беспилотника (да, полная тема диплома - автомат стабилизации положения), тем лучше. По крайней мере, проверить точно стоит. Не станет лучше - сделаю по-Вашему, оно действительно проще и понятней. За UART спасибо, попробую у себя реализовать.
Прерывания не разгружают процессор. Они все лишь упрощают написание программы. Но не везде их использование целесообразно.
Измерения в спящем режиме предназначены для того, чтобы уменьшить влияние частоты ядра процессора на измерения. Считается, что уменьшает шумы. Хотя, если хорошо спроектировать плату и развязать аналоговую и цифровую часть - то в этом надобности практически никакой - проверено опытным путем. Разобраться с даташитом если с английским не айс - сложно. Скачайте себе Евстифеева. Справочник по Мега и Тини. Тот же даташит, только обобщенный и на русском.
В любом случае при измерении у Вас как минимум 1 мл. значащий разряд будет "плавать". Чтобы убрать это можно либо брать усреднение по нескольким измерениям (т.е. увеличить частоту выборок и усреднить), либо, если это невозможно по техническим причинам - сделать то же усреднение, только методом скользящего окна - когда у Вас берется среднее между текущей выборкой и несколькими прошлыми.
Информации в инете полно. Думаю, разберетесь.
А вообще, Вам еще надо будет про ПИД-регуляторы почитать - тоже пригодится для стабилизации.
Последний раз редактировалось ИС-пытатель Вт апр 08, 2014 13:12:31, всего редактировалось 1 раз.
ИС-пытатель писал(а):Прерывания не разгружают процессор. Они все лишь упрощают написание программы.
Ну я бы не так сформулировал. Прерывания позволяют распараллелить задачу, совместив работу периферии с вычислениями вместо тупого ожидания готовности или по задержкам. Конечно, при условии, что для вычисления не понадобятся результаты текущего замера - например, занимаемся обработкой предыдущего.