Многоканальный программный ШИМ в AVR / Geektimes
Софт. Программы для компьютера. Для пк

Иногда в наших самодельных устройствах требуется контролировать время сколько прошло Лучший вариант это RTC часы реального времени. Но многие простенькие самоделки не стоят того, и можно применить какой-нибудь простенький програмный таймер. Я неоднократно применял таймер в своих поделках, например для разрядки аккумуляторов с подсчетом их емкости. Мой таймер успевал выполнить свою работу по подсчету времени и выводу на экран, но еслиб программа была бы более насыщенной то для моего таймера просто бы не хватало времени и результатом его работы была бы полная фигня.

Всвязи с выше изложенным я написал "Идеальный таймер": Этот таймер не может быть поврежден ни какой программой если не ковырять очень глубоко. С этим таймером я пробовал все, даже пиликать мелодию. Таймер работает изумительно, конечно в пределах точности кварца ардуинки, и ни что не может сбить его ход. И функция Tone будет конфликтовать, там тоже, вроде бы таймер2.

Но в большинстве случаев использование таймера возможно На прощание фотка как это выглядит на дисплейчике Nokia Скетчик моргает светиком 13, измеряет температуру, пишет в Serial и поет песенки. На таймере это не отражается ни как Прерывания тоже не всегда и все могут быть обработаны и запросто могут быть потеряны.

Любое прерывание со старшим приоритетом может помешать. Это одна тысяча прерываний в секунду. Вход в прерывание, операция с чудовищным по разрядности числом 32 бита , выход из прерывания. Это "ый" таймер платформы ардуино, ну чем он вам не угодил? Может быть вы не умеете структурировать код своего приложения, если такой роскоши без кавычек недостаточно? Так тут на форуме "пришпилено" одно из решений, хук на таймер возможность привязать свою функцию , что при всей спорности подхода мЕньшее зло, чем то, о чем вы пишете.

Вы сторонней библиотекой вводите второй миллисекундный таймер, Timer2. Это еще одна тысяча вдобавок дергания МК в секунду. Оба таймера в смысле Timer0 и Timer2 трудятся, не покладая рук или что у них там. Еще операции с 32 битными числами на 8 битном МК. Об "неубиваемости" уже написали. Ну и судя по вашим примерам, характерное время для вас - секунды часы обновить интервалом времени, не временем.

И что бы не использовать для этого Timer1, ти битный счетчик, способный отсчитывать секунды? Все хотят идеальный таймер я тоже хочу. Но так таймер, не идеальный, просто таймер, делать не принято. Если нужны секунды, то можно использовать watchdog таймер с делителем. Он, как-бы никому не нужен и судя по даташиту, как раз и предназначен для таких целей RTOS , кроме задачи "будить МК". По этим решениям - в целом одинаково, что первое что второе. Сильно зависит от использования ресурсов, вам верно отписали: В этом плане timer0 millis предпочтительней - шансов "переселять" существенно меньше.

Когда начинает играть музыка, показания секунд наглухо останавливаются. Но если пиликать музыку без этой функции, то все нормально, прерывания почти, можно сказать совсем не портят музыку. Я пока ковырялся с этим таймером, понял, что все можно высчитать из millis , Но подскажите, пожалуйста, как сделать, чтобы показания таймера на экране обновлялись ровно один раз в секунду, независимо от хода основной программы, как рационально использовать имеющиеся таймеры?

Уверен, что вариант получше существует, но так как я не спец в программировании, то мне он пока не виден. Там какбэ бенчмарк экрана, ресуются всякие линии квадратики, выводится рисунок.

Без встраивания функции таймера в конце теста показывает 47ххх миллисекунд, со встроенной функцией таймера, который выводит в сериал секунды, минуты часы, получилось тоже 47ххх миллисекунд. Абсолютно не заметно, что таймер мучает этот пример своими прерываниями. Так это верно для любой "функции", особенно если она проста и локально-замкнута не портит что-то извне себя. На самом деле вас зазря несколько напугали. Обработчик таймера что 0, что ваш отработает за примерно микросекунды..

Программные таймеры avr

Вы такое способны заметить на глаз? Вот Вы не поверите - в PC всего один таймер и на нём всё вмещается. В прерывании таймера делаем софтовые делители, по которым вызываем процедуры. Это называлось перехват прерывания. Код не нативный, это шаблон, простите паттерн. Такаыя схема позволяет работать прерываниям без конфликтов, не трогает то, что было в обработчике прерываний.

В каждом отдельном обработчике прерываний можно зависнуть сколь угодно долго, это не повлияет на другие обработчики. Спасибо за скетчи, за интересную ссылочку. Теперь опять придется напрягать мозг, чтобы это все понять. Все ещё печальней, там даже не кварц, так - керамический резонатор. Честно говоря оба варианта ни в козу ни в Красную Армию Мне нужно контролировать процесс, который занимает по времени не более 3-х часов.

Эти 5 секунд не имеют для меня ни какого значения. Еслиб это было критично, то поставил бы DS, за которыми наблюдаю уже больше месяца. Уход от атомных за это время менее 2-х секунд. Можно поиграться с калибрующим регистром, таковой есть на , не знаю есть ли на Пример faeton, работать не будет, и я уже где-то тут это указывал. Код, пригодный на писюках, а равно как и методики и советы по программированию, здесь по большей или просто вредны один из таких ляпов - даже прибит гвоздиком про оптимизации от ЕвгенияП, второй ляп про переписывание виртуальных рюшек в потоках ввода-вывода уже утонул или вовсе не рабочие как этот пример с прерываниями.

Ну когда страсти поутихли, давайте отвечу за свои слова. Почему то, что вы написали - "плохо" в кавычках. Первая причина в том, что вы вдобавок к имеющемуся миллисекундному таймеру millis , чтоб она здорова была добавили еще один миллисекундный таймер через библиотеку MsTimer2. Для работы с интервалами с характерным временем 1 сек это не лучшее решение. Эту цифру я даю не оценочно, эта цифра считается по выполняемым инструкциям МК. Вы их используете "хуком" из прерывания таймера Timer2.

В момент срабатывания таймера, управление передается функции пользователя в контексте текущего прерывания, то есть с глобально запрещенными прерываниями. Вы пишете, что на масштабе 3 часов ваш таймер уходит на сек. То, что такое поведение для вас не критично, не говорит в пользу ИТ.

Этот код демонстрирует часто используемый прием - структуризацию приложения, когда исполняется та его ветка, которая должна исполняться. Некоторые такую организацию называют State Machine, некоторые по-другому. В контексте нашего разговора такая организация хорошо подходит для секундного таймера. Составляя этот пример, старался не скупиться на комментарии.

Сделать так, чтобы он пропустил счет. IMHO 1 сек для 16 МГц МК - это достаточно много, и если не удается с чем-то управиться за 1 сек, то скорее всего это признак неправильной работы с этим "чем-то". ИТ это, конечно, считаться не может, просто аккуратный секундный программный таймер, как вы и заказывали. И еще - используемый в примере ресурс 16 бит Timer1 - дорогой ресурс, у младших AVR он если есть, то один. Для моих интересов ИТ секундный представляет собой внешний "часовой" Для ATMegaP это означает рабочие 8 МГц вместо ти и потерю для других целей асинхронного Timer2.

Для каких-то задач это нормально. Во-первых, спасибо что откликнулись на мой вопрос, спасибо за обстоятельный ответ. Благодаря этуму форуму многие вещи становятся для меня более-менее понятными. Вы не представляете как это приятно - общаться с адекватным человеком, без понтов с любой стороны. Потом прийдут другие и поправят это интересная тема или выскажут свое мнение.

Программный таймер. Применение HAL

Надеюсь что пример поведения а не идеальный таймер брать будут у вас. Чем приведённый мной алгоритм неприменим на на МК? Компилиповаться не будет, разумеется, я не знаю ассемблер меги и привёл писюковую нотацию. И не знаю как в С перехватить прерывание. Тут этот подход как-бы "принципиально" невозможен. Я уже писал где-то ранее, если не вам, то на похожее предложение. У МК - "гарвардская архитектура", и вектора прерывания находятся во флеше, а не ОЗУ. То есть адрес обработчика прерывания фиксирован этапом компиляции программы.

Можно, конечно, используя команды lpm,spm его изменить "по ходу исполнения", но есть серъезные ограничения. Писать во флеш можно только из ДРУГОГО куска флеша.. То есть, ваш подход предполагает изменения как в системе компоновке программы перенастройка сценария линковщика , так и изменение в загрузчике, чтобы он имел методы, вызывая которые можно переписыать таблицу векторов.

Второй способ предполагает единый обработчик, который будет косвенно вызывать реальную программу по таблице, которая лежит в ОЗУ. Это очень медленный и расточительный способ, поэтому применяется только частично в wiring: Вполне нормальный и верный разбор ситуации.

Разница между ними микросекунды. Так что совсем не много времени расходует таймер. Функция таймера - зарегистрировать истечение заданного количества отсчетов. В вашем случае это число "", которое вы передаете в строке MsTimer Эта функция к собственно таймеру отношения не имеет. В ваших примерах вы пишете в Serial и, видимо, обновляете Nokia Другие включают насос, например.

Один физический таймер может управлять многими процессами, оформленными в коде в виде функций. Ранее вы писали, что "встраивали функцию таймера" в графический бенчмарк , и время выполнения бенчмарка в миллисекундах не изменилось, от слова совсем. Теперь вы пытаетесь замерить количество микросекунд от начала до окончания выполнения "функции таймера" и получаете очень наглядный результат.

На основании этого результата вы делаете вывод. Например включив в "функцию таймера" маленькую задержку. В том, что ваш таймер уходит на секунд за 3 часа вы не видите ничего тревожного.

Программные таймеры avr

А ведь это очевидно указывает, что Timer2 теряет счет, что ваша "функция таймера" отрабатывает больше 1 миллисекунды. На этом результат использования библиотеки MsTimer2 закончил. Да все там править, раз не сумел внятно написать. Если в контексте прерывания время измеряют. Видимо я что-то не правильно делаю Может делаю глупость, измеряя неправильно время Думаю, мне простительно, так как моя профессия столяр.

Ошибок по деревяшкам себе бы не простил, а в программировании вполне допустимо: Раз у вас работает ваш таймер и вы им удовлетворены, значит все вы для себя делаете правильно. Ваша "функция таймера" его отключила. Обработчики по переполнению таймеров что millis , что MsTimer2 отключены во время работы вашей "функции таймера".

И заканчивайте с извинениями, тут нет кисейных барышень и вы не из числа, да и с такой достойной профессией. Я, наверное, что-то не понимаю, но чем Вам не нравится таблица векторов прерываний по адресу 0x? Что мешает утащить из неё адрес обработчика, который библиотекой среды назначен, и подставить туда свой? Потому как это дерьмовенький показатель даже для дешевых китайских тикалок.

А уж фраза " Этот таймер не может быть поврежден ни какой программой "?! А что за словесной пургой - обычный делитель тактовой частоты на таймере 2 да еще не самой лучшей организации. С таймером напрямую чего не работаем? Остальные считали что это бюджетное, компромисное решение с очень ограничеными возможностями. Но про ограничения Вы не написали, по крайнерь о всех и сразу. Уж точно красивее предложенного и цена бросовая. Такое впечетление, что делали тему из ничего на спор. Разве не в RAM таблица векторов прерываний?

Сейчас вижу, что "Идеальный" надо было поставить в кавычки, чтобы не злить АССов программирования. Посто делаю сейчас простенькое устройство, "контроллер" температуры контроллер пишу в кавычках, чтобы потом не отругали, так как контроллер совсем и не контроллер, а электронный термометр, который при достижении определенной температуры на разных этапах подает звуковой сигнал и требует ручного вмешательства. В программе будет предусмотрено измерение времени прохождения этапов используется именно этот таймер , весь процесс займет не более 2х часов и ошибка в 5 сек не заставит меня застрелиться.

Еще будет простенькое меню, включить-выключить подсветку экрана и задать параметры, если будет в этом надобность и записать их в EEPROM для использование на будущее. А так как внастоящее время прекрасно справляюсь стеклянным градусником, то все это затеяно как этюд, практическое занятие программированием, да и в конечном итоге будет удобное законченное устройство.

Потом выложу, может кому-то и будет интересно, может в чем-то и поможет. Понимаю, что АССам заподло будет читать бред новичка, а новички, надеюсь оценят. У меня стоит DS в самодельных часиках со стрелочками. Они негромко тикают у меня в комнате уже давным-давно и очень радуют меня своей точностью и несбиваемостью при отключении электроэнергии. Для новичков, может кому и пригодится А вот Вы обиделись на него зря и забоялись АССов.. Молодсть - тот недостаток, который с каждым днем проходит, однако.

И контроллер температуры у вас вполне себе контроллер и без кавычек.. И выложить законченное устройство - завсегда полезно и "в струе майнстрима" - то бишь правил разработок на Ардуино, в отличии от "жадин", которые вопрошают "как защищить скетч" будто он тут может быть кому-то нужен до зарезу..

Все хорошо для своего, конкретного применению попадалову. Из гнилого получается только гнилое. Разве чтоб потом вывести отчет, типа процесс длился стокото И чего было вобще лезть к таймеру2, на пересчете миллис получится ну ничем не хуже. Хотя дайте угадаю, Вы приципили термометр, обнаружили что в его либе блокирующий вызов пошти секунда, и это вызвало пропуски при подсчете секунд.

И в моей программе все временные помежутки расчитываются из millis. А Timer2 применяется лишь для красивого, неполамаемого посекундного вывода времени на экран. Может совершенно ненужная фишка, но я же говорил, что этот скетч - этюд по программированию, тренировка мозга и приобретение навыков. Пока мне нравится то, что у меня получается. Скоро закончу скетч и выложу видео работы на макетке. Так если с датчиками работать правильным путем, то и время на millis отрисовыватся будет верно. Как раз доделываю сильно похожее ко крайней мере по функциональному назначению устройство.

Только я себе еще такую фишку хочу, автоматика должна сама ловить момент начала процесса, по динамике изменения температуры куба. И возможно потом кое чем поуправляю, но то потом. Так же градусы продукта на выходе интересно бы автоматом контролировать. В общем тема куда более интересная чем таймер. Разве что если лог сделаю, то туда временные метки в минутах писать. А мне еще показалось, что температура на всех этапах процесса еще зависит и от атмосферного давления.

Программные таймеры avr

Заказал в Китае 2 барометрических датчика, ждал 60 дней, так и не пришли, пришлось забрать деньги. Придется снова заказывать датчики. В своей конструкции оставлю место под барометр. Там есть зависимость, но не сильная, порядка десятых долей градуса при обычных колебаниях давления. Вроде как это существенно только при реактификации, при дистиляции на фоне остального теряется просто.

Хотя на ректификации ловим стабилизацию относительной температуры и по ней работаем. Среда разработки Программирование Контроллеры Arduino Проекты Форум Купить в России. Войдите или зарегистрируйтесь , чтобы получить возможность отправлять комментарии 69 ответов [ Последнее сообщение ]. Подскажите, пожалуйста, какой из вариантов идеальней? Войдите или зарегистрируйтесь , чтобы получить возможность отправлять комментарии.

Сходу - первая предпочтительней. Но надо смотреть что там в библиотеке. Честно говоря оба варианта ни в козу ни в Красную Армию. Спасибо faeton, Спасибо Клапауций Попробую оба, предложенные, варианта. Попробовал копипастом оба скетча откомпилировать. То есть, по сути изменить ВЕСЬ подход от компиляции, до загрузки прогаммы. В общем, во всех отношениях - гемморой и немалый. Только мое занудство пишет этот пост. Ну и может кто-то это читает, разыскивая идеальный таймер.

Весь этот флуд в поисках идеального таймера. Мешает процесс записи во флеш из исполняемой в том же участке программы. Потому и угадываю легко Только я себе еще такую фишку хочу, автоматика должна сама ловить момент начала процесса, по динамике изменения температуры куба. Фото-видео тож могу запостить, как на днях испытания сделаю.

Опубликовано в рубрике Ati radeon hd
Twitter Delicious Facebook Digg Stumbleupon Favorites More
  • Прикрепленное видео

Все права защищены. © 2001 toozza.ru