jp111 (16.12.2015 17:15, просмотров: 330) ответил alex 54 на Насчет обработчика энкодера на asm,выложите пожалуйста что есть,может с этого и начну.
Несколько слов об реализованной идее. всё происходит в регистрах, поэтому эти регистры больше нигде не использовать.
написано для atmega16. для подключения энкодера используем две ноги порта подряд (в данном примере PIND6 и PIND7). в данном примере используем прерывания по изменению на ноге, но можно и прерывание по таймеру. Место расположения обработчика энкодера (таблицы переходов) в ПЗУ задается жестко. Будут вопросы - спрашивайте. Если в переменной ENC использовать 5-й бит для маркировки вектора (вперед или назад), то при запрещенной ситуации типа было 00 стало 11 можно смещаться в ту же сторону, в которую было движение, раньше на 2. (актуально когда работаете по прерыванию от таймера и иногда можете пропустить событие). При этом таблица переходов увеличится в 2 раза.
.def ENC = r23
.def ENCL = r24 ; координаты энкодера
.def ENCH = r25
;.def ZL = r30
;.def ZH = r31
; -----------------------------
; обработка энкодера (таблица переходов)
.org 0x100
rjmp Eback ;0
rjmp Eminus ;1
rjmp Eplus ;2
rjmp Eback ;3
rjmp Eplus ;4
rjmp Eback ;5
rjmp Eback ;6
rjmp Eminus ;7
rjmp Eminus ;8
rjmp Eback ;9
rjmp Eback ;a
rjmp Eplus ;b
rjmp Eback ;c
rjmp Eplus ;d
rjmp Eminus ;e
rjmp Eback ;f
; окончание таблицы переходов
IRQ:
; обработчик энкодера
in r30, PIND
andi r30, 0x0c
add r30, ENC
ijmp
Eplus:
adiw ENCL, 1
lsr r30
lsr r30
mov ENC, r30
reti
Eminus:
sbiw ENCL, 1
lsr r30
lsr r30
mov ENC, r30
reti
Eback:
lsr r30
lsr r30
mov ENC, r30
reti
Init_Encoder:
ldi tmpu, (1<<ISC00)|(1<<ISC10)
out MCUCR, tmpu
ldi tmpu, (1<<INT1)|(1<<INT0)
out GICR, tmpu
ldi r31, 0x01
in r30, PIND
andi r30, 0x0c
lsr r30
lsr r30
mov ENC, r30
clr ENCL ; координаты энкодера
clr ENCH
ret