Помогите пожалуйста побороть функцию отслеживания входного сигнала.

aicer
Offline
Зарегистрирован: 17.01.2021

Помогите люди добрые, уже мозги кипят. Пишу программу для управления стробоскопами, нужно реализовать отслеживание количества нажатий. Написал простой скетч, для проверки алгоритма, но даже он не работает. Такое ощущение, что переменная 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"
  }
  }

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Загрузил в протеус - проверил все работает как Вы написали первый раз нажал горит 11, второй раз нажал -горит 12, третий раз - оба потухли. или это не тот код?

aicer
Offline
Зарегистрирован: 17.01.2021

Хм. Тот. В протеусе и проверял. У меня не работает. Может модель ардуино кривая у меня?

[URL=https://radikalno.ru/][IMG]https://cdn1.radikalno.ru/uploads/2021/1/17/a2c03c23847a7fab69eb12d29b4f0acc-full.jpg[/IMG][/URL] [URL=https://radikalno.ru/]радикал[/URL]

 

b707
Offline
Зарегистрирован: 26.05.2017

aicer пишет:

Такое ощущение, что переменная f всегда переписывается в нуль, поскольку выполняется только условие (f==1). Команды в условиях (f==2) и (f==3) не выполняются впринципе. Программа не останавливается, и не зависает, проверял. Она бесконечно повторяет действия при f==1, в независимости от количества нажатий на кнопку.

не вижу в этом коде переменной f вообще. Может имелась в виду переменная k ?

aicer
Offline
Зарегистрирован: 17.01.2021

Да, опечатался. Речь идет о переменной K

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Вот с выводом в сериал

3 там тоже есть, просто вывод стоит после обнуления к

aicer
Offline
Зарегистрирован: 17.01.2021

vosara пишет:

Вот с выводом в сериал

Подскажите версию вашего протеуса. Буду переустанавливать, потому что даже другую модель поставил, все равно не работает как должно. А дальше мне без этого будет проблемно.

 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Proteus Professional v8.10 SP3 Build 29560

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Это не обработчик кнопки ни разу.
Дребезг ? Не, не слышал.
Там с одного нажатия "к" может стать как 1 так и 5.
Переделывай.
Хотя бы в конец цикла добавь delay(20);

aicer
Offline
Зарегистрирован: 17.01.2021

Kakmyc пишет:
Это не обработчик кнопки ни разу. Дребезг ? Не, не слышал. Там с одного нажатия "к" может стать как 1 так и 5. Переделывай. Хотя бы в конец цикла добавь delay(20);

Можно и попроще выражаться. Я просил помощи, а не нравоучений.
Кнопка используется для проверки, на деле будет использоваться сигнал с другого блока управления. Или может у транзисторов будет тоже дребезг?
По поводу задержки, пробовал, мне не помогала. Да и в ардуино кнопка идеализирована, сомневаюсь, что у нее заложены механические явления. А у людей и в чистом виде срабатывает, как сейчас выяснилось.

b707
Offline
Зарегистрирован: 26.05.2017

aicer пишет:

Да и в ардуино кнопка идеализирована, сомневаюсь, что у нее заложены механические явления.

это что за бред? кто посмел "идеализировать" мои кнопки?

aicer
Offline
Зарегистрирован: 17.01.2021

b707 пишет:

aicer пишет:

Да и в ардуино кнопка идеализирована, сомневаюсь, что у нее заложены механические явления.

это что за бред? кто посмел "идеализировать" мои кнопки?

 

Пардон, я имел ввиду, что в среде протеус кнопка идеализирована. Нарастание хоть и не мгновенное, но без дребезга.
 

А так, в целом, за совет спасибо, учту, только задержку наверное меньше поставлю, если мешать нормальной работе будет.

aicer
Offline
Зарегистрирован: 17.01.2021

Поставил уже протеус 8.10, один фиг работает, как описал в начале топика. С фильтром на кнопке, вместо кнопки - генератор миандра, просто кнопка с подтягивающим на землю резистором. Все равно. пин 11 в единицу и все, дальше ничего. И паузу в цикл добавлял, тоже нет толку. Стоит запретить прерывания в начале основного цикла и все начинает работать, но мне такой вариант не подходит категорически. Может компилятор что то выкидывает из кода? Ну или в протеусе что то делаю не так? Никогда проблем не было, а тут на ровном месте прилип.   

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а если перетащить кнопку на 4 пин?

svm
Offline
Зарегистрирован: 06.11.2016

aicer пишет:

Поставил уже протеус 8.10, один фиг работает, как описал в начале топика. С фильтром на кнопке, вместо кнопки - генератор миандра, просто кнопка с подтягивающим на землю резистором. Все равно. пин 11 в единицу и все, дальше ничего. И паузу в цикл добавлял, тоже нет толку. Стоит запретить прерывания в начале основного цикла и все начинает работать, но мне такой вариант не подходит категорически.

Для начала уберите кнопку со 2 пина. Там сидит СОМ порт и его прерывания на нажатие Вашей кнопки реагируют. 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

svm пишет:

Для начала уберите кнопку со 2 пина. Там сидит СОМ порт и его прерывания на нажатие Вашей кнопки реагируют. 

UART сидит на пинах 0 и 1.

svm
Offline
Зарегистрирован: 06.11.2016

Jeka_M пишет:

svm пишет:

Для начала уберите кнопку со 2 пина. Там сидит СОМ порт и его прерывания на нажатие Вашей кнопки реагируют. 

UART сидит на пинах 0 и 1.

Тупанул, привык что первая нога Reset, а потом RX,TX.

aicer
Offline
Зарегистрирован: 17.01.2021

Пробовал, не помогает. Странно что у VOsara работает же.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

aicer пишет:

Пробовал, не помогает. Странно что у VOsara работает же.

ЖОПА - Желаю Обществу Приятного Аппетита.

Чет Вы не так делаете. Всем помогает, а Вам вот нет... Странно как-то.

aicer
Offline
Зарегистрирован: 17.01.2021

mykaida пишет:

aicer пишет:

Пробовал, не помогает. Странно что у VOsara работает же.

ЖОПА - Желаю Обществу Приятного Аппетита.

Чет Вы не так делаете. Всем помогает, а Вам вот нет... Странно как-то.

Я поэтому сюда и зашел, на форум, и создал этот топик))).
Просто я уже пробовал "K" считать в прерывании по нажатию кнопки, все равно такая же херь. Ну не в винде же проблема. Могу конечно попробовать на другом, но это уже как то через чур из рубрики фантастики.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

aicer пишет:

Я поэтому сюда и зашел, на форум, и создал этот топик))).

Просто я уже пробовал "K" считать в прерывании по нажатию кнопки, все равно такая же херь. Ну не в винде же проблема. Могу конечно попробовать на другом, но это уже как то через чур из рубрики фантастики.

Поставьте паузу в пол-секунды и посмотрите чего происходит. Протеус не идеален.

aicer
Offline
Зарегистрирован: 17.01.2021

mykaida пишет:

aicer пишет:

Я поэтому сюда и зашел, на форум, и создал этот топик))).

Просто я уже пробовал "K" считать в прерывании по нажатию кнопки, все равно такая же херь. Ну не в винде же проблема. Могу конечно попробовать на другом, но это уже как то через чур из рубрики фантастики.

Поставьте паузу в пол-секунды и посмотрите чего происходит. Протеус не идеален.

Тоже нет. Самая интересная связь, что ставишь в начале программы cli(); и она работает. Значит как то проблемы связаны с прерыванием каким то.

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

aicer пишет:

Поставил уже протеус 8.10, один фиг работает, как описал в начале топика. С фильтром на кнопке, вместо кнопки - генератор миандра, просто кнопка с подтягивающим на землю резистором. Все равно. пин 11 в единицу и все, дальше ничего. И паузу в цикл добавлял, тоже нет толку. Стоит запретить прерывания в начале основного цикла и все начинает работать, но мне такой вариант не подходит категорически. Может компилятор что то выкидывает из кода? Ну или в протеусе что то делаю не так? Никогда проблем не было, а тут на ровном месте прилип.   

Да мистика какая то Выведите переменную к в сериал. Вот мое видео https://www.dropbox.com/s/cp84utq95j0bbc8/Rec%200002.mp4?dl=0

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

версии IDE видимо разные

aicer
Offline
Зарегистрирован: 17.01.2021

Проблема была в компиляторе. Сначала, посмотрев видео уважаемого Vosara, решил скомпилировать код через сам протеус, с помощью встроенного компилятора. Потом скачал другую версию Ардуино IDE и все заработало, как надо. Всем огромное спасибо за помощь!!!