Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

umm_7154

.pdf
Скачиваний:
22
Добавлен:
18.03.2016
Размер:
2.85 Mб
Скачать

переносе из младшего полубайта в старший. Флаг нуля (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. Например число hAB’, записанное в регистре памяти данных по адресу h’20’, будет сохранено как hBA’ в рабочем регистре 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]