Мега принципиально не умеет работать с несколькими прерываниями — у нее нет стека соотвественно невозможно вызывать прерывание из прерывания, а не основного цикла. Первое прерывание будет перебито вторым и произойдет потеря данных, но это крайне редкие случаи в системах (когда накладываются два прерывания) для которых предназначена Мега (за все мое время использования меги такое случалось 1 раз при тестировании вложенных прерываний — то есть было искусственно вызвано)
Для решения таких задач (иерархичность прерываний) лучше использовать ARM.
Вот что происходит если пытаться убрать дребезг с помощью конденсатора… Резистор 250 Ом имитирует входное сопротивление порта меги (5В; 20мА)
Что-бы не разводить холивар пример антидребезгового алгоритма с сайта DiHalt-a:
Алгоритм прерывания с антидребезгом будет выглядеть так:
Зашли в обработчик INT0
0 или +1
Запретили локально INT0
Поставили на таймер событие разрешающее INT0 через несколько миллисекунд
Вышли из обработчика
да ладно? А кто мешает обработать дребезг программно, аналогично способу примененному в программе автора?
Кроме того, избавиться от дребезга (особенно дребезга раздолбанной кнопки) емкостями не получится. Все равно придется делать программную «защиту»
Если в двух словах:
Прерывания — это аналог «события» в языках высокого уровня. То есть случается у вас смена уровня на ножке, переполнения таймера, или другое событие (см. документацию) вызывается участок кода, который отвечает за обработку этого события (вы сами пишите что делать). То есть работает основной цикл, что-то считает, отправляет, и тут вдруг изменилось значение на ноге (или выставилось заданное) под действием внешних источников (кнопка, геркон, другой МК, внешняя микросхема) — вызвался кусок кода который его посчитал. Дальше управление передается в основной цикл программы в то место где прервалось. Прерывания позволяют реагировать на внешние события не отвлекаясь на постоянное ожидание, а когда же оно случится, и позволяет (в большинстве случаев) не пропустить это событие.
Спящий режим — это режим сниженного энергопотребления. Мега может просыпаться по множеству условий («Собачий таймер», сброс, прием по USART, по прерыванию INT0/INT1, и т.д.), Режимов сна много, отличаются тем что работает, а что отключено. Соответственно разные способы выхода из сна. Рекомендую обратиться к даташиту на мегу, там все подробно и просто (с примерами).
Упомянутый пульт ДУ работает по алгоритму: если нажата кнопка — подается питание на контроллер он отрабатывает нажатие, кнопка отпускается — батарейка физически отключается от контроллера. Время нажатия вполне достаточно для обработки всего что нужно и отправление контроллера в сон (хотя там не контроллер а спец микросхема). Но данный алгоритм вполне можно приспособить с помощью прерываний и глубокого сна к меге (что-бы не снимать с нее питание полностью).
Если интересуетесь электроникой, и микроконтроллерами (от Atmela до ARM) рекомендую заглянуть на сайт DIHALT -а easyelectronics.ru, но предупрежу что DiHALT недолюбливает Ардуино (ввиду негуманной цены и еще много чего), даже разработал свою отладочную плату — очень занятная. Хотя я предпочитаю изготавливать платы сам исходя из задачи. На его сайте и на Хабре полно статей с описанием технологии. Хотя подход к задаче зависит от задачи, желания и фазы луны.
Похоже я вчера погорячился, в час ночи-то. Сеи гневные комментарии не в адрес автора (хотя и в его адрес, в какой-то мере), а в адрес Ардуино, и ее способности заставать человека забивать гвозди Адронным Коллайдером. Скоро в место пары обычных TTL/CMOS вентилей будем лепить ноутбук с вебкой для фотографирования показаний счетчика и связью с кластером на пару гигафлопс для распознавания этих фоток (и пробегающего мимо котика :) )
для Ардуино надо back up питание прикрутить от батарейки
И тут мы возвращаемся к режиму экономии энергии? Как говорится ниже, самое «геморойное» — это организация резервного питания, и тут на первое место выйдет экономия энергии резервного источника. В предложенном варианте, аккумулятор вполне может стать основным источником питания и заряжаться от сети ровно тогда когда нужно и есть питание (думаю это будет случаться раз в месяц или реже).
Автор не заморачивается прерываниями и спящим режимом — delay и поскакали дальше.
Да конечно, прерывания и спящий режим — это ужасно сложно. Аж целых 10 строк кода. А использовать таймер вместо delay это совершенно невозможно, ведь нужно написать целых 3 строки кода — какой ужас.
А ничего что автор по http текстовку в «sendHTTPRequest(); » гоняет, байтом больше\меньше…
rclient.println(request);
rclient.print(«Host: „);
rclient.println(server);
rclient.println(“Authorization: Basic UmI9dlPnaJI2S0f=»); // Base64 строка, полученная со значения «user:password»
rclient.println(«User-Agent: Arduino Sketch/1.0»);
rclient.println();
rclient.stop();
Тут все-таки не на байт больше, а если учесть заголовок HTTP то вообще абзац будет. Боюсь если все станут использовать такой подход («байтом больше, байтом меньше») то и грядущего 5G не будет хватать для «Интернет вещей» и «Умного дома».
void loop() {
delay(1000); // Задержка в 1 сек, пусть будет :)
// Проверяем состояние всех счетчиков
for (int i=0; i<6; i++) {
boolean changed = CounterBouncer[i].update();
…
}
Сея конструкция просто потрясающая. А если счетчик сработает 2 раза в секунду? Или есть причины, которых мы не знаем, по которым счетчик не может сработать более 2 раз в секунду (неплохо бы написать в статье в таком случае) или что-то не так с этим куском кода и доверять прибору нельзя вообще…
Для начала стоит задуматься над тем сколько нужно TCP пакетов для передачи единственного int32 значения.
А потом стоит посмотреть как работает пульт телевизора в плане экономии энергии, что такое powerdown контроллеров Atmel и что такое WakeUp через reset, вопросы «пропадания» питания отпадут сами-собой. В таком режиме контроллер будет работать от батарейки месяцами! В качестве направления для размышлений:
Алгоритм программы крутится вокруг: проснуться, инкрементировать значение в EEPROM, отправить (если нужно), уснуть, долгий сон (вода ведь не постоянно льется?) проснуться…
по факту. Упал — вскрыли дрон — в нем «копия паспорта владельца» (см. пункт о допуске). Если «не зарегистрирован» то согласно тяжести нанесенного ущерба и уголовку могут возбудить…
А насчет радар не возьмет — это вы заблуждаетесь, возьмет еще как, вот только тыкать радар в каждый город я бы не стал.
Ну Эйнштейн как-бы совершал открытия «на обрывке старого конверта», а для «попробовать» потребовалось запустить целую группировку спутников :)
По существу:
Комментарии ув. отца физика и цитата из учебника (см. комментарии выше) развеивают надежду на положительной исход эксперимента, но я все же надеюсь, что данные полученные в результате опыта и его (опыта) конфигурация натолкнут последователей на новые нестандартные решения, тем самым приблизив решение проблемы термоядерного синтеза.
Да не стоит, думаю. Прибор довольно просто «гуглится». Я по недосмотру думал что появился какой-то аналог данного преобразователя, вот и поинтересовался.
Можно чуть по подробнее про преобразователь +5В в +400В.
Если я правильно помню на Радиокоте этот преобразователь был реализован как импульсный с удвоителем напряжения. Но его мощность оставляла желать лучшего (даже 1 СБМ-20 при достаточно сильном фоне, просаживал напряжение), кроме того нужно мотать трансформатор -довольно неудобный надо сказать (особенно если пытаться запихнуть в маленький корпус).
коэффициенты -inf / +inf
соответственно область коэффициентов -inf… 0 синапс тормозящий
0… +inf синапс возбуждающий
Пороговая функция: выходное значение модели -1/1 либо 0/1 кому как нравится (более подходит в данном конкретном применении).
Сигмоида: любое значение в пределе [-1..1] ( [0..1])
Вы презентацию-то смотрели? Там довольно подробно объясняется как это работает.
давайте договоримся о терминах (с тех пор как я читал книги видимо что-то изменилось) я имею ввиду искусственный нейрон который имеет N взвешенных входов и функцию суммирование с порогом (либо сигмоида) и имеющим один выход.
Это связанно лишь с передачей сигнала между нейронами в головном мозге (читай синапсе). А точнее с таким веществом как медиатор (нейротрансмиттер а английской нотации). К сожалению сигнал «0» не имеет возможности распространяться в биологической нейросети. Технические (Перцептроны) нейроны — лишены этого недоставка, по этому мы можем передавать сигнал «0» и использовать его по своему усмотрению.
Кроме того отмечу, что если с помощью вашей модели мы выделяем подмножество из множества, разве не очевидно, что результат вычитания подмножества из исходного множества является дополняющим множеством? Соответственно мы можем трактовать отсутствие сигнала, как попадание входных значений в дополняющее множество (так как третьего не дано).
Для решения таких задач (иерархичность прерываний) лучше использовать ARM.
Что-бы не разводить холивар пример антидребезгового алгоритма с сайта DiHalt-a:
Кроме того, избавиться от дребезга (особенно дребезга раздолбанной кнопки) емкостями не получится. Все равно придется делать программную «защиту»
Прерывания — это аналог «события» в языках высокого уровня. То есть случается у вас смена уровня на ножке, переполнения таймера, или другое событие (см. документацию) вызывается участок кода, который отвечает за обработку этого события (вы сами пишите что делать). То есть работает основной цикл, что-то считает, отправляет, и тут вдруг изменилось значение на ноге (или выставилось заданное) под действием внешних источников (кнопка, геркон, другой МК, внешняя микросхема) — вызвался кусок кода который его посчитал. Дальше управление передается в основной цикл программы в то место где прервалось. Прерывания позволяют реагировать на внешние события не отвлекаясь на постоянное ожидание, а когда же оно случится, и позволяет (в большинстве случаев) не пропустить это событие.
Спящий режим — это режим сниженного энергопотребления. Мега может просыпаться по множеству условий («Собачий таймер», сброс, прием по USART, по прерыванию INT0/INT1, и т.д.), Режимов сна много, отличаются тем что работает, а что отключено. Соответственно разные способы выхода из сна. Рекомендую обратиться к даташиту на мегу, там все подробно и просто (с примерами).
Упомянутый пульт ДУ работает по алгоритму: если нажата кнопка — подается питание на контроллер он отрабатывает нажатие, кнопка отпускается — батарейка физически отключается от контроллера. Время нажатия вполне достаточно для обработки всего что нужно и отправление контроллера в сон (хотя там не контроллер а спец микросхема). Но данный алгоритм вполне можно приспособить с помощью прерываний и глубокого сна к меге (что-бы не снимать с нее питание полностью).
Если интересуетесь электроникой, и микроконтроллерами (от Atmela до ARM) рекомендую заглянуть на сайт DIHALT -а easyelectronics.ru, но предупрежу что DiHALT недолюбливает Ардуино (ввиду негуманной цены и еще много чего), даже разработал свою отладочную плату — очень занятная. Хотя я предпочитаю изготавливать платы сам исходя из задачи. На его сайте и на Хабре полно статей с описанием технологии. Хотя подход к задаче зависит от задачи, желания и фазы луны.
И тут мы возвращаемся к режиму экономии энергии? Как говорится ниже, самое «геморойное» — это организация резервного питания, и тут на первое место выйдет экономия энергии резервного источника. В предложенном варианте, аккумулятор вполне может стать основным источником питания и заряжаться от сети ровно тогда когда нужно и есть питание (думаю это будет случаться раз в месяц или реже).
Да конечно, прерывания и спящий режим — это ужасно сложно. Аж целых 10 строк кода. А использовать таймер вместо delay это совершенно невозможно, ведь нужно написать целых 3 строки кода — какой ужас.
Тут все-таки не на байт больше, а если учесть заголовок HTTP то вообще абзац будет. Боюсь если все станут использовать такой подход («байтом больше, байтом меньше») то и грядущего 5G не будет хватать для «Интернет вещей» и «Умного дома».
Сея конструкция просто потрясающая. А если счетчик сработает 2 раза в секунду? Или есть причины, которых мы не знаем, по которым счетчик не может сработать более 2 раз в секунду (неплохо бы написать в статье в таком случае) или что-то не так с этим куском кода и доверять прибору нельзя вообще…
А потом стоит посмотреть как работает пульт телевизора в плане экономии энергии, что такое powerdown контроллеров Atmel и что такое WakeUp через reset, вопросы «пропадания» питания отпадут сами-собой. В таком режиме контроллер будет работать от батарейки месяцами!
В качестве направления для размышлений:
Алгоритм программы крутится вокруг: проснуться, инкрементировать значение в EEPROM, отправить (если нужно), уснуть, долгий сон (вода ведь не постоянно льется?) проснуться…
А насчет радар не возьмет — это вы заблуждаетесь, возьмет еще как, вот только тыкать радар в каждый город я бы не стал.
По существу:
Комментарии ув. отца физика и цитата из учебника (см. комментарии выше) развеивают надежду на положительной исход эксперимента, но я все же надеюсь, что данные полученные в результате опыта и его (опыта) конфигурация натолкнут последователей на новые нестандартные решения, тем самым приблизив решение проблемы термоядерного синтеза.
Если я правильно помню на Радиокоте этот преобразователь был реализован как импульсный с удвоителем напряжения. Но его мощность оставляла желать лучшего (даже 1 СБМ-20 при достаточно сильном фоне, просаживал напряжение), кроме того нужно мотать трансформатор -довольно неудобный надо сказать (особенно если пытаться запихнуть в маленький корпус).
соответственно область коэффициентов -inf… 0 синапс тормозящий
0… +inf синапс возбуждающий
Пороговая функция: выходное значение модели -1/1 либо 0/1 кому как нравится (более подходит в данном конкретном применении).
Сигмоида: любое значение в пределе [-1..1] ( [0..1])
Вы презентацию-то смотрели? Там довольно подробно объясняется как это работает.
Кроме того отмечу, что если с помощью вашей модели мы выделяем подмножество из множества, разве не очевидно, что результат вычитания подмножества из исходного множества является дополняющим множеством? Соответственно мы можем трактовать отсутствие сигнала, как попадание входных значений в дополняющее множество (так как третьего не дано).