Обучение : Программирование на Ассемблере для PIC


Пример 8. Энкодер и шаттл: ввод цифровой информации

Энкодер иначе называют датчиком вращения (датчиком угла, датчиком поворота). Шаттл – это современное название элемента, который используется для ввода информации и управления цифровой техникой (музыкальные центры, ресиверы, тюнеры, автомагнитолы и пр.). Работа энкодера и шаттла заключается в выводе определенной последовательности импульсов при вращении вала устройства. Далее мы будем придерживаться названия энкодер, т.к. оно употребляется в официальной документации.

Энкодер современный и оригинальный элемент управления цифровыми устройствами. Энкодер по внешнему виду похож на переменный резистор (см. рисунок ниже). Вращение вала сопровождается щелчками, например 24 щелчка на один оборот. Аналогично работает колесо компьютерной мыши, только в данном случае вращают вал вместо колеса. Энкодер имеет 3 вывода – ABC и применяется для быстрого ввода данных в цифровые устройства. Некоторые модели имеют встроенную кнопку (например, PEC12-4220F-S0024), которая срабатывает по нажатию на вал энкодера (добавляется еще один вывод). Это свойство позволяет экономить порты МК: нажатием перебирать режимы, а вращением делать настройку. Например, одной ручкой энкодера можно  регулировать громкость, баланс, высокие и низкие частоты и пр. режимы, что требует всего лишь трёх сигнальных линий.

Принцип работы. При повороте на один щелчок, например, вправо, сначала замыкается контакт А+С, затем В+С. Когда в этом щелчке вал доворачивается, в той же последовательности контакты размыкаются. При повороте вала в другую сторону, последовательность замыкания с контактом С меняется, т.е. при повороте влево замыкаются сначала В+С, затем А+С.

 

 

Приведем пример программы работы с энкодером (например, с использованием энкодера типа PEC12 – Incremental Encoder). Сигнал с вывода А будет использоваться для отслеживания факта вращения, сигнал В – для оценки направления вращения.

 

            LIST        P=PIC16F84A
            __CONFIG    H3FF1

W           EQU         0
F           EQU         1
PC          EQU         H0002
STATUS      EQU         H0003
PORTA       EQU         H0005
PORTB       EQU         H0006
TRISA       EQU         H0005
TRISB       EQU         H0006
C           EQU         0
Z           EQU         2
Reg_1       EQU         H000C
Reg_2       EQU         H000D
Reg_3       EQU         H000E
Reg_4       EQU         H000F     ; регистр под результат

            org         0           ; начало программы            
; подготовительные моменты
            bsf         STATUS,5    ; переход в Банк 1
            movlw       b00011111
            movwf       TRISA
            clrf        TRISB
            bcf         STATUS,5    ; переход назад в Банк 0
; отрисовка нуля и подготовка регистра (очистка перед изменением)
            movlw       b01101111
            movwf       PORTB
            clrf        Reg_4
;====================================
; отслеживание вращения вала энкодера
En          btfsc       PORTA,0     ; старт от исходного значения (0 или 1)
            goto        en1
            goto        en2
en1         btfsc       PORTA,0     ; выход на единицу
            goto        en1
            goto        en3
en2         btfss       PORTA,0     ; выход на ноль
            goto        en2
            goto        en4
en3         call        Pause       ; задержка (антидребезг)
            btfss       PORTA,0     ; проверка на единицу
            goto        En
            goto        en5
en4         call        Pause       ; задержка (антидребезг)
            btfsc       PORTA,0     ; проверка на ноль
            goto        En
            goto        en5
; отслеживание направления вращения
en5         btfsc       PORTA,1
            goto        en6
            goto        en7
en6         call        Pause       ; задержка (антидребезг)
            btfsc       PORTA,1     ; проверка на единицу
            goto        min         ; уменьшение
            goto        En
en7         call        Pause       ; задержка (антидребезг)
            btfss       PORTA,1     ; проверка на ноль
            goto        max         ; увеличение
            goto        En
