Что нибудь можно сделать, чтоб избавится от дребезга? Пытаюсь сбрасывать бит IE0 в регистре PCON, на 12-тактовых это более-менее работает, на 1-тактовом (STC11F04E) это не работает никак, видимо слишком шустрый. Пытался внедрять задержки в подпрограмме, тоже не катит совсем. Кнопка на #INT0 работает кошмарно. Что в таких случаях обычно делается?
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Потому что никто так не делает. Разве что, из всяких слипов выходить. К чему такая молниеносная реакция на нажатие кнопки ?
молниеносная реакция мне не нужна. На самом деле пока не смог придумать как сделать кнопки на МК по-другому. Хочется читать штук 8, сразу. Захожу в прерывание, читаю порт с кнопками, кладу в регистр, выхожу из прерывания (МК при этом снимается с IDLE), Прерывание по нажатию любой кнопки, через диодное лог. "ИЛИ" на вход инта. Вроде все классно. Но пока решил попробовать с одной, и получается не очень.
Сканировать по таймеру каждые 20-50мс не пробовал?
Так-то классика жанра, которую ТС не знает. Ха-ха... С IDLE можешь выходить по прерыванию таймера, что, обычно, позволяли все МК на ядре MCS-51, с которыми я когда-то работал. И не нужно ни каких "монтажных И". Для считывания 8 кнопок хватит 6 ног МК. Если ног не хватает, то добавляется сдвиговый регистр, который уменьшит число потребных ног до трёх.
Px.0-Px.2 настроены как входы с подтягивающим резистором. Собственно там больше мороки с режимом прерывания - вход в обработчик по прерыванию, затем в теле обработчика запрет прерывания по INT, замена адреса возврата на адрес подпрограммы антидребезгового анализатора (при резервировании адреса возврата в точку вызова INT) и reti. Далее выполняем антидребезг, захват комбинации и по завершении ret в точку вызова INT с последующим разрешением самого INT. Это на случай, если в системе критичны прерывания более низкого уровня. Собственно сам антидребезг классика - последовательное чтение комбинации ЛВК при сравнении с предыдущим прочитанным. старт читать данные с Px.n - Px.m совпали с буфером? если совпало - установить флаг "данные готовы" и выход если нет - перезапись значения буфера текущим считанным, задержка в N интервал и повторять от старт
Ну и ессно смотрим чтобы выход на исполнение был не ранее "полного отпускания" ВСЕХ кнопок (или смены стабильной комбинации, если таковое возможно для программы). Иначе сразу по выходу снова в прерывание вскочим. Там вариаций море - все зависит от фантазии автора.
Вот только как все это сделать, блин. Примеры на "С" (а других в общем, нет) мне непонятны, я его почти не знаю, в больших программах на асме тоже сложно разобраться.
Вечерком чегось поднашкрябаю для примера... Именно под вариант прерывания - но только для базовой классики (AT89C51 за основу). Для STC там надо "привести в соответствие" - влазить в доки чуток влом.
Таймер с прерыванием в 1 мс настроить сможете? Заведите переменную, скажем counter = 20. В прерывании по таймеру делаете декремент counter, затем проверяете на 0. Если counter == 0, выставляете какой-то флаг, read_keys = 1.
В основном цикле программы постоянно сканируете этот флаг на равенство 1. Как только поймали, делаете read_keys = 0, counter = 20, call scan_keys. В scan_keys считываете весь порт в переменную keys в инверсном виде (вам же 8 кнопок нужно было?) Если keys не равен 0 проверяете его на равнство keys_old (предыдущее значение). Если не равны, то keys_old = keys и на выход. Если равны, значит в текущее значение равно считанному 20 мс назад - это ваш антидребезг. По значению переменной keys оперируете кнопками. При выходе обнуляете keys_old = keys = 0, но и тут возможны варианты, если планируете обрабатывать длительные нажатия.
Все это на ассемблере. А вообще, переходите на Си. Чтобы начать писать на нем, совсем необязательно знать все возможности. Начните с базовых операций, а остальное изучите по ходу дела.
Для корректной прожки с использованием моего c51asm надо набросать *.inc с базовым описанием... Мне его готовить влом... имеется в наличии для STCшек только под stc15f204ea...
Да так пока и лежит без дела (несмотря что есть подопытный МК).
Вспомнил, что в программе для прошивки встроены различные полезные утилиты для генерации готового кода, например, настройка таймера, а также множество демо-кодов (правда, описание на китайском, да еще и шрифт левый). Причем все это и на Си, и на асме. В даташите на семейство тоже хватает примеров использования.
b7 - PCAWAKEUP : PCA ЦР¶ПїЙ»ЅРС powerdownЎЈ b6 - RXD_PIN_IE : µ± P3.0(RXD) ПВЅµСШЦГО» RI К±їЙ»ЅРС powerdown(±ШРлґтїЄПаУ¦ЦР¶П)ЎЈ b5 - T1_PIN_IE : µ± T1 ЅЕПВЅµСШЦГО» T1 ЦР¶П±кЦѕК±їЙ»ЅРС powerdown(±ШРлґтїЄПаУ¦ЦР¶П)ЎЈ b4 - T0_PIN_IE : µ± T0 ЅЕПВЅµСШЦГО» T0 ЦР¶П±кЦѕК±їЙ»ЅРС powerdown(±ШРлґтїЄПаУ¦ЦР¶П)ЎЈ b3 - LVD_WAKE : µ± CMPIN ЅЕµНµзЖЅЦГО» LVD ЦР¶П±кЦѕК±їЙ»ЅРС powerdown(±ШРлґтїЄПаУ¦ЦР¶П)ЎЈ b2 - b1 - T1CLKO : ФКРн T1CKO(P3.5) ЅЕКдіц T1 ТзіцВціеЈ¬Fck1 = 1/2 T1 ТзіцВК b0 - T0CLKO : ФКРн T0CKO(P3.4) ЅЕКдіц T0 ТзіцВціеЈ¬Fck0 = 1/2 T1 ТзіцВК */ //---------- sfr CLK_DIV = 0x97; //Clock Divder - - - - - CLKS2 CLKS1 CLKS0 xxxx,x000 //---------- sfr BUS_SPEED = 0xA1; //Stretch register - - ALES1 ALES0 - RWS2 RWS1 RWS0 xx10,x011 /* ALES1 and ALES0: 00 : The P0 address setup time and hold time to ALE negative edge is one clock cycle 01 : The P0 address setup time and hold time to ALE negative edge is two clock cycles. 10 : The P0 address setup time and hold time to ALE negative edge is three clock cycles. (default) 11 : The P0 address setup time and hold time to ALE negative edge is four clock cycles.
Если keys не равен 0 проверяете его на равнство keys_old (предыдущее значение). Если не равны, то keys_old = keys и на выход.
меня вот тут ступор случилсся, чтоб сравнить с keys_old, его надо сначала где-то и как-то установить. А все проходы одинаковые, непонятно, где old, а где не old/
Изначально и старый и текущий - нулевые. Если при считывании текущий не ноль, тогда только сравниваете со старым. Если не равны, то keys_old = keys и на выход. В следующем проходе, если нажатие все-такие существуют, они будут равны, тогда и обрабатываете значение keys. При выходе опять обнуляете оба регистра (или нет, зависит от хотелок). keys (если через инверсию читаете) может быть равен 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40 или 0x80. Ну это если одновременно 2 и более кнопок не нажмете.
_________________ Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.
Для корректной прожки с использованием моего c51asm надо набросать *.inc с базовым описанием...
Я вообще не парюсь. Например, нужен регистр какого нет в классике, например, SPI в МК STC12C5A60S2 (успешно разобрался с MAX7219), я посмотрел его адрес в даташите, и сделал SPDAT equ (адрес регистра). Единственное что - замороченные STC8 и STC15, там надо внимательно читать все, даже некоторые стандартные 8051 регистры там могут быть не на своем месте, а на выводах портов включены альтернативные функции по умолчанию.
Последний раз редактировалось Shuspano Чт янв 21, 2021 15:12:40, всего редактировалось 1 раз.
Там простой буфер-регистр под временное хранение (inp_dat) и буфер для чтения (tmp_lvk) (у STC правда можно непосредственно с выводами сравнивать, но уж лучше таки прочитать значение). При первом вызове в него (inp_dat) записывается нейтральное состояние, статус tmp_lvk безразличен - он все равно свеженькое значение получит. Далее читаем порт в tmp_lvk сравниваем с inp_dat по результату или inp_dat = tmp_lvk - это случай подтверждения предыдущих считанных данных или в случае неравенства mov inp_dat,tmp_lvk ; и после интервала повторяем заново Только вот надо отслеживать комбинацию "все отпущены" как основу выхода по фальстарту или по завершении исполнения. А это уже дополнительная обработка считанных из порта данных. Можно дополнить еще одним регистром - счетчиком для стабилизации количества верно считанных и/или ошибочных комбинаций. Тогда тайминги автоматом уходят - просто используется контроль в течении N циклов подтверждения совпадения (та же программная задержка).
Сейчас этот форум просматривают: pavel08u и гости: 41
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения