- Регистрация
- 10.04.2020
- Сообщения
- 85
- Реакции
- 105
- Баллы
- 53
- Адрес
- Донецкая область
- Имя
- Андрей
- Прошивка
- 1.1h
Код для ATMega8 и подобных где прерывания int0&int1 висят на пинах PIND.2 PIND.3
Памяти задействовано всего один байт под temp и всего 3 регистра под всю обработку!
Ни чего не мешает опрашивать по таймеру любые другие ноги любой AVR. Нужно всего лишь сравнивать результат после 4 строки кода и пропускать если не было вращения.
!ldi r16,2 ;
!sbis PIND,3 ;если ноль...
!clr r16 ;стереть
!sbic PIND,2 ;если единица...
!inc r16 ;+1
!LDS r18,{temp} ;взять предыдущее состояние
!ldi r17,4 ;множитель
!mul r18,r17 ;умножить на 4> результат в R0
!sts {temp},r16 ;сохранить для следующей обработки
!ADD r16,r0 ;сложить текущее с предыдущим*4
!inc r16 ;результат для поиска в таблице
;как взять байт с таблицы не пишу.
!Val_: ; таблица состояний
! Data 2 , 2 , 1 , 0 , 2 , 0 , 2 , 2 , 1 , 1 , 2 , 2 , 0 , 2 , 0 , 1
!RET
Вращение влево>5,3,12,14,5,3,12,14 и так далее
Вращение вправо>9,2,8,15,9,2,8,15
Любое отличие от кода Грея (например дребезг контактов если валкод механический) будет всегда давать двойку выбранную в таблице. 0 и 1 истинные состояния.
PS:готов выслушать поэтов-шутников с примером кода обработки валкодера компактнее и быстрее.
Памяти задействовано всего один байт под temp и всего 3 регистра под всю обработку!
Ни чего не мешает опрашивать по таймеру любые другие ноги любой AVR. Нужно всего лишь сравнивать результат после 4 строки кода и пропускать если не было вращения.
!ldi r16,2 ;
!sbis PIND,3 ;если ноль...
!clr r16 ;стереть
!sbic PIND,2 ;если единица...
!inc r16 ;+1
!LDS r18,{temp} ;взять предыдущее состояние
!ldi r17,4 ;множитель
!mul r18,r17 ;умножить на 4> результат в R0
!sts {temp},r16 ;сохранить для следующей обработки
!ADD r16,r0 ;сложить текущее с предыдущим*4
!inc r16 ;результат для поиска в таблице
;как взять байт с таблицы не пишу.
!Val_: ; таблица состояний
! Data 2 , 2 , 1 , 0 , 2 , 0 , 2 , 2 , 1 , 1 , 2 , 2 , 0 , 2 , 0 , 1
!RET
Вращение влево>5,3,12,14,5,3,12,14 и так далее
Вращение вправо>9,2,8,15,9,2,8,15
Любое отличие от кода Грея (например дребезг контактов если валкод механический) будет всегда давать двойку выбранную в таблице. 0 и 1 истинные состояния.
PS:готов выслушать поэтов-шутников с примером кода обработки валкодера компактнее и быстрее.