Основным языком программирования для микроконтроллеров является ассемблер, для компиляции исходного текста программы на языке ассемблер для PIC-микроконтроллеров используется инструмент MPASM входящий в интегрированную среду разработки MPLAB.
Исходный файл программы может быть написан в любом текстовом редакторе ASII. Текст программы, написанный на ассемблере, должен удовлетворять следующим условиям: каждая строка файла может содержать до четырех информационных полей, записываемых в последовательности:
Метка | Мнемоника команды | Операнды команды | Комментарии |
Start | bcf STATUS, | RP1 | ; выбор банка |
Максимальная ширина колонки 255 символов; метки от мнемоник должны отделяться двоеточием, пробелами, операнды должны разделяться запятыми, комментарии могут следовать за операндами, мнемониками и метками и могут начинаться в любой колонке, комментарии отделяются точкой с запятой.
Метка должна начинаться с символа латинского алфавита или с символа подчеркивания «_» и может состоять из алфавитно-цифровых символов латинского алфавита, символа подчеркивания «_» или знака вопроса «?».
Максимальная длина метки 32 символа, по умолчанию метки чувствительны к регистру символов.
Как и большинство ассемблеров, MPASM нечувствителен к управляющему символу «Tab(табуляция)», и поэтому листинги можно табулировать ровно настолько, насколько это позволяет делать программу удобочитаемой.
Ассемблер не различает прописные и строчные символы в командах и директивах. Они различаются только в идентификаторах (именах), если не отключена соответствующая опция.
Цифровые данные могут быть выражены в десятичном, шестнадцатеричном, восьмеричном, двоичном или ASII кодах. Типы используемых числовых данных представлены в таблице 3.1. В таблице 3.2 приведены наиболее употребительные математические операторы.
Таблица 3.1 Типы числовых данных
Формат данных | Способ записи | Пример |
Десятичный | d’Данные’ | d’100’ |
.Данные | .100 | |
Шестнадцатеричный | Данные | 9f |
0f9 | ||
h'Данные' | h'9f'’ или h'f 9' | |
Данные h | 9fh | |
0f9h | ||
0xДанные | 0x9f или 0xf9 | |
Восьмеричный | Q'Данные' | Q'777' |
Двоичный | b'Данные' | b'00110101' |
ASII | 'Данные' | 'C' |
A'Данные' | A'–' |
Таблица 3.2 Математические операторы
Оператор | Функция | Синтаксис |
= | Присвоить значение | TMP1= h’a9’ |
+ | Сложение | TMP1=TMP+.10 |
- | Вычитание | TMP1=TMP-h’a9’ |
- | Изменение знака | TMP1= -TMP |
% | Деление по модулю | |
* | Умножение | TMP1=TMP*.2 |
/ | Деление | TMP1=TMP/10 |
<< | Сдвиг влево (на флаг «С» не воздейст.) | TMP1= TMP<<1 |
>> | Сдвиг вправо (на флаг «С» не воздейст.) | TMP1= TMP>>2 |
() | Скобки | (TMP+2)*9 |
= = | Равно | If TMP1 = = maska |
!= | Не равно | If TMP1! = maska |
<= | Меньше или равно | If TMP1 < = maska |
>= | Больше или равно | If TMP1 > = maska |
~ | Поразрядное НЕ | TMP1= TMP |
| | Поразрядное ИЛИ | TMP1= TMP | maska |
& | Поразрядное И | TMP1= TMP & maska |
|| | Логическое ИЛИ | If (TMP1 = = maska) || (TMP = = maska) |
&& | Логическое И | If (TMP1 = = maska) && (TMP = = maska) |
^ | Поразрядное Исключающее ИЛИ | TMP1= TMP ^ maska |
$ | Текущее значение программного счётчика | $+3 |
При написании программы важно уяснить что, различают мнемоники команды микроконтроллера, директивы ассемблера и макрокоманды.
Директива – это команда MPASM, которая входит в состав исходного текста программы, но непосредственно не включается в выходной код. Директивы используются для управления MPASM, параметрами ввода-вывода и распределением данных. В таблице 3.3 приведены наиболее употребительные директивы ассемблера.
Таблица 3.3 Директивы ассемблера
Директива | Функция |
DATA | Инициализирует несколько слов, хранящихся в памяти. |
ZERO | Заполняет нулями область памяти, размер которой задаётся числом, следующим за директивой. |
SET | Определяет значение переменной. |
RES | Резервирует память, объём которой указан следующим за директивой числом. |
EQU | Определяет константу в программе. |
INCLUDE | Позволяет вставить файл внутрь текущей программы. |
IF | Определяет начало кодового раздела условного ассемблирования. |
ELSE | Определяет начало альтернативного кодового раздела условного ассемблирования. |
ENDIF | Заканчивает кодовый раздел условного ассемблирования. |
ORG | Определяет абсолютный адрес кода. |
END | Заканчивает исходный текст. |
MACRO | Определяет начало кода макрокоманды. |
ENDM | Определяет конец кода макрокоманды. |
LOCAL | Определяет локальную переменную в макрокоманде. |
EXITM | Выход из макрокоманды. |
Макрокомандами называют специальные команды, введенные фирмой Microchip, чтобы повысить функциональную гибкость системы команд микроконтроллеров. Указанным командам соответствуют специальные служебные слова. Как правило, они формируются из небольшого числа стандартных команд микроконтроллеров.
Команда микроконтроллера является частью системы команд микроконтроллера, состав которой индивидуален для каждого микроконтроллера. Например, микроконтроллер PIC16F877 имеет систему команд, включающую в себя 35 команд. Список команд контроллера рассмотрен в разделе 1.13, таблица 1.18.
Каждая команда микроконтроллера состоит из 14-разрядного слова (для PIC16F628), состоящего из кода операции (OPCODE), определяющего тип команды и одного или нескольких операндов, определяющих операцию команды. Команды разделены на 3 следующие группы:
- байт ориентированные;
- бит ориентированные;
- команды управления и операций с константами.
В таблице 3.4 представлены сгруппированные команды микроконтроллера.
Таблица 3.4 Список команд микроконтроллера PIC16F877
Мнемоника команды | Описание | Циклов | Флаги | |
Байт – ориентированные команды | ||||
ADDWF | f, d | Сложение W и f | C,DC,Z | |
ANDWF | f, d | Побитное «И» W и f | Z | |
CLRF | f | Очистить f | Z | |
CLRW | – | Очистить W | Z | |
COMF | f, d | Инвертировать f | Z | |
DECF | f, d | Вычесть 1 из f | Z | |
DECFSZ | f, d | Вычесть 1 из f и пропустить если 0 | 1(2) | Z |
INCF | f, d | Прибавить 1 к f | Z | |
INCFSZ | f, d | Прибавить 1 к f и пропустить если 0 | 1(2) | Z |
IORWF | f, d | Побитное «ИЛИ» W и f | Z | |
MOVF | f, d | Переслать f | Z | |
MOVWF | f | Переслать W в f | – | |
NOP | – | Нет операции | – | |
RLF | f, d | Циклический сдвиг f влево через перенос | C | |
RRF | f, d | Циклический сдвиг f вправо через перенос | C | |
SUBWF | f, d | Вычесть W из f | C,DC,Z | |
SWAPF | f, d | Поменять местами полубайты в регистре f | ||
XORWF | f, d | Побитное «исключающее ИЛИ» W и f | Z | |
Бит – ориентированные команды | ||||
BCF | f, b | Очистить бит b в регистре f | – | |
BSF | f, b | Установить бит b в регистре f | – | |
BTFSC | f, b | Проверить бит b в регистре f, пропуст. если 0 | 1(2) | – |
BTFSS | f, b | Проверить бит b в регистре f, пропуст. если 1 | 1(2) | – |
Команды управления и операции с константами | ||||
ADDLW | k | Сложить константу с W | C,DC,Z | |
ANDLW | k | Побитное «И» константы и W | Z | |
CALL | k | Вызов подпрограммы | – | |
CLRWDT | – | Очистить WDT | -TO, -PD | |
GOTO | k | Безусловный переход | ||
IORLW | k | Побитное «ИЛИ» константы и W | Z | |
MOVLW | k | Переслать константу в W | – | |
RETFIE | – | Возврат из п/п с разрешением прерываний | – | |
RETLW | k | Возврат из п/п с загрузкой константы в W | – | |
RETURN | – | Возврат из п/п | – | |
SLEEP | – | Перейти в режим SLEEP | -TO, -PD | |
SUBLW | k | Вычесть W из константы | C,DC,Z | |
XORLW | k | Побитное «исключающееИЛИ» константы и W | Z |
Память данных микроконтроллера разделена на четыре банка, которые содержат регистры общего и специального назначения. Регистры специальных функций, расположены в первых 32 байтах каждого банка памяти данных (раздел 1, таблица 1.3).
В таблице 3.5 показано состояние управляющих битов при обращении к банкам памяти данных.
Таблица 3.5 Состояние управляющих битов при обращении к банкам памяти данных
Банки памяти данных | RP1 | RP0 |
Банк 0 (0х00-0х7F) | ||
Банк 1 (0x80-0xFF) | ||
Банк 2 (0x100-0x17F) | ||
Банк 3 (0x180-0x1FF) |
Выбор банка осуществляется с помощью команд bcf и bsf, изменяя состояние 5 (RP0) и 6 (RP1) битов регистра специального назначения STATUS.
Например, выбор 3 банка осуществляется c помощью комбинации команд:
bcf STATUS, RP0
bsf STATUS, RP1
Как было отмечено выше, наряду с регистрами общего назначения существуют регистры специального назначения. С помощью регистров специального назначения (РСН) выполняется управление функциями ядра и периферийными модулями микроконтроллера. Рассмотрим некоторые из них: STATUS, TRISA, TRISB, PORTA и PORTB.
Регистры PORT А и TRISA
PORTA – 6 - разрядный порт ввода вывода. Все каналы PORTA имеют соответствующие биты направления в регистре TRISA, позволяющие настраивать канал как вход или выход. Запись '1' в TRISA переводит соответствующий выходной буфер в 3-е состояние. Запись '0' в регистр TRISA определяет соответствующий канал как выход, содержимое защелки PORTA передается на вывод микроконтроллера (если выходная защелка подключена к выводу микроконтроллера).
Чтение регистра PORTA возвращает состояние на выводах порта, а запись производится в защелку PORTA. Все операции записи в порт выполняются по принципу «чтение - модификация - запись», т.е. сначала производится чтение состояния выводов порта, затем изменение и запись в защелку.
RA4 - имеет триггер Шмидта на входе и открытый сток на выходе, мультиплицирован с тактовым входом TOCKI. Все остальные каналы PORTA имеют TTL буфер на входе и полнофункциональные выходные КМОП буферы.
Каналы PORTA мультиплицированы с аналоговыми входами АЦП и аналоговым входом источника опорного напряжения VREF. Биты управления режимов работы каналов порта ввода/вывода PORTA находятся в регистре ADCON1.
Примечание: После сброса по включению питания выводы настраиваются как аналоговые входы, а чтение дает результат '0'.
Биты регистра TRISA управляют направлением каналов PORTA, даже когда они используются как аналоговые входы. Пользователь должен удостовериться, что соответствующие каналы PORTA настроены на вход при использовании их в качестве аналоговых входов.
Пример: Инициализация PORTA
;Настроить PORTA как порт дискретного ввода/вывода
;назначение выводов порта А осуществляется в регистре ADCON1(9fh)
;(раздел 1.8.1) установкой управляющих битов:
; PCFG3, PCFG2, PCFG1, PCFG0 = 000001100b, или 0x06.
; ADCON1 находится в 1-м банке.
BCF STATUS, RP1;Выбрать банк 0
BCF STATUS, RP0;RP1=0, RP0=0
CLRF PORTA;Инициализация защелок PORTA
BSF STATUS, RP0;Выбрать банк 1(RP0=1)
MOVLW 0X06;
MOVWF ADCON1; Каналы PORTA - цифровые входы/выходы
MOVLW 0xCF; Значение для инициализации
; направления каналов PORTA
MOVWF TRISA; Настроить RA<3:0> как входы,
; настроить RA<5:4> как выходы
; Биты TRISA<7:6> всегда
; читаются как '0'.
Действия в отношении регистров PORTВ и TRISВ, аналогичны действиям с регистрами PORTA и TRISA кроме того, что PORTВ работает только как дискретный и настраивать его не надо.
При написании программы, следует учитывать, что регистры PORTA и PORTB расположены в нулевом банке, а регистры TRISA и TRISB – в первом.
Регистры PORTB и TRISB
PORTB - 8-разрядный двунаправленный порт ввода/вывода. Биты регистра TRISB определяют направление каналов порта. Установка битва в '1' регистра TRISB переводит выходной буфер в 3-е состояние. Запись '0' в регистр TRISB настраивает соответствующий канал как выход, содержимое защелки PORTB передается на вывод микроконтроллера (если выходная защелка подключена к выводу микроконтроллера).
К каждому выводу PORTB подключен внутренний подтягивающий резистор. Бит –RBPU (OPTION_REG <7>) определяет подключены (–RBPU=0) или нет (–RBPU=1) подтягивающие резисторы. Подтягивающие резисторы автоматически отключаются, когда каналы порта настраиваются на выход и после сброса по включению питания POR.
Содержание лабораторной работы
При выполнении лабораторных работ могут использоваться двунаправленные порты ввода-вывода, которых у микроконтроллера PIC16F877 пять: порт А, порт В, порт C, порт D и порт E. Команды по пересылки данных для них аналогичны командам по работе с регистрами общего назначения. Например, для пересылки данных из аккумулятора на выводы порта А, необходимо набрать команду movwf PORTA. Следует отметить, что допускается запись команды, как заглавными, так и строчными буквами, но не операнда.
Задание
Написать программу, в которой переменная Dat, в виде номера варианта в шестнадцатеричной форме с регистра общего назначения отсылалась на порт B, затем регистр Dat должен быть очищен.