loox » 07 фев 2018, 16:35
1. это не глюк - это отсутствие знаний.
" ....то не работает, то есть старый кусок работает и уменьшает переменную, а новый не работает и не уменьшает переменную, хотя делал так раз 5, тщательно все проверяя и меняя переменные.."
Во время компиляции или работы программы нарушилась связь имени объекта с объектом, который становиться невидимым из блока программы , хотя сфера действия имени сохраняется. Это понятие называется - "видимость объекта".
Что делать ? - проверить правильность и тщательность определения и описания всех переменных.
1.1 В качестве дружеского совета - займитесь этим серьезно, с изучения всех процессов, которые заложены в Вашу программу.
а) алгоритм нарисованный на бумаге - тщательно нарисованный и снабженный комментариями. Это, сообщество легко поможет Вам реализовать.
2. Дребезг кнопок - этой проблеме +100500 лет, и она уже давно решена:
- нормально разомкнутая кнопка = общий провод - нормально разомкнутая кнопка - проволока - вход устройства. Вход устройства - резистор 1 ком - + 5 вольт.
"нажатая кнопка" - замыкается на землю.
Можно вместо внешнего резистора использовать внутренний подтягивающий резистор - сопротивление этого резистора 20 ком, это хуже с точки зрения помехозащищенности от внешних помех - помех по питанию или электромагнитных помех.
Аппаратные способы:
- самый простой - поставить конденсатор между входом и землей, его придется подобрать, начните с 1000 пф.
Действие такое - в исходном состоянии, конденсатор зарядится до напряжения питания. При нажатии кнопки и появлении дребезга, конденсатор за счет своей емкости " сгладит" короткие импульсы дребезга. Недостаток - кнопка не будет реагировать на "частые" нажатия кнопки, конденсатору необходимо время жля зарядки.
- на воде RS триггер. Как работает - в гугле " дребез кнопки"
- другие аппартанык способы - там же.
Программные способы:
В данном случае самые предпочтительные.
Алгоритм:
кнопка нажата_1 ?
нет - иду на кнопка нажата_1?
Да нажата
Выдерживаю время дребезга контактов
кнопка нажата_2 ?
нет - иду на кнопка нажата_1
Да - выставляю флаг(присваиваю значение переменной) или иду на исполнение.
Все очень просто.
В CAVR есть оператор задержки:
#include <delay.h>
.....
delay_ms(50) // задержка на 50 миллисекунд
используйте ее, что бы задержать опрос кнопок на время дребезга контактов, время подобрать
Пока сосредоточитесь на этом, напишете код - выложите весь.
PS почему Вы пользуетесь CAVR - это такой анахронизм ????
loox