
umm_7154
.pdfпереносе из младшего полубайта в старший. Флаг нуля (Z, Zero) устанавливается, если результат выполнения команды равен нулю.
Память данных разделена на 4 банка памяти, каждый банк содержит до 128 регистров двух типов. Регистры первого типа имеют названия и выполняют специальные, заданные заранее функции. Такие регистры используются для управления и отслеживания состояния микроконтроллера и его периферийных устройств и называются регистрами специального назначения (РСН). Остальным регистрам – регистрам общего назначения (РОН) – можно присваивать имена и использовать для хранения пользовательских данных.
Адреса операндов в микроконтроллере PIC16F873 могут храниться в коде команды (прямая адресация) или в специальном регистре FSR (косвенная адресация). Так как команды хранятся в ПЗУ, адреса операндов при прямой адресации являются фиксированными и не могут изменяться. При косвенной адресации местоположение операндов является не константой в памяти программ, а переменной в регистре FSR, т. е. положение операнда может изменяться в процессе выполнения программы.
Для переключения в режим косвенной адресации внутренняя логика ядра микроконтроллера отслеживает обращение к регистру INDF. Когда в команде указывается этот регистр, на шину адреса памяти данных выставляется содержимое регистра FSR.
3.4. Выполнение команд
Фазы машинного цикла и операции, выполняемые блоками выборки и исполнения на каждом такте (фазе), представлены на рис. 3.5.
Все команды, кроме команд перехода выполняются за один машинный цикл. Каждый машинный цикл состоит из 4 машинных тактов. Частота машинных тактов определяется настройкой тактового генератора и подключенным к нему типом резонатора. Команды перехода могут выполняться за один или два машинных цикла. За два машинных цикла команда перехода выполняется, если требуется изменение последовательности выполнения программы и сброс конвейера.
51

