каждое 10-е прерывание - тупо запоминаем состояние портов с кнопками и всё.
Понятно. Аналог задержки, но без задержки... т.е. получаем нечто, что было 10 миллисекунд назад, и надеемся, что сейчас оно такое самое и есть. Аесли нет? В чём смысл отложить опрос состояния кнопок на 10 мс?
В чём смысл отложить опрос состояния кнопок на 10 мс?
Не отложить, а ЗАЩЕЛКИВАТЬ состояние кнопки раз в 10 мс. Тут дело не в 10 мс, а во времени дребезга кнопки. При защелкивании состояния кнопки реже, чем длится дребезг, дребезг исчезнет.
зачем откладывать? бери и пользуйся. Вот прямо как прерывание произошло, состояние защелкнули - так сразу можешь брать и пользоваться. Смысл в чем, в том что состояние кнопок фиксируется один раз за цикл, и даже если фиксация попадёт на момент дребезга - максимум что может быть то один раз зафиксируем неверное состояние кнопки в момент перехода а это чревато только тем что нажатие мы увидим в худшем случае на следующий цикл опроса. Но сам дребезг программа не увидит.
из этого кстати следует естественное ограничение данного алгоритма - кнопка может быть в нажатом(отпущенном) состоянии для правильной работы не менее 2-х циклов опроса. Если не соблюсти это условие максимум что случится - пропустим событие нажатия кнопки. Человек, к примеру, так быстро нажимать кнопки не сможет. А для концевых выключателей или датчиков частоты вращения вала нужны другие методы подавления дребезга, зачастую даже механические.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
По задумке по нажатию кнопки должен загораться светодиод и гореть 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]
Скачиваний: 569
Котаны, поделитесь удачными примерами программного антидребезга. Делаю сейчас вот так
Код:
// Чтение клавиатуры do { _delay_ms(50); // Задержка от дребезга контактов Key1 = PIND & ~PINSQW; // На PINSQW приходит меандр 1 Гц от DS1307, исключаем меандр из опроса клавиш. _delay_ms(50); Key2 = PIND & ~PINSQW; } while (Key1 != Key2);
Но иногда не срабатывает, а иногда наоборот, дребезг всё-таки пролетает. Помогут ли кондёры 0.1uF параллельно тактовым кнопкам? Триггеры Шмидта будут в следующей конструкции.
//================== u08 scan_keys (void) { u08 a = 0;
if (Set_Is_Key_Enter_Pressed ()) a |= KEY_ENTER_BIT; if (Set_Is_Key_Plus_Pressed ()) a |= KEY_PLUS_BIT; if (Set_Is_Key_Minus_Pressed ()) a |= KEY_MINUS_BIT;
Сейчас этот форум просматривают: Kolin и гости: 30
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения