Помогите пожалуйста побороть функцию отслеживания входного сигнала.
- Войдите на сайт для отправки комментариев
Помогите люди добрые, уже мозги кипят. Пишу программу для управления стробоскопами, нужно реализовать отслеживание количества нажатий. Написал простой скетч, для проверки алгоритма, но даже он не работает. Такое ощущение, что переменная f всегда переписывается в нуль, поскольку выполняется только условие (f==1). Команды в условиях (f==2) и (f==3) не выполняются впринципе. Программа не останавливается, и не зависает, проверял. Она бесконечно повторяет действия при f==1, в независимости от количества нажатий на кнопку.
Однако если использовать команду cli() в начале основного цикла, все начнет работать четко, но мне этот вариант не подходит, т.к. будут использоваться таймеры 1 и 2. Да и не очень понятно, как все это связано с запретом на прерывания. Может я просто не понимаю логику работы команды digitalread();
int k=0; const int IN_Sig=2; const int R_led=11; const int L_led=12; bool sign; void setup() { pinMode(R_led, OUTPUT); pinMode(L_led, OUTPUT); pinMode(IN_Sig, INPUT); } void loop(){ sign=digitalRead(IN_Sig); //считываем сигнал if (sign== HIGH) { // если сигнал "1" то увеличиваем К на единицу k++; if (k==1) { // зажигаем правый диод если к=1 digitalWrite(R_led, HIGH); while (sign== HIGH) {sign=digitalRead(IN_Sig);} // ждем, пока кнопка будет отпущена, сигнал смениться на "0" } if(k==2) { digitalWrite(L_led, HIGH); // зажигаем левый диод если к=2 while (sign== HIGH) {sign=digitalRead(IN_Sig);}} // ждем, пока кнопка будет отпущена, сигнал смениться на "0" if(k==3) { digitalWrite(R_led, LOW); // тушим оба диода если к=3 digitalWrite(L_led, LOW); k=0; // обнуляем k while (sign== HIGH) {sign=digitalRead(IN_Sig);}}// ждем, пока кнопка будет отпущена, сигнал смениться на "0" } }
Загрузил в протеус - проверил все работает как Вы написали первый раз нажал горит 11, второй раз нажал -горит 12, третий раз - оба потухли. или это не тот код?
Хм. Тот. В протеусе и проверял. У меня не работает. Может модель ардуино кривая у меня?
[URL=https://radikalno.ru/][IMG]https://cdn1.radikalno.ru/uploads/2021/1/17/a2c03c23847a7fab69eb12d29b4f0acc-full.jpg[/IMG][/URL] [URL=https://radikalno.ru/]радикал[/URL]
Такое ощущение, что переменная f всегда переписывается в нуль, поскольку выполняется только условие (f==1). Команды в условиях (f==2) и (f==3) не выполняются впринципе. Программа не останавливается, и не зависает, проверял. Она бесконечно повторяет действия при f==1, в независимости от количества нажатий на кнопку.
не вижу в этом коде переменной f вообще. Может имелась в виду переменная k ?
Да, опечатался. Речь идет о переменной K
Вот с выводом в сериал
3 там тоже есть, просто вывод стоит после обнуления к
Вот с выводом в сериал
Подскажите версию вашего протеуса. Буду переустанавливать, потому что даже другую модель поставил, все равно не работает как должно. А дальше мне без этого будет проблемно.
Proteus Professional v8.10 SP3 Build 29560
Это не обработчик кнопки ни разу.
Дребезг ? Не, не слышал.
Там с одного нажатия "к" может стать как 1 так и 5.
Переделывай.
Хотя бы в конец цикла добавь delay(20);
Можно и попроще выражаться. Я просил помощи, а не нравоучений.
Кнопка используется для проверки, на деле будет использоваться сигнал с другого блока управления. Или может у транзисторов будет тоже дребезг?
По поводу задержки, пробовал, мне не помогала. Да и в ардуино кнопка идеализирована, сомневаюсь, что у нее заложены механические явления. А у людей и в чистом виде срабатывает, как сейчас выяснилось.
Да и в ардуино кнопка идеализирована, сомневаюсь, что у нее заложены механические явления.
это что за бред? кто посмел "идеализировать" мои кнопки?
Да и в ардуино кнопка идеализирована, сомневаюсь, что у нее заложены механические явления.
это что за бред? кто посмел "идеализировать" мои кнопки?
Пардон, я имел ввиду, что в среде протеус кнопка идеализирована. Нарастание хоть и не мгновенное, но без дребезга.
А так, в целом, за совет спасибо, учту, только задержку наверное меньше поставлю, если мешать нормальной работе будет.
Поставил уже протеус 8.10, один фиг работает, как описал в начале топика. С фильтром на кнопке, вместо кнопки - генератор миандра, просто кнопка с подтягивающим на землю резистором. Все равно. пин 11 в единицу и все, дальше ничего. И паузу в цикл добавлял, тоже нет толку. Стоит запретить прерывания в начале основного цикла и все начинает работать, но мне такой вариант не подходит категорически. Может компилятор что то выкидывает из кода? Ну или в протеусе что то делаю не так? Никогда проблем не было, а тут на ровном месте прилип.
а если перетащить кнопку на 4 пин?
Поставил уже протеус 8.10, один фиг работает, как описал в начале топика. С фильтром на кнопке, вместо кнопки - генератор миандра, просто кнопка с подтягивающим на землю резистором. Все равно. пин 11 в единицу и все, дальше ничего. И паузу в цикл добавлял, тоже нет толку. Стоит запретить прерывания в начале основного цикла и все начинает работать, но мне такой вариант не подходит категорически.
Для начала уберите кнопку со 2 пина. Там сидит СОМ порт и его прерывания на нажатие Вашей кнопки реагируют.
Для начала уберите кнопку со 2 пина. Там сидит СОМ порт и его прерывания на нажатие Вашей кнопки реагируют.
UART сидит на пинах 0 и 1.
Для начала уберите кнопку со 2 пина. Там сидит СОМ порт и его прерывания на нажатие Вашей кнопки реагируют.
UART сидит на пинах 0 и 1.
Пробовал, не помогает. Странно что у VOsara работает же.
Пробовал, не помогает. Странно что у VOsara работает же.
ЖОПА - Желаю Обществу Приятного Аппетита.
Чет Вы не так делаете. Всем помогает, а Вам вот нет... Странно как-то.
Пробовал, не помогает. Странно что у VOsara работает же.
ЖОПА - Желаю Обществу Приятного Аппетита.
Чет Вы не так делаете. Всем помогает, а Вам вот нет... Странно как-то.
Я поэтому сюда и зашел, на форум, и создал этот топик))).
Просто я уже пробовал "K" считать в прерывании по нажатию кнопки, все равно такая же херь. Ну не в винде же проблема. Могу конечно попробовать на другом, но это уже как то через чур из рубрики фантастики.
Я поэтому сюда и зашел, на форум, и создал этот топик))).
Просто я уже пробовал "K" считать в прерывании по нажатию кнопки, все равно такая же херь. Ну не в винде же проблема. Могу конечно попробовать на другом, но это уже как то через чур из рубрики фантастики.
Поставьте паузу в пол-секунды и посмотрите чего происходит. Протеус не идеален.
Я поэтому сюда и зашел, на форум, и создал этот топик))).
Просто я уже пробовал "K" считать в прерывании по нажатию кнопки, все равно такая же херь. Ну не в винде же проблема. Могу конечно попробовать на другом, но это уже как то через чур из рубрики фантастики.
Поставьте паузу в пол-секунды и посмотрите чего происходит. Протеус не идеален.
Тоже нет. Самая интересная связь, что ставишь в начале программы cli(); и она работает. Значит как то проблемы связаны с прерыванием каким то.
Поставил уже протеус 8.10, один фиг работает, как описал в начале топика. С фильтром на кнопке, вместо кнопки - генератор миандра, просто кнопка с подтягивающим на землю резистором. Все равно. пин 11 в единицу и все, дальше ничего. И паузу в цикл добавлял, тоже нет толку. Стоит запретить прерывания в начале основного цикла и все начинает работать, но мне такой вариант не подходит категорически. Может компилятор что то выкидывает из кода? Ну или в протеусе что то делаю не так? Никогда проблем не было, а тут на ровном месте прилип.
Да мистика какая то Выведите переменную к в сериал. Вот мое видео https://www.dropbox.com/s/cp84utq95j0bbc8/Rec%200002.mp4?dl=0
версии IDE видимо разные
Проблема была в компиляторе. Сначала, посмотрев видео уважаемого Vosara, решил скомпилировать код через сам протеус, с помощью встроенного компилятора. Потом скачал другую версию Ардуино IDE и все заработало, как надо. Всем огромное спасибо за помощь!!!