52
Рис. 3.5. Фазы машинного цикла
3.5. Программирование микроконтроллера
Для функционирования микроконтроллера требуется разработка управляющей программы и ее загрузка в память программ. Микроконтроллеры хранят и выполняют программы в виде двоичных кодов, но разработка двоичных программ не удобна для человека. Программы разрабатываются на языке ассемблера или языках программирования высокого уровня таких, как C, Pascal и Basic. Для загрузки программы в процессор, она должна быть специально подготовлена – преобразована в машинный (двоичный) код. В настоящее время для разработки программ микропроцессоров и микроконтроллеров используются персональные компьютеры совместно с интегрированными средами разработки (IDE, Integrated Development Environment), например MPLAB IDE. Интегрированная среда разработки включает в себя текстовый редактор, ассемблер MPASM, набор программ для программирования и отладки, ряд файлов, упрощающих разработку. Существует возможность подключить компиляторы языков высокого уровня, предназначенных для программирования микроконтроллеров (например, MPLAB C, HI-TECH, MPLAB XC).
Загрузка программы выполняется устройствами, называемыми программаторами по последовательному интерфейсу внутрисхемного программирования (ICSP, In-Circuit Serial Programming). Для этого используются три вывода микроконтроллера: PGC (RB6) – вывод синхронизации, PGD (RB7) – вывод передачи данных, PGM (RB3) – вывод перехода в режим программирования.
3.6. Понятие языка ассемблера
Ассемблером называют программу-транслятор, предназначенную для преобразования исходного текста в символьной форме (мнемокоды) в машинные коды, а процесс такого преобразования называют ассемблированием. Одна ассемблерная строка преобразуется в одну машинную команду, что отличает язык ассемблера от языков высокого уровня, в которых одной команде может соответствовать несколько машинных кодов. Кроме преобразования мнемокодов, ассемблер распределяет команды по ячейкам памяти программ. Строка на языке ассемблера состоит из нескольких полей: поле метки, заканчивающееся двоеточием, поле команды, заканчивающееся пробелом, поле операндов и начинающееся
53
с точки с запятой поле комментариев. Метка служит для выделения команд, к которым предусмотрено неоднократное обращение в программе. Команда записывается в виде мнемонического обозначения машинной операции. Операнды могут быть записаны в двоичной (например, b’1011’), десятичной (например, d’15’), восьмеричной (например, o’32’) или шестнадцатеричной (например, h’3A’) форме. Комментарий служит для записи пояснений по ходу программы и ассемблером не обрабатывается. Каждый процессор имеет уникальный язык ассемблера, отражающий особенности его архитектуры.
Существуют команды, которые не включаются в выходной код непосредственно, а используются для управления ассемблером, параметрами ввода-вывода и распределения данных. Такие команды называют директивами.
Файлы, содержащие программу на языке ассемблера, обычно имеют расширения .asm. По файлу с ассемблерной программой генерируется объектный файл с расширением .o. Если программа состоит из нескольких файлов, то требуется распределить содержимое этих файлов по ячейкам памяти программ. Такую задачу решают программы-компоновщики, генерирующие из объектных файлов файл с расширением .hex, который может быть загружен в микроконтроллер.
3.7. Система команд
Микроконтроллер PIC16F873A имеет 35 RISC команд. Каждая команда состоит из 14 бит и включает код операции (OPCODE), определяющий тип команды, и один или несколько операндов и бит указания адресата результата. По структуре команды разделены на байт ориентированные, бит ориентированные, команды управления и операций с константами. Байт ориентированные команды оперируют с переменными, длиной в один байт и включают в себя три поля:
–код операции (биты 8-13);
–указатель адреса сохранения результата (бит 7);
–адрес регистра одного из операндов (биты 0-6).
Бит ориентированные команды позволяют обращаться к отдельным битам и содержат следующие поля:
–код операции (биты 10-13);
–номер бита в регистре (биты 7-9);
54
– адрес регистра (биты 0-6).
Команды управления и операций с константами содержат два поля: код операции и поле константы. Для команд операций с константами код операции размещен в 8-13 битах, а в 0-7 битах содержится 8-разрядная константа. Код операции команд управления занимает 11-13 бита, а остальные биты содержат 11 разрядов адреса памяти программ.
По выполняемым функциям все команды можно разделить на следующие группы:
–пересылки данных;
–арифметических операций;
–логических операций;
–передачи управления;
–прочие.
3.8. Команды пересылки данных
Команды пересылки данных используются наиболее часто. В системе команд PIC16F873A имеются три команды пересылки, которые используются либо для копирования данных между регистрами ОЗУ и рабочим регистром, либо для загрузки константы в рабочий регистр. Команда SWAP тоже копирует содержимое регистра ОЗУ в рабочий регистр, но меняет старший и младший полубайты местами.
MOVLW k (Move Literal to WREG) – заносит 8-битную константу k в рабочий регистр W. Адресатом в этой команде всегда является рабочий регистр. Например, для загрузки в рабочий регистр десятичного числа 65, используется команда:
movlw d’65’
MOVWF f (Move WREG to File) – копирует содержимое рабочего регистра W в регистр f. После выполнения этой команды рабочий регистр W и регистр f имеют одинаковое содержимое. Запись содержимого рабочего регистра в регистр ОЗУ, размещенный по адресу h’20’ в памяти данных, выполняется командой:
movwf h’20’
MOVF f, d (Move File) – копирует содержимое регистра f в рабочий регистр W. Операнд d указывает, куда следует переместить содержимое регистра f. Если d = 0, то содержимое f будет сохра-
55
нено в рабочий регистр W. Если d = 1, содержимое сохранится в регистр f, что применяется для проверки этого регистра на нулевое значение, так как команда изменяет состояние флага Z. Для записи содержимого регистра h’20’ в рабочий регистр следует выполнить команду:
movf h’20’, 0
SWAP f, d – переставляет местами старший и младший полубайты содержимого регистра f и помещает результат либо в тот же регистр f, либо в рабочий регистр W. Куда именно будет сохранен результат перестановки, определяется операндом d. Например число h’AB’, записанное в регистре памяти данных по адресу h’20’, будет сохранено как h’BA’ в рабочем регистре W, в результате выполнения команды:
swap h’20’, 0
3.9. Команды арифметических операций
Результат выполнения арифметических команд может требовать для своего размещения более 8 бит, в этом случае будет установлен флаг переполнения C. При выполнении вычитания состояние флага C равно дополнению к биту переноса, т. е. если уменьшаемое больше вычитаемого, флаг C устанавливается в 1, в противном случае – в 0.
Кроме операций сложения и вычитания микроконтроллер выполняет другие арифметические операции, такие, как инкремент, декремент и очистка регистров.
ADDLW k (Add Literal and WREG) – складывает содержимое W
с константой k, результат помещается в рабочий регистр. Представленная последовательность команд сложит числа d’26’ и d’58’:
movlw d’26’ addlw d’58’
ADDWF f, d (Add WREG and File) – прибавляет переменную из регистра памяти данных f к содержимому рабочего регистра W. Результат сложения сохраняется либо в тот же регистр f (при d = 1), либо в рабочий регистр W (при d = 0), в зависимости от значения d. Для сложения двух чисел, первое из которых размещается в W, второе в регистре по адресу h’20’, следует использовать команду:
addwf h’20’, 0
56
SUBLW k (Substract WREG from Literal) – вычитает содержимое
W из константы k, результат сохраняется в W. Для вычитания числа d’37’ из числа d’89’ требуется выполнить команды:
movlw d’37’ sublw d’89’
Команду вычитания из константы можно заменить командой сложения с отрицательным числом. Ассемблер преобразует отрицательное число в его эквивалент в дополнительном коде. Например, вычитание d’37’ из d’89’ реализуется следующим образом:
movlw d’89’ addlw d’-37’
SUBWF f, d (Substract WREG from File) – вычитает содержимое
W из переменной, хранящейся в регистре f. Результат сохраняется либо в f (при d = 1), либо в W (при d = 0). Для вычитания содержимого W из содержимого регистра, находящегося по адресу h’20’, используется команда:
subwf h’20’, 0
CLRF f (Clear File) – очищает содержимое (заполняет нулями) регистра f. Например, для очистки регистра по адресу h’20’:
clrf h’20’
CLRW (Clear WREG) – очищает содержимое рабочего регистра. Команда не имеет операндов.
INCF f, d (Increment File) – увеличение содержимого регистра f на единицу, или операция инкремента. Если d = 1, то результат сохраняется в регистре f. При d = 0 результат сохраняется в рабочий регистр W. Увеличить содержимое регистра по адресу h’20’ и поместить результат в W можно командой:
incf h’20’, 0
DECF f, d (Decrement File) – уменьшение содержимого регистра f на единицу, или операция декремента. Если d = 1, то результат сохраняется в регистре f. При d = 0 результат сохраняется в рабочий регистр W. Уменьшить содержимое регистра по адресу h’20’ и поместить результат в W можно командой:
decf h’20’, 0
57
3.10. Команды логических операций
Микроконтроллер выполняет побитные логические операции И, ИЛИ, НЕ, Исключающее ИЛИ, сдвиг вправо и сдвиг влево.
ANDLW k (AND Literal and WREG) – операция побитное И над константой k и содержимым рабочего регистра. Побитное И над рабочим регистром и числом h’0F’ реализуется командой:
andlw h’0F’
Следует обратить внимание, что при выполнении И с числом h’0F’ старший полубайт результата будет всегда содержать нули. Это можно использовать для обнуления групп битов переменной.
ANDWF f, d (AND WREG and File) – побитное И между содержимым рабочего регистра и регистра f. Результат сохраняется либо в f (при d = 1), либо в W (при d = 0). Для выполнения побитного И между содержимым W и содержимого регистра, находящегося по адресу h’20’, используется команда:
andwf h’20’, 0
IORLW k (Inclusive OR Literal with WREG) – побитное ИЛИ между содержимым рабочего регистра и константой k. Побитное ИЛИ над рабочим регистром и числом h’0F’ реализуется командой:
iorlw h’0F’
IORWF f, d (Inclusive OR WREG with File) – побитное ИЛИ между рабочим регистром и регистром f. Результат сохраняется либо в f (при d = 1), либо в W (при d = 0). Для выполнения побитного ИЛИ между содержимым W и содержимого регистра, находящегося по адресу h’20’, используется команда:
iorwf h’20’, 0
XORLW k (Exclusive OR Literal With File) – побитное Исключающее ИЛИ между рабочим регистром и константой k. Побитное Исключающее ИЛИ над рабочим регистром и числом h’0F’ реализуется командой:
xorlw h’0F’
XORWF f, d (Exclusive OR WREG With File) – побитное Исключающее ИЛИ между рабочим регистром и регистром f. Результат
58
сохраняется либо в f (при d = 1), либо в W (при d = 0). Для выполнения побитного Исключающего ИЛИ между содержимым W и содержимого регистра, находящегося по адресу h’20’, используется команда:
xorwf h’20’, 0
COMF f, d (Complement File) – побитная инверсия содержимого регистра f. Результат сохраняется либо в f (при d = 1), либо в W (при d = 0). Побитная инверсия регистра по адресу h’20’ выполняется командой:
comf h’20’, 0
Команда для инверсии рабочего регистра у микроконтроллера PIC16F873A отсутствует, однако эту операцию можно выполнить за один машинный цикл, вычитая WREG из константы b’11111111’, что дает в результате обратный код числа (инверсию).
RRF f, d (Rotate Right File through carry) – сдвиг содержимого регистра f вправо на один разряд, при этом выдвигаемый бит считывается из флага C, значение которого затем устанавливается в соответствии с выдвинутым битом (сдвиг через признак переноса). Результат сохраняется либо в f (при d = 1), либо в W (при d = 0). Сдвиг регистра h’20’ вправо на один разряд:
rrf h’20’, 0
RLF f, d (Rotate Left File through carry) – сдвиг содержимого регистра f влево на один разряд, при этом выдвигаемый бит считывается из флага C, значение которого затем устанавливается в соответствии с выдвинутым битом (сдвиг через признак переноса). Результат сохраняется либо в f (при d = 1), либо в W (при d = 0). Сдвиг регистра h’20’ влево на один разряд:
rlf h’20’, 0
BSF f, b (Bit Set File) – установить в 1 бит b в регистре f. Например, для установки в 1 бита 5 в регистре по адресу h’20’ выполняется команда:
bsf h’20’, 5
BCF f, b (Bit Clear File) – сбросить бит b в регистре f. Для сброса бита 5 в регистре h’20’ выполняется команда:
bcf h’20’, 5
59
3.11. Команды передачи управления
Все команды передачи управления тем или иным способом изменяют состояние счетчика команд PC.
GOTO k – переход к адресу k памяти программ, текущий адрес при этом теряется. Команда выполняется за два машинных цикла, так как после ее выполнения требуется сбросить конвейер и загрузить туда команду, расположенную по адресу перехода. Вместо k обычно указывается метка требуемого перехода. Например:
goto mtk
CALL k – вызов подпрограммы, переход к адресу k памяти программ, текущий адрес, в отличии от предыдущей команды, сохраняется в стеке. Команда также выполняется за два машинных цикла. Вместо k обычно указывается метка требуемого перехода. Например:
call mtk
Разница между командами GOTO и CALL заключается в том, что команда CALL перед переходом сохраняет значение счетчика команд в специальной области памяти – стеке.
RETURN – возврат из подпрограммы. При выполнении команды адрес из вершины стека переписывается в счетчик команд PC. Команда выполняется за два машинных цикла. Команда не имеет операндов.
RETFIE (Return From Interrupt) – возврат из прерывания. Команда переписывает вершину стека в счетчик команд PC и, в отличие от предыдущей команды, устанавливает в 1 флаг глобального разрешения прерываний. Команда не имеет операндов и выполняется, как и все команды перехода, за два машинных цикла.
RETLW k (Return with Literal in WREG) – возврат из подпрограммы с загрузкой константы k в рабочий регистр. Команда не имеет операндов и выполняется, как и все команды перехода, за два машинных цикла.
BTFSS f, b (Bit Test File, Skip if Set) – пропустить следующую команду, если бит b в регистре f равен 1. Команда выполняется за один машинный цикл, когда следующая строка не пропуска-
60