;====================================
; проверка на ноль (на крайнее значение) и уменьшение значения регистра
min         bcf         STATUS,Z    ; опустим флаг Z в ноль
            movf        Reg_4,F     ; копировать из Reg_4 в Reg_4
            btfsc       STATUS,Z    ; делаем бит-проверку Z-флага
            goto        m4          ; переходим на отрисовку значения
            decf        Reg_4,F     ; уменьшить значение на 1 и сохранить
            goto        m4
; проверка на 9 (на др. крайнее значение) и увеличение значения регистра
max         bcf         STATUS,C    ; опускаем флаг С в ноль
            movlw       .247        ; (255-9)+1 = 247 -> W
            addwf       Reg_4,W     ; (Reg_4)+W
            btfss       STATUS,C ; делаем бит-проверку C-флага
            goto        m5
            goto        m4
m5          incf        Reg_4,F     ; увеличить значение на 1 и сохранить

m4          movf        Reg_4,W
            call        TABLE
            movwf       PORTB
            call        Pause2
            goto        En
;====================================
TABLE       addwf      PC,F        ; Содержимое счетчика команд PC = PC + W
            retlw      b01101111 ; 0
            retlw      b00001100 ; 1
            retlw      b01011011 ; 2
            retlw      b01011110 ; 3
            retlw      b00111100 ; 4
            retlw      b01110110 ; 5
            retlw      b01110111 ; 6
            retlw      b01001100 ; 7
            retlw      b01111111 ; 8
            retlw      b01111110 ; 9
;====================================
;delay = 100 machine cycles
Pause       movlw       .33
            movwf       Reg_1
wr          decfsz      Reg_1, F
            goto        wr
            return
;delay = 50000 machine cycles
Pause2      movlw       .238
            movwf       Reg_1
            movlw       .65
            movwf       Reg_2
wr2         decfsz      Reg_1, F
            goto        wr2
            decfsz      Reg_2, F
            goto        wr2
            return
            end                     ; конец программы


Ниже текст прошивки:

:020000040000FA
:1000000083161F308500860183126F3086008F01B2
:1000100005180B280E2805180B281128051C0E287A
:1000200015284120051C08281928412005180828F2
:10003000192885181C2820284120851824280828DC
:100040004120851C2A28082803118F08031931280C
:100050008F0331280310F7300F07031C3028312895
:100060008F0A0F08362086004620082882076F3442
:100070000C345B345E343C34763477344C347F3427
:100080007E3421308C008C0B43280800EE308C002D
:0E00900041308D008C0B4A288D0B4A28080049
:02400E00F13F80
:00000001FF

Если предполагается низкая скорость вращения – задержки увеличивают, иначе их можно уменьшить. Задержки для подавления дребезга подбираются экспериментально. Ниже приводим схему подключения энкодера к макетной плате (обозначение элемента нам ранее не встречалось, соответственно, предлагаем свой вариант).

 



Далее рисунок печатной платы (вид со стороны печати).




Вид со стороны элементов.

 


Фотография собранного и подключенного к макетной плате энкодера.

 

На данной плате смонтирован энкодер со встроенной кнопкой. В связи с этим плата разведена с учетом этой особенности на перспективу использования.

Алгоритм работы с энкодером и шаттлом можно использовать для создания устройства, подсчитывающего количество людей, входящих и выходящих в помещение. Алгоритм найдет применение в автоматизации работы турникетов. В качестве датчика можно применить пару простейших оптических приемников и передатчиков.

(В данном примере энкодер обслуживается путем опроса сигнальных линий; по-взрослому энкодер должен обслуживаться по факту прерываний; прерывания будут рассмотрены далее).


<<< назад далее >>>

Просмотров: 39051

 








 
 
 

В русском Интернете бестолку защищать свои права. Хотите использовать материалы - используйте,
но с письменного согласия авторов. В противном случае будут высланы соответствующие письма
в поисковые системы об ограничении индексации ваших сайтов. Не доводите до греха.