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


Теория и практика работы портов МК

Ранее мы рассматривали обозначение ножек МК и упоминали о двунаправленной работе выводов, а именно о работе на вход или на выход. По рисунку несложно определить, что все ножки портов (RA, RB) могут работать и на вход и на выход.

Однако, работа некоторых ножек различается на аппаратном уровне и в связи с этим при разработке схемы устройства следует учитывать эти особенности. Ничего страшного в этом нет, т.к. мы постараемся всё доходчиво разобрать.

Мы уже знаем, что ножки МК сгруппированы в т.н. порты. Ножки с префиксом RA относятся к порту A, а ножки RB – к порту B. Это свойство группировки позволяет нам работать одновременно с несколькими ножками, т.е. с помощью одной команды за раз можно отследить или изменить состояние всех ножек порта через регистры PORTA и PORTB. С другой стороны, нет никаких препятствий для индивидуальной работы с конкретной ножкой конкретного порта.

За работу каждого порта в PIC16F84A отвечают по два регистра специального назначения (в скобках указаны соответствующие адреса этих регистров в области оперативной памяти):
 

Порт А

Порт Б

TRISA (h85) или (h05)

PORTA (h05)

TRISB (h86) или (h06)

PORTB (h06)

 


Биты в регистрах TRISA и TRISB определяют направление работы каждой ножки МК. По умолчанию все ножки работают на вход (все биты в регистрах установлены в единицу).
 

Рассмотрим соответствие битов в регистрах TRISA и TRISB реальным ножкам в портах МК на примере PIC16F84A.
 

бит

7

6

5

4

3

2

1

0

TRISA

_

_

_

RA4

3 выв.

RA3

2 выв.

RA2

1 выв.

RA1

18 выв.

RA0

17 выв.

TRISB

RB7

13 выв.

RB6

12 выв.

RB5

11 выв.

RB4

10 выв.

RB3

9 выв.

RB2

8 выв.

RB1

7 выв.

RB0

6 выв.

 

 

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

Итак, установка битов регистров TRISA и TRISB в единицу определяет работу ножек на вход; установка битов в ноль – работа ножек на выход. Общее мнемоническое правило в английском языке:
 

 

1 (Input) – работа на вход

0 (Output) – работа на выход

 

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

Что касается отслеживания сигналов на входе или установки сигналов на выходе, то эти функции выполняются через регистры PORTA и PORTB. Соответствие битов реальным ножкам в портах МК в регистрах PORTA и PORTB точно такое же, как и у регистров TRISA и TRISB.


Разберем работу ножек на вход. В этом режиме работы мы можем программно определить наличие логических уровней сигнала на входе через регистры PORTA и PORTB. В главе 1 мы давали понятие сигнала. Напряжение на ножке близкое к 0 вольт установит соответствующий бит соответствующего порта в ноль. Наоборот, напряжение близкое к 5 вольт установит соответствующий бит соответствующего порта в единицу.

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

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

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

Теперь осветим особенности работы ножек. Рассмотрим пример с использованием разомкнутой кнопки, которая одним выводом подключена на минусовой провод, а другим выводом к ножке на порту МК. Замкнем контакты кнопки; соответствующий бит устанавливается в логический ноль. Разомкнем контакты и… логическая единица не установится, т.к. уровню логической единицы соответствует напряжение 5 вольт. Для решения этого нюанса используется внешний т.н. подтягивающий резистор, который одним выводом подключен на плюсовой провод, а другим выводом к ножке на порту МК. Номинал сопротивления находится в диапазоне 10…50 ком. Таким образом, через подтягивающий резистор на ножке устанавливается высокий уровень сигнала и, следовательно, бит устанавливается в единицу.

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

По умолчанию активная нагрузка отключена. Здесь и далее под умолчанием понимается состояние регистров после включения питания. Лишь регистры энергонезависимой памяти сохраняют свое значение.

Активная нагрузка включается и выключается в регистре OPTION_REG (адрес h81). Активную нагрузку нельзя включить или выключить индивидуально для каждой ножки; управление активной нагрузкой реализовано одновременно для всех ножек. Либо нагрузка у всех ножек, либо ни у одной. В связи с этим подходом к управлению используется всего лишь один седьмой бит RBPU в регистре OPTION_REG.

В работе на выход все ножки всех портов работают одинаково, за исключением ножки RA4 (по причине её многофункциональности). Эта ножка не может устанавливать на своем выходе высокий уровень сигнала. Однако можно подключить к ножке RA4 внешний подтягивающий резистор к положительной линии питания и имитировать сигнал высокого уровня.

