каждое 10-е прерывание - тупо запоминаем состояние портов с кнопками и всё.
Понятно. Аналог задержки, но без задержки... т.е. получаем нечто, что было 10 миллисекунд назад, и надеемся, что сейчас оно такое самое и есть. Аесли нет? В чём смысл отложить опрос состояния кнопок на 10 мс?
В чём смысл отложить опрос состояния кнопок на 10 мс?
Не отложить, а ЗАЩЕЛКИВАТЬ состояние кнопки раз в 10 мс. Тут дело не в 10 мс, а во времени дребезга кнопки. При защелкивании состояния кнопки реже, чем длится дребезг, дребезг исчезнет.
зачем откладывать? бери и пользуйся. Вот прямо как прерывание произошло, состояние защелкнули - так сразу можешь брать и пользоваться. Смысл в чем, в том что состояние кнопок фиксируется один раз за цикл, и даже если фиксация попадёт на момент дребезга - максимум что может быть то один раз зафиксируем неверное состояние кнопки в момент перехода а это чревато только тем что нажатие мы увидим в худшем случае на следующий цикл опроса. Но сам дребезг программа не увидит.
из этого кстати следует естественное ограничение данного алгоритма - кнопка может быть в нажатом(отпущенном) состоянии для правильной работы не менее 2-х циклов опроса. Если не соблюсти это условие максимум что случится - пропустим событие нажатия кнопки. Человек, к примеру, так быстро нажимать кнопки не сможет. А для концевых выключателей или датчиков частоты вращения вала нужны другие методы подавления дребезга, зачастую даже механические.
Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650.
Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель.
По задумке по нажатию кнопки должен загораться светодиод и гореть 3 сек. Подключил кнопку, сделал подтяжку пина к земле. Сигнал на пин поступает, но не обрабатывается. Подскажите что не так. Или это просто протеус логает
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
В Протеусе моежешь не ставить. ))) Это в реальной жизни надо. А если так, то и приучаться к хорошему надо везде. Может и херню скажу, но обычно кнопки ставят от порта на землю, а подтяжку делают к плюсу.... Как внутреннюю, так и внешнюю. (это вроде традиции еще от старых МК пошло, если захотите - прочитаете). Здесь же в вашей схеме может так и задумано. Косяк у вас в программе где-то...
Я плохо помню Си. А если в программе без всяких опросов кнопок сконфигурировать порт В7 на выход - будет светодиод гореть?
В большинстве телевизоров кнопки стоят на линии АЦП . всего два провода и до 6 кнопок .
а тут я накалякал на 3кнопки
Код:
void OPROS_KN () { unsigned char VIBORKA1 ;
VIBORKA1= read_adc(0); if ( VIBORKA1 >240 ) return; //ничего не нажато подтяжка тянет delay_ms(15);
if (read_adc(0) >VIBORKA1+1 ) return; // если повторный уровень олтчается больше чем на +-1 то вых if ( VIBORKA1 >read_adc(0)+1 ) return; // если повторный уровень олтчается больше чем на +-1 то вых
if (VIBORKA1<8) /// нажат выбор реж { if (Mode_SLCT <2) Mode_SLCT++; else Mode_SLCT=0; } if (Mode_SLCT ==0) { LCD_PutChar (0, 0 ,80); //P LCD_PutChar (9, 0 ,79); //O LCD_PutChar (18, 0 ,82); //R nlcd_Line(porog,10,porog, 160, black ) ; if ( VIBORKA1>75 & VIBORKA1<85) porog=porog-2 ; // ацп канал 0 выход =80 нажат минус if ( VIBORKA1>98 & VIBORKA1<108) porog=porog+2 ; // ацп канал 0 выход =103 нажат плюс nlcd_Line(porog,10,porog, 160, yellow ) ; print_int( 36,0, porog); }
if (Mode_SLCT ==1) { LCD_PutChar (0, 0 ,77); //M LCD_PutChar (9, 0 ,88); //X LCD_PutChar (18, 0 ,61); //= if ( VIBORKA1>75 & VIBORKA1<85) multiplerX++ ; // ацп канал 0 выход =80 нажат минус if ( VIBORKA1>98 & VIBORKA1<108) multiplerX-- ; // ацп канал 0 выход =103 нажат плюс if (multiplerX==0 ) multiplerX= 1 ; print_int( 36,0, multiplerX); } if (Mode_SLCT ==2) { LCD_PutChar (0, 0 ,77); //M LCD_PutChar (9, 0 ,89); //X LCD_PutChar (18, 0 ,61); //= if ( VIBORKA1>75 & VIBORKA1<85) { multiplerY=1; DEL_ON ; } // ацп канал 0 выход =80 нажат минус if ( VIBORKA1>98 & VIBORKA1<108) { multiplerY=0 ;DEL_OFF; } // ацп канал 0 выход =103 нажат плюс
print_int( 36,0, multiplerY); }
}
Вложения:
Комментарий к файлу: кнопки в ТВ кнопки.PNG [55.87 KiB]
Скачиваний: 565
Котаны, поделитесь удачными примерами программного антидребезга. Делаю сейчас вот так
Код:
// Чтение клавиатуры do { _delay_ms(50); // Задержка от дребезга контактов Key1 = PIND & ~PINSQW; // На PINSQW приходит меандр 1 Гц от DS1307, исключаем меандр из опроса клавиш. _delay_ms(50); Key2 = PIND & ~PINSQW; } while (Key1 != Key2);
Но иногда не срабатывает, а иногда наоборот, дребезг всё-таки пролетает. Помогут ли кондёры 0.1uF параллельно тактовым кнопкам? Триггеры Шмидта будут в следующей конструкции.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения