Ср ноя 16, 2016 13:09:58
Ср ноя 16, 2016 13:55:20
как говорилось в анекдоте (это не для прикола, а на полном серьезе), "я рад за вас, сэр!"Demiurg писал(а):Когда более-менее разобрался с си, у меня получилось писать программы так, чтобы компилятор выдавал более-менее приемлемый результат.
Ср ноя 16, 2016 17:18:34
Чт ноя 17, 2016 14:27:56
.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
Ср апр 11, 2018 10:50:13
... Счетный вход - считаем "S" входом. R - так и остается сбросом. Соединяем выход 1 со входом запрета. Выход 0 - инверсный выход триггера. 1 - прямой выход триггера...
Ср апр 11, 2018 11:02:44
Ср апр 11, 2018 13:24:12
Чт апр 12, 2018 19:47:21
Пт апр 13, 2018 06:45:41
На схеме, которую я выложил К561ТМ2.
Входы подтяните резисторами на минус питания
----------
S R | Q1 Q2
----------
0 0 | 1 0
0 1 | 1 1
----------
тригер сборошен : Q1=0, Q2(INV)=1
тригер установлено: Q1=1, Q2(INV)=0
на входе D - единица
на входе CLK - код грея
на вход R - активный сигнал от "соседнего" канала
Чт апр 19, 2018 21:35:06
резисторы в "подтяжке" не только не нужны, но и вредны
Вс апр 29, 2018 16:22:53
Пн апр 30, 2018 09:29:33
Вс июн 17, 2018 05:51:51
Вт июн 19, 2018 19:46:52
Ср июн 20, 2018 05:37:16
Ср июн 20, 2018 07:28:00
Пт июн 22, 2018 12:15:45
Да, только они "заточены" исправлять неидеальности нормальных цифровых сигналов - затянутые фронты, небольшой "звон" и т.п. Чтобы этот ТШ справидся с той дрянью, которую дает сухой контакт низкого качества (как на приведенных осциллограммах) его совершенно недостаточно.Для такого сигнала необходим, хотя бы, RC-фильтр, который "задавит" выбросы, которые доходят до полных +5В, не говоря уже об уровне "лог 1". То есть, как минимум, еще один резистор и конденсатор на каждый из контактов энкодера, которые надо рассчитать и припаять. Кроме того, не факт, что сигнал после этого фильтра будет иметь требуемый уровень, в смысле, пороги встроенного ТШ окажутся подходящими для этого сигнала. Почти наверняка это будет не так, придется принимать меры по подгонке уровня сигнала к порогам ТШ, а это еще резистор-другой на каждый из контактов. А еще, с расчетом там не так все просто, надо решать задачу аналитически и только потом считать.Demiurg писал(а):Насколько мне помнится триггеры Шмитта есть в мк AVR.
Пт июн 22, 2018 14:49:51
Вт июл 03, 2018 18:25:17