В качестве практического примера приведем программу по работе с портами. Сделаем постановку простейшей задачи – на выводах порта В установить различные сигналы, т.е. сигналы высокого и низкого уровня. Конкретизируем задачу: на четырех ножках будет логический ноль, а на других четырех – логическая единица (сигналы статические, т.е. неизменные в своем состоянии). Порядок следования сигналов для нас не имеет принципиального значения; в нашем примере сигналы установим через один. 

 

            LIST        P=PIC16F84A
            __CONFIG    H3FF1

 

STATUS      EQU         H0003
PORTB       EQU         H0006
TRISB       EQU         H0006

 

            org         0           ; начало программы

 

; подготовительные моменты
START       bsf         STATUS,5    ; переход в Банк 1
            clrf        TRISB
            bcf         STATUS,5    ; переход назад в Банк 0

 

; установка сигналов на порту В
            movlw       b01010101
            movwf       PORTB
 
            goto        START

 

            end                     ; конец программы
 

 

Напомним последовательность ваших действий по дальнейшей работе с этим текстом программы: в MPLAB создаем проект, там же создаем новый файл и подключаем его к проекту, копируем в него текст этой программы, компилируем и получаем hex-файл (см. главу 3). Далее прошиваем МК (инструкция в главе 4).
 

Результатом компиляции должен стать такой hex-файл (точнее его содержимое или иначе прошивка):
 

:020000040000FA

:0C0000008316860183125530860000280C

:02400E00F13F80

:00000001FF


Примечание. В целях чистоты эксперимента hex-файл компилировался также и в MPLAB версии 5.xx . Результат идентичный.

 

Кратко рассмотрим работу программы.

Шапка программы в больших пояснениях не нуждается; в ней описаны используемый микроконтроллер, его конфигурация и используемые регистры.

Строчка с директивой org 0 указывает начальный адрес программы. Если директива org отсутствует, то по умолчанию, как правило, программа начинает выполняться с первой строчки программы. Однако, есть исключение для случаев с прерываниями, когда выполнение программы возобновляется со строчки с адресом 4.

Подготовительные моменты касаются определения направлений работы портов. Регистр TRISB находится в первом банке памяти нам необходимо перейти в него, т.к. по умолчанию мы находимся в нулевом банке. PIC16F84A имеет два банка памяти – нулевой и первый. Переход между банками осуществляется путем изменения 5го бита (RP0) в регистре STATUS.  Имя бита RP0 мы не стали умышленно сопоставлять с числом 5, т.к., во-первых, вам будет проще понять суть действий, и, во-вторых, эта операция используется не часто (у нас один раз).

В соответствии с поставленной задачей для выводов порта В мы помещаем в аккумулятор число movlw b01010101 которое затем и помещаем в порт В из аккумулятора. Число вида b01010101 может быть записано в другом виде (в другой системе счисления), но мы решили не тратить время на перевод в другую систему счисления. На перспективу, после разбора этого абзаца, для вас будет интересным изменить биты регистра порта В таким образом, чтобы на выводах появилась рациональная комбинация сигналов, которая приведет к отображению на индикаторе осмысленного символа. Для этого возвращаемся к схеме макетной платы, смотрим какие ножки МК управляют соответствующими сегментами индикатора и определяем нужную комбинацию сигналов. Например, для символа «Н» нам нужно записать двоичное число b00111101 (звуковой излучатель не включаем).

Строчка goto START закольцовывает нашу программу. Необходимо отметить, что отсутствие этой строчки в данной программе не приведет к критической ошибке, т.к. наша задача сводится к установке определенной комбинации сигналов и эту установку достаточно выполнить один раз (вспомните концепцию работы ножек). Тем не менее, какая бы у вас задача не ставилась для МК, вашу программу следует закольцовывать в соответствии с циклической концепцией программы.

Последняя строчка с директивой end указывает для MPASM конец программы. Наличие этой строчки обязательно.


Обращаю внимание, пустые строчки в тексте программы служат для лучшего зрительного восприятия. Компилятор MPASM их игнорирует.

Этот раздел может показаться сложным. Однако его понимание составляет суть физиологии работы и является основой для схемотехнических решений с использованием МК. Мы уверены, что настойчивость во многих из вас ускорит освоение этого раздела и подготовит к покорению новых вершин и гораздо активными темпами.


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

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

 








 
 
 

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