таймер, обработчик, delay() - неск. вопросов по реализации
- Войдите на сайт для отправки комментариев
добрый день
### ЗАДАЧА
некий проек, написанный на "Ардуине/ATmega-328P", в нем активно используется delay()
планируется:
- по событию PCINT -> вызвать обработчик, в нем настроить и запустить таймер (одноразово) (еще не знаю в каком режиме и какой из 3х)
- по срабатыванию таймера (переполнение, сравнени не важно как) -> вызвать обработчик таймера
- в обработчике "сделать нечто" и "самоуничтожится" (отключиться)
- далее управление основному процессу
шаг с вызовом таймера нужен для подавления "шума" на входе PCINT (на "профильных" форумах рекомендуют задержку 50-200 мс)
### ВОПРОСЫ
1. возможно ли такая реализация задуманного?
есть подзрения, что из-за использования в проекте delay() могут быть как.либо "особенности и подводные камни" (я не знаю как реализована функция delay(), м.б. и с пом-ю таймеров, поэтому и закрались сомнения)
2. какой из таймеров/режим наиболее подходит под эту задачу
3. подводные камни такой реализации, мысли, идеи
спасибо
зю
ВОПРОС 4
у таймеров есть так называемый "подавитель шума"
как можно это использовать в поставленной задаче?
можно ссылки, ключевые слова итд
http://playground.arduino.cc//Main/LibraryList#Timing
http://playground.arduino.cc//Code/SimpleTimer
за ссылки спасибо
я их уже пытался "переварить" пару раз, но вопросы все равно остались
вопросы все равно остались
ВОПРОСЫ
1. возможно ли такая реализация задуманного?
есть подзрения, что из-за использования в проекте delay() могут быть как.либо "особенности и подводные камни" (я не знаю как реализована функция delay(), м.б. и с пом-ю таймеров, поэтому и закрались сомнения)
2. какой из таймеров/режим наиболее подходит под эту задачу
3. подводные камни такой реализации, мысли, идеи
4. у таймеров есть так называемый "подавитель шума"
как можно это использовать в поставленной задаче?
Доброго времени суток !
Я по поводу мысли :)
Отдавать таймер на подобную мелоч просто давит большая и зеленая жаба !
Предлагаю другой вариант:
Ввести глобальную переменную-счетчик:
volatile unsigned int debonce = 0;
В цикле loop вставить:
if (debonce) debonce--;
А в обработчик прерывания вставить в самом начале:
if (debonce) return;
debonce = 20000;
далее обработчик.
20000 это количество циклов loop после которых прерывание опять начнет обрабатываться, в зависимость от тяжеловесности loop это число может увеличиваться или уменьшаться.
не получится, исходный проект написан так... весь на лупах, т.е. основной цикл может затормозить вообще в каком ни будь "пункте", просто будет тупо ждать нажатия на кнопьку, поэтому до конца лупа может и не дойти... короче исходный материал такой...
ценный ресурс должен быть использован в самом максимальном своем проявлении, имхо!!! :о)
Ну тогда несколько другой вариант:
по срабатыванию PCINT отключаем прерывание PCINT или хотябы бит кнопки, после обработки стартуем таймер (допустим 2) и выходим из обработчика, по прерыванию от таймера включаем прерывание от кнопки и выключаем таймер.
именно так и планируется (в топике же описано)
вопросы были несколько о другом :о)
итого:
Вопрос 1. (ответ, видимо, возможно :о)
Вопрос 4. (ответ нет)
остались три вопроса:
- какой из режимов таймера1 наиболее подходит под эту задачу?
- подводные камни такой реализации, мысли, идеи, учитывая что в проекте используется кондовые ардуиновские функции delay() etc... ?
- вызов таймера может нарушить работу ардуиновских функций delay(), etc... ?
есть вопросы "по ходу дела" (не буду создавать новый топик)
- c код более быстрый чем c++ ? (да-нет, почему)
- превод проекта с "ардуино" на avr-c (то есть на нативный cи) это возможно? (да, нет, почему, какие особенности)
что такое Си++ я понимаю, про "надстройки" и "модификации"... :о)
непонятен такой момент: для сбоки си и си++ используются разные команды (на сколько я помнил все это время), ну и естественно итог как бы разный (не зря же опенсорсное общество не любит писать на си++, пишут в основном на си, об этом читал на форумах, и пр.статьях)
дак вот, где, на каком этапе, в каком месте (что где когда) ардуино понимает что "код у нее в виде си" и она собирает его, соответсвенно, как си и... наоборот с си++
может я ошибаюсь, поправьте и добавьте...
Самые первые компиляторы c++ вместо объектного кода генерировали исходный код на чистом c.
Сейчас, понятное дело, это не так. Что касается разных команд:
вот пример компиляции объектного файла на c: g++ myfile.c -o myfile.o
и ровно тоже самое на с++: g++ myfile.cpp -o myfile.o
GNU C "понимает" тип обрабатываемого файла с исходным кодом по его расширению. Однако, это можно и обойти:
g++ -x cpp myfile.x -o myfile.o
Относительно "скорости". Вследствие того, что для arduino в основном применяется обычный GNU C, то в целом качество полученного объектного кода будет примерно равным.
ладушки, спасибо!
...
...