Подскажите по прерываниям.
- Войдите на сайт для отправки комментариев
Чт, 26/05/2011 - 02:19
Пока не пришли ардуинки, набираюсь опыта в VBB3
так вот, или он глючит, или я уже не знаю.
вот простейший пример
int pin = 13; volatile int state = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE); ISR(INT0_vect); } void loop() { digitalWrite(pin, state); } void blink() { state = !state; }
и он в симуляторе не работает.
во первых ругается на attachInterrupt(0, blink, CHANGE);
и как ни странно на state = !state;
Начните пример прерывания с кнопкой) можете затулить в блинк кнопку при нажатии на которорую меняется стате, а не просто сразу)
так это и есть этот пример. и в vbb3 он не работает. вот и хочу узнать, пользовался кто нить этим симулятором и небыло ли таких траблов?
А там часом не описка во второй строчке, можно ли HIGH LOW хранить в переменной типа int, да еще потом к int применять логическую операцию отрицания в 18ой строке?
Я был неправ. Переменная хранится, операция работает. И вообще код работает, проверил на Arduino Diecimila.
спасибо. значит эмуль глючный.
Сегодня первый раз игрался с прерываниями, че-то мутно, но в финале добил.
Подтянул встроенные резисторы
digitalWrite(swpin1, HIGH);
Так как у меня теперь мега2560, то прерывание выбрал 2, на 21 контакте
attachInterrupt(2,switch1,CHANGE);
Функция switch1 на три нажатия состояния кнопки, на четвертом нажатии сброс на первое значение
Доброго времени суток.
Есть такая конструкция: к ардуино uno подключен acDimmer со своей библиотекой (использует внешнее прерывание для детектора 0), I2C 7ми сегментный индикатор, и датчик DHT 11.
Проблема: периодически, без каких либо закономерностей, экран показывает чушь, иногда с датчика считывается 0.
После поиска на просторах интернета нашёл только одно объяснение: внешнее прерывание может мешать обмену данными по шинам.
Как с этим бороться?
Использовать библиотеку без прерывания?
Была мысль. Не получится. Там работает детектор нуля. Диммер переменка 220 вольт.
Тогда выход один - ищи закономерности.
Диммер без прерываний будет однозначно мигать.
Вероятнее всего ошибка в коде.
Не думаю что проблема в прерываниях.
В I2C нет требований к таймаутам, на которые могут повлиять прерывания.
Как вариант убрать прерывания и диммер, проверить все остальное на длительном тесте без диммера.
Jeterex разделите во времени взаимодействие с устройствами.
Jeterex разделите во времени взаимодействие с устройствами.
Да там особо не разделишь.
Каждые 10мс срабатывает прерывание по zero cross. Потом, в зависимости от мощности, в течение 10мс - прерывание по таймеру.
Но я не думаю, что прерывания влияют на обмен по I2C. Думаю, что где то ошибки в коде.
Когда делал WiFi диммеры для дома на ESP8266, я вынес диммер на Тини25 (программный слейв).
ESP8266 подключается к OpenHAB по mqtt, и управляет Тини25 по I2C.
К ESP8266, кроме Тини25, по I2C еще подключен PCF8574 и HDC1080.
Все это работает с 2017-го, и без единого сбоя. Просто работает и все.
а кнопку на прерывании на ESP8266 кто-нибудь одолел?
а кнопку на прерывании на ESP8266 кто-нибудь одолел?
а нужно?
Я по таймеру все кнопки и контакты обрабатываю.
С устранением дребезга, по всем входам за раз, без циклов, параллельно.
а кнопку на прерывании на ESP8266 кто-нибудь одолел?
а нужно?
Я по таймеру все кнопки и контакты обрабатываю.
С устранением дребезга, по всем входам за раз, без циклов, параллельно.
пример?
пример?
Для 8-ми входов данные с входов портов загружаются в переменную uint8_t SWKEYS.
Каждый вход - определенный бит.
Примеры и подробное описание работы тут.
Бред!
Ну выглядит бредово :-) Было уже такое, тему еще в 2016 создавал на Амперке, не поняли.
А у меня работает надежно и быстро, код очень короткий, что очень неплохо для обработчика таймера.
Да и все входы обрабатываются параллельно, без циклов.
Всё хотел спросить. Что такое "вертикальный счётчик"? И чем он отличается от диагонального?
Так спросите у яндекса и получите ответ
https://www.embedders.org/blog/gdi/debouncing.html
Так спросите у яндекса и получите ответ
Просто лень.)
OK. Получается время дребезга = кол-ву счётчиков * период опроса? Удобно ли?
Вот по моему, всё тоже, но без заумностей. Период опроса любой, меньше длительности дребезга.
Сама длительность устанавливается через DEBOUNCE_TIME. 16/32 входа по желанию.
каждые 10 миллисекунд опрашивать кнопку нажать которую могут раз сутки, как-то некомильфо, может так - отловили через прерывание нажатие, запустили процедуру обработки кнопки с опросом по таймеру каждые 10 миллисекунд, через минуту таймер погасили...
Вот по моему, всё тоже, но без заумностей. Период опроса любой, меньше длительности дребезга.
Сама длительность устанавливается через DEBOUNCE_TIME. 16/32 входа по желанию.
На один вход, так даже по командам чуть короче получится. На AVR примерно команд на 10 короче думаю.
А если на два входа - уже предложенный мной вариант короче получится.
Как вы планируете написать на 16/32 входов?
каждые 10 миллисекунд опрашивать кнопку нажать которую могут раз сутки, как-то некомильфо, может так - отловили через прерывание нажатие, запустили процедуру обработки кнопки с опросом по таймеру каждые 10 миллисекунд, через минуту таймер погасили...
Так да, все зависит от задачи и питания.
Если батарея - нужно спать. :-)
Если сеть - все равно крутимся в цикле.
Как вы планируете написать на 16/32 входов?
Всё короче, да короче. У кого короче?)
Я не планирую - у меня работает!
uint8_t key = get_key(); - это разве не 8 входов?
Всё короче, да короче. У кого короче?)
Я не планирую - у меня работает!
uint8_t key = get_key(); - это разве не 8 входов?
Ну понятно :-)
И время для них одно и то же.
Вот в этом то и разница, как минимум в 8 раз. :-)
Возможно Green считает, что для типичной кнопочной задачи, когда кнопки нажимаются пальцами и это не пианино, достаточно обрабатывать дребезг без конкретизации кнопки. Или, возможно, он таки не видит разницы в этих алгоритмах.
У меня типично кнопочная задача, которая с этими кнопками отлично справляется. Мы ведь о дребезге кнопок? И я не вижу никаких причин её усложнять.
когда кнопки нажимаются пальцами и это не пианино...
это жеж электроника, нежнее надо, нежнее, прям как Лола Астанова )))
Возможно Green считает, что для типичной кнопочной задачи, когда кнопки нажимаются пальцами и это не пианино, достаточно обрабатывать дребезг без конкретизации кнопки. Или, возможно, он таки не видит разницы в этих алгоритмах.
Я то вижу разницу. Этот алгоритм хорош в случаях когда много одновременных источников с дребезгом.
А вот где такое возможно - представить себе не могу. Наверно в пианино. (На пианино играл по молодости с подругой, и то однажды.) С обычными кнопками такой ситуации нет. В моём случае длительность дребезга задаёшь в удобоваримом виде (в мс) и не привязываешься к счётчику (на 3 или 4), который нужно менять в программе. Так же не привязываешься к периоду опроса, который может быть весьма экзотическим, 15625 us например.
Посмотрел листинг на трезвую голову - 8 байт разницы. Но это и так было видно.
У меня и кнопки и все входы, одной функцией обрабатываются. Функция вызывается из таймера.
Нужно еще один вход добавить, ничего дополнительного добавлять не нужно. Только в обработчике анализируешь взведенный бит, и сбрасываешь его после обработки.
Куда уж проще то?
Ну и ситуация когда один вход на другой может повлиять, пусть даже и в теории, я бы у себя не стал делать. Но это ИМХО.
Куда уж проще то?
А эта странная манера бессмысленные переменные, да ещё и заглавными.) Ужос! Или это для запутывания?
Какой один вход на другой? Вы бы разобрались сначала. И показали бы как такое возможно.
А эта странная манера бессмысленные переменные, да ещё и заглавными.) Ужос! Или это для запутывания?
Так было у автора :-), написано же нашел в интернете. Меня это не напрягает ;-)
Мне понравилась компактность и оптимальность, я пользуюсь, доволен, никому не навязываю.
Для ESP8266 пользую так, лучше пока не одолел:
(хотелось бы отлавливать и отпускание кнопки)
Этот алгоритм хорош в случаях когда много одновременных источников с дребезгом.
А вот где такое возможно - представить себе не могу. Наверно в пианино. (На пианино играл по молодости с подругой, и то однажды.) С обычными кнопками такой ситуации нет.
Наоборот.
На клавишном инструменте, где дребезг больше 2-5 мс, играть невозможно.
Собственно, поэтому и делают резиновые контакты, чтобы уменьшить дребезг.
Ну да. В любой теме/специфике есть свои нюансы. Причём ТАКИЕ, что обыватель даже и не предполагает о них.) И зачастую их СТОЛЬКО, что волосы дыбом становятся от этих нюансов.)
Посмотрел, увидел минусы. Ну объяснились бы, если не разделяете моё мнение.
Или же, минусы ставлю, а язык в жо.( Печально, что многое у нас так.(
А эта странная манера бессмысленные переменные, да ещё и заглавными.) Ужос! Или это для запутывания?
Какой один вход на другой? Вы бы разобрались сначала. И показали бы как такое возможно.
Что значит "бессмысленные переменные"? Если без них было бы понятнее, то покажите как. Если в именах переменных нет смысла, то на мой взгляд там все сокращения имеют смысл, вы действительно не видите?
"Какой один вход на другой?". Не верится, что вы сами не можете придумать пример. Представьте, что это домашнее задание. Например одна линия от кнопки в силу каких то причин стала антенной для наводок, и блокирует работу остальных кнопок. Если подключен датчик, то постоянный дребезг в случае его поломки тоже может быть вероятен.
Что значит "бессмысленные переменные"?
Конечно, вы можете выражать свои мысли как вам заблагорассудится, но все же, есть какие то правила. Или нет?
При том что вы хотите довести свои мысли до других.
А если нет, то почему вы пишете с заглавной строки и со знаками препинания? Или вам не насрать на собеседника?
Да это пофигу. Пока не успокоитесь оба входа - не будет результата.
Да это пофигу. Пока не успокоитесь оба входа - не будет результата.
Ну если вам "пофигу", то и не не буду ничего писать, именно по этому и не стал объяснять детали.
А если мне не "пофигу", то этот алгоритм мне уже не подходит. Например энкодер.
Блин! Ну смотрите. К примеру, 2 кнопки. С одной всё понятно. К примеру, нажали одну, затем вторую.
Есть нажатие одной. И пока есть дребезг второй состояние первой не изменится. Пока не устаканится состояние первой и второй - результата не будет.
Ну какие могут быть отрицательные моменты с двумя, тремя, н-ным количеством кнопок в этом случае? Ведь у вас не 100 рук! Максимум 3 кнопки. Ну, пусть, 5. И что? Дребезг одной кнопки удлиняет результат для всех. Но это же естественно. Если вы жмёте кучу кнопок, нужно же определиться сколько вы нажали. Не так ли?
Green, Вы троллите или не понимаете?
Вы меня дураком хотите выставить? Тогда выставляйте. Подробно, без этих вот ЗАУМНЫХ высказываний.
Вы меня дураком хотите выставить? Тогда выставляйте. Подробно, без этих вот ЗАУМНЫХ высказываний.
Да ни в коем случае, обидеть не хотел, просто вы как то очень категорично... :-(
Green, насколько я понял - в каждый бит числа читается бинарное представление входа. Потом этот бит переползает в одну переменную, вторую и третью. Т.е. если за три вызова состояние путешествующего бита не менялось, то считается, что вход зафиксировался. Одновременно через эти переменные ползут 8 входов. Считаю, что фиксация изменения вполне себе независимая. Т.е. вместо одно защитного интервала применяется три проверки через некоторые промежутки. Это просто другой способ. Хуже/лучше он - от ситуации зависит.
Все правильно, там по ссылке из #18 (тут прямая ссылка) добавил еще один разряд вертикального счетчика, чтобы сделать проверку не на 4, а на 8 установившихся состояний. Все зависит от задачи. По коду изменений - минимум, как говорят - найди 4 отличия.