Продолжаю. Вчера выкладывал код выдранный из своего генератора импульсов. В отличие от твоего он не помнит предыдущее состояние, а определяет, состояния, в которых может оказаться энкодер при следующем повороте. Сегодня ещё раз посмотрел, не понравилось. Убрал поиск и сразу вытаскиваю из FLASH новые состояния. Код стал ещё короче и уже внедрен в программу генератора.
Когда более-менее разобрался с си, у меня получилось писать программы так, чтобы компилятор выдавал более-менее приемлемый результат.
как говорилось в анекдоте (это не для прикола, а на полном серьезе), "я рад за вас, сэр!" и мне приятно, что и ты меня тоже можешь понять. akl, еще раз спасибо за активное участие и за новый вариант текста. да, текст получился короткий, в ближайшее время проанализирую его.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Не могу найти свою картинку, я ее по теме энкодеров выкладывал. В общем, вот картинка. Вместо счетчика D-триггер с подсоединенным D-входом на плюс питания, то есть на нем должна быть постоянно 1. Получается надежная схема выдающая импульсы при соответствующем направлении на соответствующих выходах. Можно реализовать программно такой способ. Будет время займусь.
akl, мне понравилось твоё табличное решение в твоём последнем файле. сегодня я его внедрил в свою программу. это позволило заметно сократить время нахождения в прерывании таймера. и у тебя в тексте было много излишеств, которые мне оказались не нужны, и у меня оказалось еще короче, чем у тебя. вот последний (окончательный) вариант моего текста: Спойлер
Код:
.include "m8def.inc" ; ATMega8 ; внутренний RC генератор 1 МГц ... .def old_state_enc = R24 ; предыдущее состояние энкодера .def new_state_enc = R25 ; новое состояние энкодера ; R26, R27 - счетчик энкодера ... .org 0 ... table_encoder: ;--- таблица соответствия предыдущего состояния следующим состояниям энкодера --- ; первое число соответствует увеличению, второе число - уменьшению .db 2, 1 ; предыдущее состояние 00 (0) .db 0, 3 ; предыдущее состояние 01 (1) .db 3, 0 ; предыдущее состояние 10 (2) .db 1, 2 ; предыдущее состояние 11 (3) ... clr old_state_enc ...
;------ Таймер0 ------ ldi R16, 2 ; предделитель = 8, интервал срабатывания Таймера0 2048 мкс out TCCR0, R16 ... ... ;--- Таймер0 --- timer0: push R16 ; сохраним регистры, которые использует прерывание push R30 in R16, SREG ; сохраним SREG push R16 ; сохраним SREG in new_state_enc, PinD andi new_state_enc, 3
ldi R30, (table_encoder<<1) ; загрузим адрес таблицы состояний энкодера add R30, old_state_enc ; вычислим смещение в таблице, для чего add R30, old_state_enc ; прибавим к адресу удвоенное предыдущее состояние lpm R2, Z+ ; прочитаем из таблицы значения состояний, соответствующих увеличению lpm R3, Z ; и уменьшению параметра cp new_state_enc, R2 breq Iref_plus cp new_state_enc, R3 breq Iref_minus rjmp nothing ; состояние энкодера не изменилось, или ошибочная комбинация состояний энкодера
Iref_plus: adiw R26, 1 rjmp nothing
Iref_minus: sbiw R26, 1
nothing: mov old_state_enc, new_state_enc ; новое состояние энкодера копируем в предыдущее состояние pop R16 ; восстановим SREG out SREG, R16 ; восстановим SREG pop R30 ; восстановим регистры, которые использует прерывание pop R16 reti
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
... Счетный вход - считаем "S" входом. R - так и остается сбросом. Соединяем выход 1 со входом запрета. Выход 0 - инверсный выход триггера. 1 - прямой выход триггера...
ВОПРОСЫ: - что такое вход запрета? у D-тригера, если "имеется в виду" тригер CD4013 след. входы/выходы
R - reset S - set to 1 D - input data C - clock/synchro Q0 & Q1 - triger output
- в описании от автора совсем "другой расклад" (S - счетный, R - сброс, Q1 - со входом запрета ... ?) - возможно имелось в виду 2е разные схемы? (хотя сомневаюсь
спасибо
_________________ Енот - это кот, только инкогнито! p.s. держитесь обоими руками, а то прорвет...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
"Идеальный триггер" можно собрать 3-мя вариантами. К561ИЕ8, у которой и есть вход запрета. Первый идеальный триггер у меня именно на ней и получился. Потом я проанализировал таблицы истинности других микросхем, получились следующие варианты: К561ТМ2, то есть D-триггер и К561ТВ1, JK-триггер. У КМОП микросхем положительная логика. То есть, активный уровень + питания. В отличие от ТТЛ, у которой отрицательная логика.
ну... умеете вы запутать ... ладно, подниму свои наработки давно минувших дней... геде там мои рабочие тетради и справочник "пыло" шилиться... фу-ты, "шило" пылиться?
_________________ Енот - это кот, только инкогнито! p.s. держитесь обоими руками, а то прорвет...
ну... умеете вы запутать ... ладно, подниму свои наработки давно минувших дней... геде там мои рабочие тетради и справочник "пыло" шилиться... фу-ты, "шило" пылиться?
На схеме, которую я выложил К561ТМ2. К561ИЕ8: 14-счетный вход, "S" вход. 15 "R" вход. 3 вывод - выход "0", инверсный выход триггера. 2 вывод - выход "1", соединен с 13 выводом запрета счета, прямой выход триггера.
JK-триггер подключается следующим образом: R-вход, J-вход садится жестко на плюс питания. C-вход служит S-входом. Выходы триггера остаются как есть.
Логика работы "идеального триггера" проста. Пусть у нас в качестве донора К561ИЕ8. Исходное состояние микросхемы - активный уровень на выходе "0". Подаем активный уровень на счетный вход, микросхема переключилась на выход "1". А так как этот выход соединен со входом запрета, то теперь хоть задолбись на счетном входе, микросхема будет в этом состоянии пока ее не сбросят подачей активного уровня на R-вход.
Так же работают и D-триггер и JK-триггер. Входом "S" служат счетные входы. Исходное состояние триггеров - на инверсном выходе 1, на прямом 0. Так как входы D и J жестко посажены на плюс питания, при подаче активного уровня на счетный вход, переносится состояние информационных входов, то есть D или J. А так как на них всегда плюс питания, значит на прямом выходе будет активный уровень. Триггеры будут в этом состоянии, пока их не сбросят подачей активного уровня на R-вход.
Есть но. После подачи питания триггеры нужно сбрасывать подачей активного уровня на R-вход. Еще лучше, изначально обеспечить активный уровень на R-входе после подачи питания. Иначе триггеры могут быть в любом состоянии.
Также следует учитывать, что это КМОП микросхемы, это означает, что нужно зашунтировать незадействованные входы или жестко подать соответствующие уровни, чтобы не нарушалась логика работы от помех. Задействованные входы в обязательном порядке следует зашунтировать резисторами.
зю по поводу вашей схемы, которую вы выложили ранее (и уточнения по поводу КМОП)
Цитата:
На схеме, которую я выложил К561ТМ2.
Цитата:
Входы подтяните резисторами на минус питания
следовательно схема будет такой к стати, резисторы в "подтяжке" не только не нужны, но и вредны, все-таки будут на себе собирать наводки, хоть и маленькие, но КМОП их прекрасно может "гип-п-Потетически услышать"
далее, проанализировав таблицу истинности, я усомнился в правильности схемы:
исходные данные: S & D - установлены в неактивное состояние
S - не активно, следовательно триггер устанавливается только D-данными на входе по CLK синхроимпульсу D - на нуле, следовательно триггер синхроимпульсом может только сброшен т.е. триггер будет находиться в нулевом состоянии, без возможности быть установленным (если он до этого как то не "устанавливается")
возможность повлиять на состояние триггера есть только у R, который получает так-же код грея, от "соседнего" контакта, при таком раскладе, судя по таблице истинности:
Код:
---------- S R | Q1 Q2 ---------- 0 0 | 1 0 0 1 | 1 1 ----------
т.е. изменяется Q2(INV), повторяя форму сигнала на входе
схему Demiurg-а проверял на железе, хоть "она" и не укладывалась в "мою философию"... схема не работает ... и ...
естественно, я сразу полез искать свои наработки... давно, когда только начал интересоваться работой с энкодером, тогда и перебрал (в инете, свои наброски) кучу схем "входных триггеров", все они как-то да не нравились, в итоге, набросал согласно "своей философии"...
отработал схему и отложил, т.к. обработку энкодера возложил на "прерывания" и "доп.код с фильтром"...
вспомнил "эту тему", в связи с тем, что на отладочной плате энкодер неслабо раздолбался, что даже "программная фильтрация" уже не помогала
когда разрабатывал "свой триггер", то руководствовался след. мыслями (по памяти)
- триггер должен устанавливаться по синхро сигналу, следовательно
Код:
на входе D - единица на входе CLK - код грея
- второй триггер не должен "устанавливаться", в тот момент, когда первый триггер уже "активный", следовательно
Код:
на вход R - активный сигнал от "соседнего" канала
- код грея должны быть инверсным, по отношение к "активности" триггера, т.к. триггер не должен сразу сломя голову переключаться при "первом же приходе", он должен переключаться где-то "посредине" и еще лучше "в конце" цикла, это подавит "шевеление около нуля"
собственно, как-то так я думал тогда давно ... и схема набросалась само-собой, сканы из тетради и игловская схема
с этой схемой раздолбанный энкодер вполне себе помолодел лет эдак на 5ть
небольшие выкусы из тетради:
по поводу вх. импульсов: именно "отр. импульсы" - для срабатывания в конце, иначе сработает ТИК в самом начале, т.е. возможно сильное биение около нейтрального положения, а в нашем случае ТИК срабатывает где-то уже в конце
уточнение - энкодер 4х тактный, со стандартным кодом грея (полный цикл), это к тому, что есть и "нестандартные энкодеры" - на выходе получаем не "код грея" а уже готовый чистый сигнал INC & DEC, аналогично кнопкам, обработка такого сигнала - прямо благодать какая-то
p.s. схема, вообщем-то, отличается двумя правильными пинами и rc-фильтром (все гениальное, не только простО, но, видимо и имеет одну форму реализации )
резисторы в "подтяжке" не только не нужны, но и вредны
эвона как меня торкнуло, валериянки переборщил... почему-то подумал про "установочные входы", а не про "счетные"...
а так ДА, счетные входы должны быть "подтянуты" куда либо, каюсь, переборщил с "вкусностями", ну т.е. в "общем"... а в конечной схеме - все нормально... там энкодер подключен соотв. образом
_________________ Енот - это кот, только инкогнито! p.s. держитесь обоими руками, а то прорвет...
Заголовок сообщения: Re: Программная обработка Энкодера на AVR
Добавлено: Вс апр 29, 2018 16:22:53
Опытный кот
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
А в чем, вообще, проблема? Я всегда по любому изменению сигналов на любом из выходов энкодера сравнивал текущее состояние с предыдущим и по таблице принимал решение, что делать: добавить единичку к коду, вычесть, или оставить, как было. На 8-й Меге это очень удобно: разрешаешь прерывания INT0 и INT1 по любому изменению на этих входах. Они у нее у нее подключены к пинам PD2 и PD3, считываешь PIND, выделяешь эти биты по маске 0x0C, присоединяешь к ним старое их значение в битах 0-1 и готова ссылка в 16-байтовую таблицу, в которой закодированы действия по сочетанию старого и нового значений. И на здоровье, пусть себе дребезжит контакт, ну, переключится несколько раз младший бит, перед тем, как все устаканится, и что с того?
Кстати, вот такой энкодер на один щелчок вала делает четыре переключения.
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
> А в чем, вообще, проблема? какая проблема? ау...ууу? кто тут?! никаких проблем... :о)))
что мы тут "устаканивали и обсуждали"? это шум раздолбанного энкодера, дребезг контактов и входной триггер-подавитель дребезга (на старые раздолбанные энкодера весьма не помешает) а если у вас "но_проблем", то вы ломать энкодеры не умеете и вам "все это", что мы тут обсуждали - крайне не нужно ... муррр... а случаи бывают и такие, что энкодер/контроллер начинает сильно тупить, и только - триггер/подавитель/спец.микруха ...
_________________ Енот - это кот, только инкогнито! p.s. держитесь обоими руками, а то прорвет...
Заголовок сообщения: Re: Программная обработка Энкодера на AVR
Добавлено: Вт июн 19, 2018 19:46:52
Опытный кот
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
О, какая красота. Тут, пожалуй, в самый раз применить интегратор с последующим триггером Шмитта. Я об этом недавно писал, вот здесь, правда там говорили о кнопках, но для такого энкодера это еще нужней.
А у Вас, случайно, не найдется к этому энкодеру тестовая платка с 8-й Мегой? Я тут, по-быстрому, накидал программулю, которая, как раз, и реализует эти интегратор с ТШ. Хотелось бы попробовать на таком энкодере. А то мой энкодер не настолько злобный...
Мега 8, скользяшие контакты энкодера подключены к PC0 и PC1, контакт на ручке - PC2, результаты выдаются на UART (использован только TxD, обратный канал UART не задействован, смотреть в терминалке).
Вложение:
Комментарий к файлу: Проект GCC, Студия 4.19 enctst.zip [35.42 KiB]
Скачиваний: 333
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Заголовок сообщения: Re: Программная обработка Энкодера на AVR
Добавлено: Пт июн 22, 2018 12:15:45
Опытный кот
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
Demiurg писал(а):
Насколько мне помнится триггеры Шмитта есть в мк AVR.
Да, только они "заточены" исправлять неидеальности нормальных цифровых сигналов - затянутые фронты, небольшой "звон" и т.п. Чтобы этот ТШ справидся с той дрянью, которую дает сухой контакт низкого качества (как на приведенных осциллограммах) его совершенно недостаточно.Для такого сигнала необходим, хотя бы, RC-фильтр, который "задавит" выбросы, которые доходят до полных +5В, не говоря уже об уровне "лог 1". То есть, как минимум, еще один резистор и конденсатор на каждый из контактов энкодера, которые надо рассчитать и припаять. Кроме того, не факт, что сигнал после этого фильтра будет иметь требуемый уровень, в смысле, пороги встроенного ТШ окажутся подходящими для этого сигнала. Почти наверняка это будет не так, придется принимать меры по подгонке уровня сигнала к порогам ТШ, а это еще резистор-другой на каждый из контактов. А еще, с расчетом там не так все просто, надо решать задачу аналитически и только потом считать.
Программная же реализация всего этого - два десятка строк кода, подстройка всех фильтраций, порогов и т.п. - несколько констант в программе, я даже не считал - так, прикинул что к чему, решил, что 1600 опросов в секунду хватит, ну и вперед! Оказалось, не хватает, если быстро крутануть ручку энкодера, начинаются сбои. Пришлось сделать 6400 опросов. Я там, кстати, настройку таймера изменил, а комментарий поправить забыл - старая строка с 1600 Гц осталась закомментированной, а в новой, сделанной из этой, код я поправил, а комментарий забыл...
Ну да, мой энкодер не настолько злобный, возможно, для того, осциллограммы которого показал sunjob, придется подкрутить что-то еще, например, пороги, но это, опять же, несколько констант в программе.
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
- правильно отрабатывает при "нормальном" вращении, но при "быстрых тиках" - затыкается - проверялся только на "злом" энкодере, на "нормальном" должен отрабатывать правильно - вполне пригоден для повторения/добработки - подрихтов автором под ATmega328/Arduino-Nano, видимо, и обычная "мандарина" переварит - энкодер примерно такой что и на снимках выше - подключение : PC0,PC1 - энкодер, PC2 - кнопка - код достаточно подробно откомментирован (две реализации, немного отличаются, но суть таже)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения