Потому что у Вас антидребезг получается только по нажатию. При отпускании кнопки у Вас тоже может быть дребезг. Его Вы не учитываете. Лучше всего ввести переменную, хранящую предыдущее значение кнопки. если текущее значение кнопки не равно предыдущему (т.е. мы либо нажали, либо отпустили кнопку), то вводим задержку, например так _delay_ms (20); А иначе у Вас при отпускании кнопки программа может несколько раз попасть на участок кода по нажатию. вот, кстати, Вам картинка, какой бывает дребезг. Это обычная тактовая кнопка. У Вас на запуске скорее всего будет здоровая бандура - дребезг будет еще больше и дольше.rxstart1 писал(а):2. почему антидребезг неправильно организован?
Спойлер
TCCR1B=(0<<ICNC1)|(1<<ICES1)|(0<<WGM13)|(0<<WGM12)|(1<<CS12)|(0<<CS11)|(0<<CS10); //захват по переднему фронту, предделитель - 256rxstart1 писал(а):По поводу таймера я не подумал. Покажите в программе как, пожалуйста.
Теперь в программе заместо 8000000/tuchValue пишите 31250/tuchValue
а вообще, лучше от деления избавиться и использовать конкретные значения tuchValue. Будет на порядок быстрее.
Так же, рекомендую пока закомментировать автозапуск и отладить для начала ручной. А уж потом все остальное. в ручном запуске вроде как не должна сбрасываться tim2. Если, конечно, я где-чего не упустил.
Да, еще маленький совет. Можно использовать несколько переменных типа tim2 для разных мест программы, чтобы они отсчитывались одновременно и не было путаницы.
Вот здесь, кстати еще поправьте:
Спойлер
Код: Выделить всё
case 60:PORTB=0x80;PORTA=0xEF;break;
case 61:PORTB=0x80;PORTA=0xDF;break;
case 62:PORTB=0x80;PORTA=0xBF;break;
case 63:PORTB=0x80;PORTA=0x7F;break;Код: Выделить всё
case 60:PORTB=0x80;PORTA=0xEF;break;
case 61:PORTB=0x80;PORTA=0xDF;break;
case 62:PORTB=0x80;PORTA=0xBF;break;
default: PORTB=0x80;PORTA=0x7F;break;- Вложения
-
- DSC_0269.JPG
- Тактовая кнопка, дребезг
- (59.64 КБ) 616 скачиваний


