таймер, обработчик, delay() - неск. вопросов по реализации

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

добрый день

### ЗАДАЧА

некий проек, написанный на "Ардуине/ATmega-328P", в нем активно используется delay()

планируется:

- по событию PCINT -> вызвать обработчик, в нем настроить и запустить таймер (одноразово) (еще не знаю в каком режиме и какой из 3х)
- по срабатыванию таймера (переполнение, сравнени не важно как) -> вызвать обработчик таймера
- в обработчике "сделать нечто" и "самоуничтожится" (отключиться)
- далее управление основному процессу

шаг с вызовом таймера нужен для подавления "шума" на входе PCINT (на "профильных" форумах рекомендуют задержку 50-200 мс)

### ВОПРОСЫ

1. возможно ли такая реализация задуманного?
есть подзрения, что из-за использования в проекте delay() могут быть как.либо "особенности и подводные камни" (я не знаю как реализована функция delay(), м.б. и с пом-ю таймеров, поэтому и закрались сомнения)

2. какой из таймеров/режим наиболее подходит под эту задачу

3. подводные камни такой реализации, мысли, идеи

спасибо

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

зю

ВОПРОС 4
у таймеров есть так называемый "подавитель шума"
как можно это использовать в поставленной задаче?

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

можно ссылки, ключевые слова итд

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

за ссылки спасибо

я их уже пытался "переварить" пару раз, но вопросы все равно остались

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

вопросы все равно остались

ВОПРОСЫ

1. возможно ли такая реализация задуманного?
есть подзрения, что из-за использования в проекте delay() могут быть как.либо "особенности и подводные камни" (я не знаю как реализована функция delay(), м.б. и с пом-ю таймеров, поэтому и закрались сомнения)

2. какой из таймеров/режим наиболее подходит под эту задачу

3. подводные камни такой реализации, мысли, идеи

4. у таймеров есть так называемый "подавитель шума"
как можно это использовать в поставленной задаче?
 

sva1509
Offline
Зарегистрирован: 07.12.2012

Доброго времени суток !

Я по поводу мысли :)

Отдавать таймер на подобную мелоч просто давит большая и зеленая жаба !

Предлагаю другой вариант:

Ввести глобальную переменную-счетчик:

volatile unsigned int debonce = 0;

В цикле loop вставить:

if (debonce) debonce--;

А в обработчик прерывания вставить в самом начале:

if (debonce) return;

debonce = 20000;

далее обработчик.

20000 это количество циклов loop после которых прерывание опять начнет обрабатываться, в зависимость от тяжеловесности loop это число может увеличиваться или уменьшаться.

 

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

не получится, исходный проект написан так... весь на лупах, т.е. основной цикл может затормозить вообще в каком ни будь "пункте", просто будет тупо ждать нажатия на кнопьку, поэтому до конца лупа может и не дойти... короче исходный материал такой...

ценный ресурс должен быть использован в самом максимальном своем проявлении, имхо!!! :о)

sva1509
Offline
Зарегистрирован: 07.12.2012

Ну тогда несколько другой вариант:

по срабатыванию PCINT отключаем прерывание PCINT или хотябы бит кнопки, после обработки стартуем таймер (допустим 2) и выходим из обработчика, по прерыванию от таймера включаем прерывание от кнопки и выключаем таймер. 

 

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

именно так и планируется (в топике же описано)

вопросы были несколько о другом :о)

итого:

Вопрос 1. (ответ, видимо,  возможно :о)

Вопрос 4. (ответ нет)

остались три вопроса:

- какой из режимов таймера1 наиболее подходит под эту задачу?
- подводные камни такой реализации, мысли, идеи, учитывая что в проекте используется кондовые ардуиновские функции delay() etc... ?
- вызов таймера может нарушить работу ардуиновских функций delay(), etc... ?

 

 

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

есть вопросы "по ходу дела" (не буду создавать новый топик)
- c код более быстрый чем c++ ? (да-нет, почему)
- превод проекта с "ардуино" на avr-c (то есть на нативный cи) это возможно? (да, нет, почему, какие особенности)
 

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

что такое Си++ я понимаю, про "надстройки" и "модификации"... :о)

непонятен такой момент: для сбоки си и си++ используются разные команды (на сколько я помнил все это время), ну и естественно итог как бы разный (не зря же опенсорсное общество не любит писать на си++, пишут в основном на си, об этом читал на форумах, и пр.статьях)

дак вот, где, на каком этапе, в каком месте (что где когда) ардуино понимает что "код у нее в виде си" и она собирает его, соответсвенно, как си и... наоборот с си++

может я ошибаюсь, поправьте и добавьте...
 

leon_mz
Offline
Зарегистрирован: 06.12.2013

Самые первые компиляторы 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, то в целом качество полученного объектного кода будет примерно равным.

 

 

 

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

ладушки, спасибо!

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

...

sunjob
sunjob аватар
Offline
Зарегистрирован: 18.07.2013

...