ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
22 ноября
638741 Топик полностью
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