Вы находитесь на странице: 1из 45

Министерство образования и науки Российской Федерации

Сибирский государственный аэрокосмический университет


имени академика М. Ф. Решетнева

ОСНОВЫ МИКРОПРОЦЕССОРНОЙ ТЕХНИКИ:  
ПРОГРАММИРОВАНИЕ МИКРОКОНТРОЛЛЕРА 
PIC16F628A 
 
Методические указания к выполнению лабораторных работ 
для студентов, обучающихся по направлениям подготовки,  
связанным с микропроцессорной техникой 

Красноярск 2015

1
УДК 004.382.7:004.4'424(072)

Рецензент
кандидат технических наук, доцент А. Т. ЛЕЛЕКОВ
(Сибирский государственный аэрокосмический университет
имени академика М. Ф. Решетнева)

Печатается по решению методической комиссии ИИТК

 
 
 
 

Основы микропроцессорной техники: программирование


микроконтроллера PIC16F628A : метод. указания к выполнению
лаб. работ для студентов, обучающихся по направлениям подготовки,
связанным с микропроцессорной техникой / сост. Е. Н. Сухарев ; Сиб.
гос. аэрокосмич. ун-т. – Красноярск, 2015. – 44 с.
 
 
 

© Сибирский государственный аэрокосмический


университет имени академика М. Ф. Решетнева, 2015

2
ОГЛАВЛЕНИЕ

Общие положения ................................................................................... 4

ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
1. Описание учебного лабораторного стенда...................................... 5
2. Среда разработки MPLAB ................................................................. 6
2.1. Общее описание .......................................................................... 6
2.2. Подготовка к работе ................................................................... 6
2.3. Редактирование программы ....................................................... 8
2.4. Компиляция ............................................................................... 10
2.5. Запуск и отладка проекта ......................................................... 11
3. Программатор IC-PROG.................................................................. 12
3.1. Общее описание ........................................................................ 12
3.2. Подготовка к работе ................................................................. 12
4. Микроконтроллер PIC16F628A ...................................................... 15
4.1. Общее описание и характеристики ......................................... 15
4.2. Арифметико-логическое устройство....................................... 18
4.3. Память данных .......................................................................... 18
4.4. Энергонезависимая память данных......................................... 20
4.5. Память программ ...................................................................... 20
4.6. Регистры специального назначения ........................................ 21
4.7. Таймеры ..................................................................................... 25
4.8. Модуль компараторов .............................................................. 27
4.9. Универсальный синхронно-асинхронный
приёмо-передатчик (usart) ....................................................... 27
4.10. Обработка прерываний........................................................... 28
4.11. Система команд....................................................................... 28

ЛАБОРАТОРНЫЕ РАБОТЫ
Лабораторная работа 1. Работа с портами ввода-ввывода................... 31
Лабораторная работа 2. Сложение и вычитание................................... 32
Лабораторная работа 3. Умножение и деление .................................... 34
Лабораторная работа 4. Использование подпрограмм......................... 37
Лабораторная работа 5. Опрос клавиатуры .......................................... 38
Библиографический список ................................................................ 41
Приложение. Технические характеристики PIC16F628A .................. 42

3
ОБЩИЕ ПОЛОЖЕНИЯ

Методические указания к выполнению лабораторных работ по


программированию микроконтроллера PIC16F628A состоят из теоре-
тических сведений, описания лабораторных работ, рекомендательно-
го библиографического списка и приложения.
Теоретические сведения включают в себя информацию о про-
граммных и аппаратных средствах, используемых в лабораторных ра-
ботах.
Даны подробные инструкции по использованию интегрирован-
ной среды разработки программ для микронтроллеров MPLAB IDE
5.40.00, программатора IC-Prog, представлены минимально необхо-
димые сведения о микроконтроллере PIC16F628A, используемом
в стенде.
Описание каждой лабораторной работы содержит:
– формулировку цели;
– рабочее задание;
– примерную программу для микроконтроллера на ассемблере;
– требования к содержанию отчета студента;
– контрольные вопросы и задания.
Рекомендательный библиографический список включает в себя
источники для теоретической подготовки студента по вопросам функ-
ционирования микроконтроллеров и подробные описания архитекту-
ры микропроцессоров PIC, системы команд и пр.

4
ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

1. ОПИСАНИЕ УЧЕБНОГО ЛАБОРАТОРНОГО СТЕНДА

Для выполнения лабораторных работ понадобится лаборатор-


ный стенд и компьютер с установленными на нём программами
MPLAB и IC-Prog.
Лабораторный стенд (рис. 1) представляет собой плату, вклю-
чающую в себя микроконтроллер PIC16F628А, аппаратный програм-
матор, 5 кнопок для подачи напряжений на входные порты микрокон-
троллера и 8 светодиодов, отображающих состояние выходных пор-
тов. На плате установлен разъём для подключения программатора
к COM-порту компьютера посредством нуль-модемного кабеля
и клеммы для подключения источника питания с напряжением 12 В.

Рис. 1. Лабораторный стенд

Ещё два светодиода являются индикаторами подачи питания


и запуска записи программы в память микроконтроллера («прошивки»).
Подключите нуль-модемный кабель к COM-порту компьютера,
на котором установлены среда разработки программ MPLAB и про-

5
грамматор IC-Prog. Другой разъём кабеля подключите к плате лабо-
раторного стенда.
К клеммам стенда подключите провода блока питания, соблю-
дая полярность. Для того чтобы электрический контакт получился на-
дёжным, затяните винты клемм отвёрткой. Включите блок питания в
сеть с напряжением 220 В. На плате стенда должен загореться свето-
диод – индикатор подачи питания. Стенд готов к работе.
Писать и отлаживать программы на ассемблере можно и без
стенда, используя программную симуляцию микроконтроллеров
в MPLAB.

2. СРЕДА РАЗРАБОТКИ MPLAB

2.1. Общее описание


MPLAB – это интегрированная среда разработки (англ.
Integrated Development Environment, IDE) программ для микрокон-
троллеров семейства PIC, производимых компанией Microchip
Technology.
Среда разработки включает в себя компилятор с языка ассемб-
лер, текстовый редактор, программный симулятор микроконтролле-
ров и средства работы над проектами. Среда позволяет также исполь-
зовать компилятор с языка C.
MPLAB работает под управлением операционных систем семей-
ства Windows.
Далее речь пойдёт о версии MPLAB IDE 5.40.00.
Рассмотрим создание простого проекта, исходными файлами
которого будут один или несколько файлов на ассемблере.

2.2. Подготовка к работе


Выбор папки проекта. Создайте на диске папку для вашего
проекта. Имя папки должно состоять из латинских букв и не должно
превышать 8 символов. То же самое относится и к названию проекта,
и к именам файлов с кодом. В противном случае MPLAB откажется
редактировать файлы и будет выдавать сообщение, что не может их
открыть при ассемблировании.
Создайте в папке проекта пустой текстовый файл с расширени-
ем *.asm (например, prog.asm).
Запустите MPLAB (файл MPLAB.exe).

6
Выбор языка программирования. Выберите в основном меню
Project / Install Language Tool. Выберите Language Suite: Microchip
и Tool Name: MPASM. Если не указан путь к файлу ассемблера
mpasmwin.exe, укажите его. Затем включите опцию Windowed и на-
жмите OK.
Создание файла проекта *.pjt. В MPLAB выберите Project /
New Project, укажите путь к папке проекта и введите имя файла про-
екта, желательно такое же, как и имя файла будущей программы
*.asm. Нажмите OK.
Затем в диалоге Edit Project нажмите Add Node и выберите ранее
созданный файл *.asm.
Установка конфигурации. После перечисленных действий от-
кроется окно редактирования проекта Edit project. Для простоты
не будем добавлять дополнительные файлы, файлы библиотек и ком-
поновки.
В пункте Development Mode нажмите кнопку Change. Откроется
окно с вкладками для установки. В дальнейшем его можно будет вы-
звать, выбрав Options / Development Mode. Рассмотрим это окно под-
робнее.
Tools. Выберите симулятор MPLAB-SIM Simulator и в выпа-
дающем меню выберите тип микроконтроллера PIC16F628.
Clock. Выберите тип генератора тактовых импульсов и его час-
тоту.
В лабораторном стенде установлен кварцевый резонатор с час-
тотой 3,6864 МГц, поэтому установите Oscillator type: XT, Desired
Frequency: 3,6864 MHz.
Configuration (конфигурация сторожевого таймера и памяти
программ). Если вы разрешаете использование сторожевого таймера,
то задайте и коэффициент деления предделителя.
Для микроконтроллеров 17-й серии необходимо указать, какая
память программ будет использоваться: внутренняя (microcontroller),
внешняя (microprocessor) или обе (extended microcontroller).
Pins. Разрешите или запретите использование вывода внешнего
сброса (MCLR).
Break option (конфигурация прерываний и стека при отладке).
Пока оставьте по умолчанию.
Нажмите OK.
Конфигурация выходного файла. Щелкните левой кнопкой
мыши, наведя на файл *.hex в списке Project Files. При этом станет

7
активна кнопка Node Properties, вызывающая настройки проекта. Эти
настройки можно оставить по умолчанию.
Добавление исходного файла. Чтобы добавить в проект свой
исходный файл на ассемблере, который находится в папке проекта,
нажмите кнопку Add Node. В открывшемся окне выберите свой файл
и нажмите OK. После этого нажмите OK в окне Edit Project.
В проекте может быть несколько исходных файлов на ассембле-
ре, но указывать необходимо при редактировании проекта один. Ос-
тальные включаются в основной исходный файл директивой ассемб-
лера include.
Открытие исходного файла. Теперь в основном меню выбери-
те File / Open и откройте файл *.asm для редактирования.

2.3. Редактирование программы


Программы пишутся на языке ассемблер MPASM. MPASM –
универсальный компилятор исходной программы на ассемблере для
микроконтроллеров PIC1.
Набор и редактирование программ мало чем отличаются от ра-
боты в обычном текстовом редакторе. Для примера наберите про-
грамму, помещающую двоичное число 10101010 в выходной порт
PORTB (листинг 1).
Писать команды принято в три колонки. Первая колонка ис-
пользуется для меток, потом пишут команду, а затем операнды. Ко-
лонки отделяют друг от друга табуляцией.
Точка с запятой используется для комментариев, набирать ко-
торые необязательно.
Листинг 1. Пример программы для PIC16F628 на ассемблере
1 LIST p=PIC16F628
2 _CONFIG 03F38H
3 #include <p16f628.inc>
4
5 BCF STATUS,RP0 ; выбираем банк 0
6 CLRF PORTB ; очищаем PORTB
7 BSF STATUS,RP0 ; выбираем банк 1

1
MPASM. Руководство пользователя. URL: http://www.microchip.ru/files/d-
sheets-rus/mpasm.pdf.

8
8 MOVLW B'00000000'; помещаем в аккумулятор число
00000000
9 MOVWF TRISB ; помещаем содержимое аккумуля-
тора в TRISB
10 BCF STATUS,RP0 ; выбираем банк 0
11
12 start MOVLW B'00111010' ; помещаем число 00111010 в
аккумулятор W
13 MOVWF PORTB ; помещаем содержимое аккумулятора в
PORTB
14 GOTO start ; зацикливаем программу
15 END

Программа на ассемблере кроме команд микропроцессора мо-


жет содержать команды компилятору.
В строке 1 указывается тип микроконтроллера, для которого на-
писана данная программа.
В строке 2 определена конфигурация микроконтроллера1 (шест-
надцатеричный код конфигурации задаёт основные параметры мик-
роконтроллера: какой будет использоваться генератор, будет ли уста-
новлена защита памяти программ и т. д.)
В строке 3 директивой #include в программу загружается го-
товый файл, находящийся в папке с MPLAB. Этот файл содержит ко-
манды присвоения регистрам символьных имён. Например, регистру
по адресу 03h командой EQU присваивается имя STATUS:
STATUS EQU H'0003'
Это сделано для удобства, чтобы каждый раз при обращении
к этому регистру можно было указывать его смысловое имя,
а не адрес.
В строках 5–10 очищается PORTB и все его биты настраиваются
как выходные. Для этого в регистре настроек порта TRISB, находя-
щемуся по адресу 86h, нужно записать нули. Если в каком-либо бите
TRISB будет записана 1, то соответствующий вывод PORTB будет
использоваться как входной.
Так как регистр TRISB находится в банке памяти 1, то для об-
ращения к нему нужно выбрать банк 1. Это выполняется записью

1
PIC16F62X. Однокристальные 8-разрядные FLASH CMOS микроконтрол-
леры. URL: http://www.microchip.ru/files/d-sheets-rus/pic16f62x.pdf.

9
единицы в 5-й бит регистра STATUS с помощью команды BSF (Bit Set
File). Числу 5 присвоена метка RP0, поэтому команда выглядит так:
BSF STATUS,RP0

Можно было бы записать эту команду, используя адрес регистра


STATUS и номер изменяемого бита:

BSF 03h,05h

Результат выполнения этой команды такой же, но запись выгля-


дит малопонятной.
В строках 12–14 в цикле загружается число 10101010 в PORTB
через рабочий регистр W (Work), так называемый аккумулятор. Обра-
тите внимание, что обращение к этому регистру встроено в систему
команд. Микропроцессор PIC16А628 имеет RISC-архитектуру, по-
этому у него нет команды загрузки слова в произвольный регистр
(она потребовала бы два «длинных» операнда вместо одного: слово и
адрес регистра), но есть команды загрузки слова в аккумулятор
(MOVLW) и загрузки содержимого аккумулятора в произвольный ре-
гистр (MOVWF).
Таким образом, для помещения слова в произвольный регистр
приходится использовать две команды:

MOVLW B'10101010'
MOVWF PORTB

Цикл реализован с помощью метки start и команды GOTO. При


компиляции вместо метки подставляется конкретный адрес в памяти
программ.
Директивой компилятора END заканчивается любая программа.

2.4. Компиляция
Для компиляции отредактированных файлов выберите Project /
Make Project или нажмите F10 на клавиатуре. Для компиляции всех
файлов проекта выберите Project / Build All.
После завершения процесса появится окно Build Results, содер-
жащее результат компиляции: были ли ошибки (build failed) или нет

10
(build successful). При наличии ошибок в окне появляется их список
с указанием номеров ошибочных строк.
При отсутствии ошибок в результате компиляции в папке про-
екта появится файл *.hex с машинным кодом вашей программы для
записи в ППЗУ («прошивки») микроконтроллера.

2.5. Запуск и отладка проекта


После компиляции программы можно приступить к её запуску.
После каждой компиляции происходит сброс симулятора мик-
роконтроллера. При этом программный счетчик (PC) будет указывать
на нулевой адрес 0x00. В редакторе кода указатель выделит первую
команду, находящуюся в нулевой ячейке памяти.
Для принудительного сброса выберите Debug / Run / Reset или
нажмите F6 на клавиатуре.
Для запуска программы в пошаговом режиме нажимайте клави-
шу F7 на клавиатуре или кнопку на панели инструментов, либо
выберите Debug / Run / Step. При каждом нажатии будет выполнена
одна команда и осуществлён переход к следующей.
Кнопка тоже выполняет программу в пошаговом режиме,
однако все подпрограммы будут выполняться за одно нажатие (в не-
прерывном режиме).
Для запуска программы в непрерывном режиме нажмите F9 на
клавиатуре или кнопку на панели инструментов, либо выберите
Debug / Run / Run.
Программа будет выполняться до тех пор, пока вы не прервете
работу (выбрав в меню Debug / Run / Halt, либо нажав F5 на клавиату-
ре или кнопку ), либо до указанной в редакторе точке остановки
(breakpoint).
В ходе отладки программы полезно отслеживать состояние яче-
ек памяти. Для этого в меню MPLAB выберите Windows / Program
Memory, Windows / File Registers, Windows / Special Function Registers
или нажмите кнопки с надписями ROM, RAM и SFR. Появятся окна,
отражающие содержимое памяти программ (ПЗУ, ROM), регистрово-
го файла (ОЗУ, RAM) и регистров специального назначения (SFR) со-
ответственно. Если при выполнении очередной команды изменилось
состояние какого-либо регистра, то название этого регистра и его со-
держимое помечается красным цветом.

11
3. ПРОГРАММАТОР IC-PROG

3.1. Общее описание


IC-Prog – программа, предназначенная для загрузки исполняе-
мого кода в ППЗУ (программирования, «прошивки») большинства
известных микроконтроллеров и микросхем памяти, в том числе мик-
роконтроллеров PIC.
Основные отличия IC-Prog от подобных программ – раздельные
окна буферов памяти данных микроконтроллера и программной па-
мяти. У буфера памяти программ есть собственный дизассемблер, по-
зволяющий представлять загруженный машинный код в форму про-
граммы на ассемблере. Буфер памяти данных у IC-Prog байтовый.
Адреса буферных ячеек совпадают с настоящими адресами ячеек
EEPROM микросхем.
Также в программном пакете существует возможность опреде-
лить тип резонатора, включить защиту кода и установить значения
любого разряда бита конфигурации.
Настройка на адаптер происходит указанием порта, к которому
он подключен (СОМ или LPT) и способа обмена данными (с помо-
щью драйверов операционной системы или напрямую).
На мощных компьютерах для исключения сбоев при програм-
мировании микросхем рекомендуется увеличить время задержки, не-
обходимое для формирования импульсов. Если же компьютер слиш-
ком медленный, то время задержки лучше уменьшить, чтобы ско-
рость программирования возросла.
В программе существуют настройки, позволяющие вручную ме-
нять величины напряжения на разъёмах порта, к которому подсоеди-
нен аппаратный программатор. Это дает возможность с помощью
обычного вольтметра или осциллографа проследить сигналы на пути
от выводов порта до микросхемы.

3.2. Подготовка к работе


Запустите IC-Prog.
Включите русский язык интерфейса. Для этого в общем меню
войдите в Settings / Options и в появившемся диалоге настроек нажми-
те на вкладку Language и в выпадающем меню выберите Russian.
После этого IC-Prog перезапустится, и весь интерфейс будет на рус-
ском языке.

12
В правом верхнем углу в выпадающем меню выберите тип мик-
роконтроллера PIC16F628 (рис. 2).

Рис. 2. Главное окно программатора IC-Prog

Конфигурация микроконтроллера может быть задана в про-


грамме директивой __CONFIG. Однако её можно изменить в IC-Prog,
включая и выключая опции в разделе Конфигурация. Обратите вни-
мание, что внизу этого раздела программа указывает шестнадцате-
ричный код задаваемой конфигурации.
OSC – конфигурация источника тактирования. Может прини-
мать 8 различных значений, 4 из которых вам могут понадобиться:
– INTOSC_NOCLKOUT – внутренний генератор (4 МГц);
– HS – внешний высокочастотный кварц (8…20 МГц);
– XT – внешний кварц (200 кГц…4 МГц);
– LP – внешний низкочастотный кварц (до 200 кГц).

13
WDT – сторожевой таймер (англ. Watchdog Timer, WTD). Его
назначение заключается в том, чтобы перезагрузить микроконтрол-
лер, когда таймер досчитает время до некоторого предела. Чтобы пе-
резагрузки не происходило, его нужно своевременно обнулять. Таким
образом, при сбое МК счётчик таймера перестанет обнуляться, что
приведет к перезагрузке МК.
PWRT (Power Up Timer) – таймер, обеспечивающий задержку
запуска микроконтроллера при его включении. При активации таймер
будет сбрасывать микроконтроллер до тех пор, пока напряжение пи-
тания не поднимется до нормального уровня.
BROWNOUT – сброс МК при падении питания ниже нормы.
MCLR – активация возможности внешнего сброса МК. При
включении этой функции МК будет работать до тех пор, пока на вывод
MCLR будет подаваться положительное напряжение. Для сброса МК
достаточно замкнуть этот вывод на землю.
LVP (Low Voltage Programming) – активация возможности про-
граммирования при низком напряжении.
При активации один цифровой вход переключится в режим LVP
(вывод 10). Если подать 5 В на этот вывод, то МК перейдет в режим
программирования. Для нормальной работы МК требуется соединить
вывод с землёй.
Мы будем работать с программатором, использующим повы-
шенное напряжение, потому LVP активировать не требуется.
CPD (Code Protection Data) – защита памяти данных EEPROM от
считывания программатором.
CP (Code Protection) – защита памяти программ FLASH («про-
шивки») от считывания программатором.
В меню «Осциллятор» выберите XT – кварцевый резонатор.
В меню «Бит конфигурации» установите флажок на WDT, если
он используется в программе.
Установите флажок на PWRT – разрешение выдержки времени
после включения питания.
Войдите в настройки программатора Настройки / Программа-
тор, и установите параметры программатора, как показано на рис. 3.
Теперь можно приступить к «прошивке» микроконтроллера.
Для этого откройте файл *.hex с откомпилированным машинным
кодом.
Для записи программы в память микроконтроллера нажмите
кнопку или клавишу F5. На экране появится индикатор процесса

14
записи программы в память. Как только запись закончится, IC-Prog
выдаст сообщение: «Программирование завершено успешно!»

Рис. 3. Окно настроек программатора IC-Prog

Микроконтроллер сразу же, при наличии питания, начнёт вы-


полнять записанную в него программу.

4. МИКРОКОНТРОЛЛЕР PIC16F628A

4.1. Общее описание и характеристики


Микросхема PIC16F628A – это 8-pазpядный микроконтроллер
с RISC-архитектуpой, производимый фиpмой Microchip Technology.
Как и всякий микроконтроллер, он содержит на кристалле мик-
ропроцессор, устройства памяти и периферические устройства ввода-
вывода.
Микропроцессор. Все микроконтроллеры PIC построены на ос-
нове архитектуры RISC (англ. Reduced Instruction Set Computer – про-
цессор с сокращённым набором команд). Микроконтроллер управля-
ется всего 35 командами, которые дополняются большим набором ре-
гистров.
Двухуровневый конвейер команд позволяет выполнить любую
команду за один машинный цикл, кроме команд ветвления, которые
выполняются за два цикла.
15
Память. Микроконтроллеры имеют так называемые гарвард-
скую архитектуру, т. е. память программ и память данных разделены.
PIC16F628A включает три типа памяти:
– перезаписываемое ПЗУ FLASH-память для хранения про-
грамм (память программ) с 2048 ячейками размером 14 бит каждая;
– ОЗУ (регистры) для временного хранения оперативных дан-
ных с 224 ячейками размером 8 бит каждая;
– ППЗУ (EEPROM) для хранения данных, которые нужно со-
хранить на длительный срок и которые не будут утеряны при выклю-
чении питания (настройки, калибровочные таблицы и т. п.) – 128 яче-
ек по 8 бит.
Периферические устройства. Микроконтроллер содержит
внутренний тактовый генератор на 4 МГц, также можно подключить
внешний кварцевый резонатор с рабочей частотой до 20 МГц.
Микроконтроллер оснащён двумя 8-разрядными портами вво-
да-вывода, двумя аналоговыми компараторами, тремя таймерами, а
также модулями CCP и USART.
Модуль CCP (Capture/Compare/PWM) предназначен для измере-
ния и формирования импульсных сигналов (PWM – англ. pulse-width
modulation, широтно-импульсная модуляция).
Модуль USART (англ. Universal Synchronous / Asynchronous
Receiver-Transmitter – универсальный синхронный/асинхронный
приёмопередатчик) – модуль, предназначенный для организации свя-
зи с другими цифровыми устройствами. Преобразует передаваемые
данные в последовательный вид так, чтобы было возможно передать
их по цифровой линии другому аналогичному устройству.
Микроконтроллеры выпускаются в корпусах с 18 выводами
(рис. 4).

Рис. 4. Назначение выводов микроконтроллера PIC16F628A

16
Из 18 выводов VDD – питание, VSS – земля, а остальные 16 выво-
дов (RA0…RA7, RB0…RB7) могут быть использованы либо как пор-
ты ввода-вывода, либо для определённого периферийного модуля
(табл. 1).

Таблица 1
Назначение выводов микроконтроллера PIC16F628A

Наименование
Назначение вывода
вывода
RA0 / AN0 Разряд #0 PORTA / аналоговый вход #0
RA1 / AN1 Разряд #1 PORTA / аналоговый вход #1
RA2 / AN2 / VREF Разряд #2 PORTA / аналоговый вход #1 / Аналого-
вый вход верхнего опорного напряжения для ком-
паратора
RA3 / AN3 / CMP1 Разряд #3 PORTA / аналоговый вход #3 / выход
компаратора 1
RA4 / T0CKI / CMP2 Разряд #4 PORTA / вход внешнего тактового сигна-
ла для таймера TMR0 / выход компаратора 2
RA5 / MCLR / VPP Разряд #5 PORTA / Вход сброса микроконтроллера
(активный низкий логический уровень) / вход на-
пряжения программирования микроконтроллера
RA6 / OSC2 / CLKOUT RA6/ OSC2/ CLKOUT – Разряд #6 PORTA / выход
тактового генератора / выход тактового генератора
RA7 / OSC1 / CLKIN Разряд #7 PORTA / вход тактового генератора /
вход внешнего тактового сигнала
RB0 / INT Разряд #7 PORTA / вход тактового генератора /
вход внешнего тактового сигнала
RB1 / RX / DT Разряд #1 PORTB / вывод приемника асинхронного
режима USART / сигнал данных USART в синхрон-
ном режиме
RB2 / TX / CK Разряд #2 PORTB / выход передатчика USART в
асинхронном режиме / тактовый сигнал USART в
синхронном режиме
RB3 / CCP1 Разряд #3 PORTB / вывод захвата / сравне-
ние/ШИМ модуля CPP1
RB4 / PGM Разряд #4 PORTB / вход программирования в ре-
жиме LVP (Low Voltage Programming – программи-
рование при низкоуровневом напряжении)
RB5 Разряд #5 PORTB
RB6 / T1OSO / T1CKI / Разряд #6 PORTB / выход генератора TMR1 / вход
PGC внешнего тактового сигнала для TMR1 / тактовый
вход в режиме программирования
RB7 / T1OSI / PGD Разряд #7 PORTB / вход генератора TMR1 / ввод
данных в режиме программирования

17
Например, при подключении внешнего кварцевого резонатора
к выводам 15 и 16 (OSC1 и OSC2), уже не получится их использовать
для обмена данными как выводы порта RA6 и RA7.
Далее рассмотрим наиболее важные части микроконтроллера
подробнее.
4.2. Арифметико-логическое устройство
Микропроцессор PIC16F628A содержит 8-битное арифметико-
логическое устройство (АЛУ) и рабочий регистр (working register, W),
часто называемый аккумулятором. Аккумулятор – это 8-битный ре-
гистр, используемый для хранения операндов и результатов операций,
выполняемых АЛУ. Аккумулятор не имеет собственного адреса.
АЛУ выполняет арифметические и логические операции между
данными в аккумуляторе и любом произвольном регистре. АЛУ спо-
собен совершать операции сложения, вычитания, сдвига, логические
операции над 8-битными величинами.
Обычно арифметические операции совершаются над двумя опе-
рандами. В таких командах один операнд содержится в аккумуляторе,
а другой – либо в каком-либо произвольном регистре, либо указыва-
ется непосредственно в команде как константа. Если операция требу-
ет лишь одного операнда, то он содержится либо в аккумуляторе, ли-
бо в каком-либо регистре, либо в самой команде.
В зависимости от выполняемой команды АЛУ может изменять
флаг переноса C, флаг десятичного переноса DC и флаг нуля Z реги-
стра состояний STATUS (см. п. 4.6.2).
4.3. Память данных
Память данных микроконтроллера PIC16F628А разбита на че-
тыре банка по 128 байт, содержащих ячейки, называемые регистрами
общего и специального назначения.
Регистры общего назначения (РОН) представляют собой ячейки
статического ОЗУ и имеются в каждом банке. Как следует из назва-
ния этих регистров, их можно использовать для хранения какой-либо
рабочей информации (символов, переменных, счётчиков и т. п.) в хо-
де выполнения программ. Адреса ячеек РОН в каждом банке приве-
дены в табл. 2.
Адреса F0h…FFh, 170h…17Fh и 1F0h…1FFh используются как
ОЗУ общего назначения с отображением на регистры 70h…7Fh.
Например, для обращения к регистру, находящемуся по адресу
B9, необходимо сначала выбрать банк, в котором он находится – банк 1.
Сделать это можно, записав соответствующие значения в биты RP1и
RP0 регистра STATUS.

18
Таблица 2
Банки памяти ОЗУ
Адреса регистров общего на-
Номер банка RP1 RP0
значения
Банк 0 0 0 20 … 7Fh
Банк 1 0 1 A0 … FFh
Банк 2 1 0 120 … 14Fh, 170 …17Fh
Банк 3 1 1 1F0 … 1FFh

Полная карта памяти PIC16F628A представлена на рис. 5.

Рис. 5. Карта памяти данных микроконтроллера PIC16F628A


(* – не физический регистр; закрашенные участки памяти данных
не реализованы, значение при чтение 00h)

19
Регистры специального назначения (РСН) занимают первые
32 ячейки каждого банка. Назначение всех специальных регистров
можно узнать в документации к микроконтроллеру1.

4.4. Энергонезависимая память данных


Энергонезависимая память данных предназначена для хранения
данных, которые необходимо сохранить, чтобы воспользоваться ими
при следующем включении микроконтроллера (настройки, калибро-
вочные таблицы и т. д.). PIC16F628A имеет 128 байт энергонезависи-
мой памяти данных (адреса 00…7Fh).
Эта память реализована в виде EEPROM-ячеек, к которым мож-
но обращаться во время работы микроконтроллера. EEPROM не ото-
бражается в адресном пространстве регистрового файла, вместо этого
она косвенно адресуется через регистры специального назначения:
EECON1, EECON2 (не являются физическими регистрами), EEDATA
и EEADR.
Регистры EECON1 и EECON2 отображают конфигурацию (со-
стояние) энергонезависимой памяти. EEDATA содержит 8-битные
данные для чтения или записи, EEADR содержит адрес, по которому
произойдёт обращение.

4.5. Память программ


Энергонезависимая память программ PIC16F628A (рис. 6) пред-
ставляет собой FLASH-память объёмом 2048 ячеек по 14 бит каждая
(2048×14) и используется для хранения исполняемых программ.
Микроконтроллеры PIC16F627A/628A/648A имеют 13-битный
счётчик команд (Program Counter, PC), способный адресовать
8192 ячеек памяти.
В PIC16F628A только первые 2048 ячеек (адреса 0000h…07FFh)
используются физически. При попытке обращения по адресу, превы-
шающему 07FFh, произойдёт пересчёт адреса на начало адресного
пространства.
При сбросе микроконтроллер начинает выполнять инструкции
с адреса 0000h, т. е. вектор сброса находится по адресу 0000h. Вектор
прерываний расположен по адресу 0004h.

1
PIC16F62X. Однокристальные 8-разрядные FLASH CMOS микроконтрол-
леры.

20
Микроконтроллеры PIC16F627A/628A/648A имеют также
8-уровневый 13-разрядный аппаратный стек. Стек не имеет отобра-
жения ни в памяти данных, ни в памяти программ, нельзя записать
или прочитать данные из стека.

Рис. 6. Карта памяти программ и стека в PIC16F628A

В ячейках стека сохраняется адрес, откуда был совершён пере-


ход при вызове подпрограммы (командой CALL) или обработки пре-
рываний. При возвращении из подпрограммы (RETURN, RETFIE,
RETLW) значение счётчика PC восстанавливается из стека.
В микроконтроллере нет никаких уведомлений о переполнении
стека. После 8 записей в стек девятая пишется поверх первой.

4.6. Регистры специального назначения


Регистры специального назначения представляют собой ячейки
статического ОЗУ и используются процессором и периферическими
устройствами для управления работой микроконтроллера. Рассмот-
рим некоторые из них.

4.6.1. Программный счётчик PCL (02h, 82h, 102h, 182h)


Пpогpаммный счётчик, или счётчик команд (PC) указывает
на адрес следующей команды в ПЗУ. PC имеет pазpядность 13 бит,
причём младшая его часть PCL (биты 7…0) хранится по адресу 02h

21
и доступна для чтения и записи. Старшие биты PCH (12…8) недос-
тупны для чтения и записи (табл. 3).

Таблица 3
Описание битов регистра STATUS
Номер
Имя Назначение Описание состояний бита
бита
Бит выбора банка памя- 1 – банк 2, 3 (100h…1FFh)
7 IRP ти, используется для 0 – банк 0, 1 (00h…FFh)
косвенной адресации
6 RP1 00 – банк 0 (00h…7Fh)
Биты выбора банка па-
01 – банк 1 (80h…FFh)
мяти, используются для
5 RP0 10 – банк 2 (100h…17Fh)
прямой адресации
11 – банк 3 (180h…1FFh)
1 – после включения, команды
CLRWDT или SLEEP
4 TO Бит окончания ожидания
0 – окончание ожидания стороже-
вого таймера
1 – после включения, команды
Бит выключения питания CLRWDT или SLEEP
3 PD
0 – при выполнении команды
SLEEP
1 – результат последней арифме-
тической или логической опера-
ции равен нулю
2 Z Бит нуля
0 – результат последней арифме-
тической или логической опера-
ции не равен нулю
1 – при переполнении младшего
Бит десятичного перено- полубайта
1 DC
са / займа 0 – младший полубайт не пере-
полнен
1 – перенос данных из самого
старшего бита результата
0 – нет переноса данных из само-
го старшего бита результата
При операциях вычитания значе-
ние этого бита соответствует ин-
0 C Бит переноса / займа вертированному биту займа.
Для команд циклического сдвига
(RRF, RLF) в этот бит загружается
либо старший, либо младший бит
(в зависимости от направления
сдвига) обрабатываемого реги-
стра

22
4.6.2. Регистр STATUS (03h, 83h, 103h, 183h)
Регистр STATUS – регистр, отражающий состояние микрокон-
троллера и предназначенный для управления им. STATUS содержит
информацию о состоянии АЛУ, сторожевого таймера и выборе банка
памяти, к нему можно обратиться с помощью любой команды, как и к
любому другому регистру.
Состав регистра STATUS изображен на рис. 7.
Рассмотрим назначение бит регистра STATUS подробнее (табл. 3).

Рис. 7. Состав регистра STATUS (R – бит доступен для чтения, W – бит


доступен для записи, x – значение бита по умолчанию неизвестно)

Если регистр STATUS используется командой, которая изменя-


ет биты C, DC, и Z, то запись в эти три бита невозможна. Эти биты
устанавливаются или очищаются соответственно логике устройства.
Следовательно, биты TO и PD закрыты для записи. Это нужно учиты-
вать при выводе какой-либо информации в STATUS.
Например, команда CLRF STATUS  очистит старшие три бита
и установит бит Z, т. е. в результате операции в регистре STATUS
содержится 000uu1uu, где u – неизменяемые биты. Таким образом,
для изменения регистра STATUS рекомендуется использовать коман-
ды BCF, BSF, SWAPF и МOVWF, так как они позволяют изменять каж-
дый бит отдельно.

4.6.3. Регистры ввода-вывода PORTA (05h) и PORTB (06h)


Регистры ввода-вывода PORTA и PORTB могут быть использо-
ваны как для вывода информации, так и для ввода, причём направле-
ние обмена информацией (ввод или вывод) может быть задано для
каждого бита отдельно с помощью управляющих регистров TRISA
(85h) и TRISB (86h).
Например, задание 1 в 1-м pазpяде pегистpа TRISB
пpогpаммиpует соответствующий pазpяд PORTB как вход микрокон-
троллера.
При чтении порта считывается непосредственное состояние вы-
вода, пpи записи в порт запись происходит в буферный pегистp.

23
4.6.4. Регистр OPTION (81h, 181h)
Регистр OPTION содержит биты управления предварительным
делителем таймера TMR0 и WDT, активным фронтом внешнего пре-
рывания RB0/INT, подтягивающими резисторами на входах PORTB
(табл. 4).

Таблица 4
Описание битов регистра OPTION
Номер
Имя Назначение Описание состояний бита
бита
Включение подтяги- 1 – резисторы отключены
7 RBPU вающих резисторов 0 – резисторы включены
на входах PORTB
Выбор фронта или 1 – прерывания по фронту импуль-
спада импульса на са
6 INTEDG
входе внешнего 0 – прерывания по спаду импульса
прерывания INT
1 – внешний тактовый сигнал с вы-
Выбор тактового вода RA4/T0CKI
5 T0CS
сигнала для TMR0 0 – внутренний тактовый сигнал
CLKOUT
Выбор фронта или 1 – срабатывание по спаду внеш-
спада импульсов него импульса
4 T0SE при внешнем такто- 0 – срабатывание по фронту внеш-
вом сигнале для него импульса
TMR0
1 – предделитель включён перед
Выбор подключения WDT
3 PSA
предделителя 0 – предделитель включён перед
TMR0
Значение Для TMR0 Для WDT
000 1:2 1:1
001 1:4 1:2
Установка коэффи- 010 1:8 1:4
PS2–
2–0 циентов деления 011 1:16 1:8
PS0
предделителя 100 1:32 1:16
101 1:64 1:32
110 1:128 1:64
111 1:256 1:128

Все биты OPTION доступны как для чтения, так и записи.

24
4.7. Таймеры
Таймером называют цифровой счётчик, срабатывающий при по-
ступлении тактового импульса. Таймер может тактироваться от внут-
реннего (системного) генератора или от внешнего источника колеба-
ний. Часто таймер используют с предделителем частоты, т. е. устрой-
ством, которое делит частоту тактовых импульсов, подаваемых в
таймер. Например, если задать значение предделителя 1:2, то таймер
будет срабатывать при каждом втором командном цикле.
В микроконтроллере встроено три таймера, обозначаемых
TMR0, TMR1 и TMR2 соответственно. Каждый из них больше подхо-
дит для определённого типа работы. Рассмотрим эти таймеры под-
робнее.

4.7.1. TMR0
Таймер TMR0 (адрес 01h) – 8-разрядный таймер (т. е. считает от
0 до 255), тактируемый от системного тактового генератора частоты
или от внешнего источника. Этот таймер работает постоянно.
Возможна настройка срабатывания по переднему или заднему
фронту тактового импульса.
При переполнении таймера (при переходе от 255 к 0) генериру-
ется прерывание.
Этот таймер можно использовать для генерации импульсов за-
данной длины или для подсчёта входящих импульсов.
TMR0 оснащён 8-битным предделителем частоты, управление
таймером осуществляется регистром OPTION (адрес 81h).
Рассмотрим пример использования TMR0 (листинг 2). Для ини-
циализации таймера загрузите значение 11000001 в регистр настроек
OPTION. Этим вы выберете внутренний генератор для TMR0 и зна-
чение предделителя 1:4.

Листинг 2. Пример использования таймера TMR0


BSF STATUS,RP0
MOVLW B'11000001' ; Инициализация TMR0
MOVWF OPTION_REG ;
BCF STATUS,RP0 ;
CLRF TMR0

start NOP
GOTO start
END

25
Запустите программу в пошаговом режиме, наблюдая за состоя-
нием регистра TMR0. Каждые 4 цикла его значение должно увеличи-
ваться на единицу. Учтите, что выполнение команды GOTO занимает
2 командных цикла.
Время выполнения команды удобно отсчитывать по секундоме-
ру. Для запуска секундомера выберите Windows / Stopwatch. Секундо-
мер покажет количество циклов, прошедших с начала выполнения
программы, количество наносекунд при заданной в проекте частоте
резонатора.

4.7.2. TMR1
Таймер TMR1 (0Eh, 0Fh) представляет собой 16-разрядный
счётчик (т. е. считает от 0 до 65535). Для хранения текущего состояния
таймера используется два регистра: TMR1L (0Eh) и TMR1H (0Fh).
Управление таймером осуществляется регистром T1CON (10h).
Может тактироваться как от внешнего источника сигналов, так
и от дополнительного часового кварца. Максимальное значение предде-
лителя – 1:8. Таймер срабатывает только при фронте тактового импульса.
Применение TMR1 аналогично TMR0 (листинг 3).

Листинг 3. Пример использования таймера TMR1

BCF STATUS,RP0 ;

MOVLW B'00001101';
MOVWF T1CON

CLRF TMR1L
CLRF TMR1H

start NOP
GOTO start ;
END
Запустите программу в пошаговом режиме, наблюдая за состоя-
нинм регистров TMR1L и TMR1H.

4.7.3. TMR2
Таймер TMR2 – 8-битный счётчик, тактируемый только от сис-
темного тактового генератора. Управление таймером осуществляется
регистром T2CON. Значение предделителя для этого таймера можно
задать только из ряда 1:1, 1:4 и 1:16 (листинг 4).

26
Принцип действия TMR2 отличается от TMR0 и TMR1. Таймер
считает импульсы от нуля до заданного в регистре PR2 (регистр, ука-
зывающий период отсчёта TMR2). После совпадения значений TRM2
и PR2 сигнал поступает на 4-битный постделитель и генерируется
прерывание. Такая система позволяет генерировать частоты с мини-
мальным шагом. Таймер может посылать сигналы на CCP в качестве
базы тайминга ШИМа.
Листинг 4. Пример использования таймера TMR0
BCF STATUS,RP0 ;
MOVLW B'00111100';
MOVWF T2CON
BSF STATUS,RP0 ;

MOVLW d'10';
MOVWF PR2

BCF STATUS,RP0 ;
CLRF TMR2

start NOP
GOTO start ;
END

Запустите программу в пошаговом режиме, наблюдая за состоя-


нинм регистров TMR2.

4.8. Модуль компараторов


Микроконтроллер содержит два аналоговых компаратора, выхо-
ды которых мультиплексированы с каналами ввода-вывода RA0 и
RA3. Управляются компараторы с помощью регистра CMCON (1Fh).

4.9. Универсальный синхронно-асинхронный


приёмо-передатчик (USART)
USART – это модуль последовательного ввода-вывода, который
может работать в полнодуплексном асинхронном режиме (для связи с
терминалами, компьютерами) или синхронном полудуплексном ре-
жиме (для связи с микросхемами ЦАП, АЦП, последовательными
EEPROM и т. п.).

27
4.10. Обработка прерываний
Прерывания – запросы от внешних или внутренних устройств,
при поступлении которых микроконтроллер приостанавливает вы-
полнение основной программы и переходит на подпрограмму обра-
ботки прерывания. После обработки запроса микроконтроллер воз-
вращается к основной программе.
Прерывания могут быть как внешними (изменения уровня сиг-
нала на одном из выводов или приход сообщения в USART), так
и внутренними (при переполнении таймера или совершения операции
работы с внутренней EEPROM-памятью).
За прерывания в микроконтроллерах среднего семейства PIC от-
вечает регистр INTCON. Он содержит биты разрешения прерываний
и флаги, обозначающее, что прерывание произошло.
Для начала работы с прерываниями в регистре INTCON нужно
разрешить прерывания вообще, для этого бит GIE устанавливаем
в единицу. Также нужно разрешить прерывания от нужных источников.
PIC16F628A имеет следующие источники прерываний1:
– внешнее прерывание с входа RB0/INT;
– прерывание по переполнению TMR0;
– прерывание по изменению уровня сигналов на входах
RB7…RB4;
– прерывание от модуля компараторов;
– прерывание от USART;
– прерывание от CCP;
– прерывание по переполнению TMR1;
– прерывание от TMR2.
Несколько источников прерываний содержится уже в регистре
INTCON, другая часть содержится в регистрах PIE/PIR, для их ис-
пользования нужно в регистре INTCON разрешить прерывания от пе-
риферийных модулей – бит PEIE.

4.11. Система команд


Каждая команда микроконтроллера из семейства
PIC16F627A/628A/648A имеет вид 14-битного слова, состоящего из
двух частей: кода операции и операнда.
Код операции (operation code, OPCODE, опкод) определяет дей-
ствие команды.

1
PIC16F62X. Однокристальные 8-разрядные FLASH CMOS микроконтроллеры.

28
Операнд – исходные данные, необходимые для совершения опе-
рации, закодированной в опкоде.
Все команды выполняются в течение одного командного цикла,
кроме случаев, при которых соблюдается условие, содержащееся
в команде, или значение счётчика команд изменяется в зависимости
от результата операции. Такие команды выполняются за два цикла.
Один командный цикл равен четырём периодам колебаний так-
тового генератора. Например, при частоте генератора 4 МГц время
выполнения одной команды равно 1 мкс. Если же соблюдается усло-
вие, содержащееся в команде, или значение счётчика команд изменя-
ется в зависимости от результата операции, то время выполнения ко-
манды составляет 2 мкс.
Система команд высокоортогональна, т. е. действие команд не
повторяется, одну команду нельзя разложить на более простые дейст-
вия, используя другие команды, а также выполнение одной команды
не влияет на выполнение другой.
Все команды делятся на байт-ориентированные, бит-
ориентированные, символьные и команды управления (табл. 5).

Таблица 5
Команды микроконтроллера PIC16F628A
При-
Мнемоника Цик-
Описание Флаги меча-
и операнды лы
ния
Байт-ориентированные операции
ADDWF f, d Сложение W и f 1 C,DC,Z 1,2
ANDWF f, d Операция И над W и f 1 Z 1,2
CLRF f Очистка регистра f 1 Z 2
CLRW – Очистка аккумулятора W 1 Z
COMF f, d Дополнение f 1 Z 1,2
DECF f, d Декремент f 1 Z 1,2
DECFSZ f, d Декремент f и пропустить след. ко- 1 (2) 1,2,3
манду если f = 0
INCF f, d Инкремент f 1 Z 1,2
INCFSZ f, d Инкремент f и пропустить след. ко- 1 (2) 1,2,3
манду если f = 0
IORWF f, d Операция ИЛИ над W и f 1 Z 1,2
MOVF f, d Перемещение содержимого регистра f 1 Z 1,2
MOVWF f Поместить значение W в f 1
NOP – Нет операции 1
RLF f, d Сдвиг влево f через флаг переноса C 1 C 1,2
RRF f, d Сдвиг вправо f через флаг переноса C 1 C 1,2
SUBWF f, d Вычесть W из f 1 C,DC,Z 1,2
SWAPF f, d Поменять местами полубайты в f 1 1,2
XORWF f, d Исключающее ИЛИ над W и f 1 Z 1,2

29
Окончание табл. 5
При-
Мнемоника Цик-
Описание Флаги меча-
и операнды лы
ния
Бит-ориентированные операции
BCF f, b Очистить бит b в регистре f 1 1,2
BSF f, b Установить бит b в регистре f 1 1,2
BTFSC f, b Если b = 0 в регистре f, то пропус- 1 (2) 3
тить след. команду
BTFSS f, b Если b = 1 в регистре f, то пропус- 1 (2) 3
тить след. команду
Пословные операции и операции управления
ADDLW k Сложить слово и содержимое W 1 C,DC,Z
ANDLW k Операция И над словом и W 1 Z
CALL k Вызвать подпрограмму 2
CLRWDT – Очистить сторожевой таймер 1 TO,PD
GOTO k Перейти на заданный адрес 2
IORLW k Операция ИЛИ над словом и W 1 Z
MOVLW k Записать слово в W 1
RETFIE – Вернуться из прерывания 2
RETLW k Вернуться, записав слово в W 2
RETURN – Вернуться из подпрограммы 2
SLEEP – Перейти в спящий режим 1 TO,PD
SUBLW k Вычесть W из слова 1 C,DC,Z
XORLW k Исключающее ИЛИ над словом и W 1 Z
Примечание. 1. При выполнении операций «чтение – модификация – запись» с
портом ввода-вывода (например, командой MOVF PORTB,1) исходные значения счи-
тываются с выводов порта, а не из выходных триггеров. Например, если в выходном
триггере было записано «1», а на соответствующем выходе присутствует низкий уро-
вень напряжения, то обратно в регистр будет записано значение «0». 2. Если данная
команда выполняется над регистром TMR0 (и d = 1), то предделитель будет очищен
при назначении Timer0. 3. Если счётчик команд (PC) изменён или соблюдено условие
в команде условного перехода, то команда выполняется за 2 цикла. Второй цикл вы-
полняется как NOP.

Для байт-ориентирванных команд параметр f обозначает адрес


регистра, а параметр d определяет, куда будет записан результат
выполнения команды. Если d = 0, то результат будет помещён в ре-
гистр W, а если d = 1, то в регистр, указанный в команде.
Для бит-ориентированных команд b обозначает номер бита в ре-
гистре, с которым будут произведены какие-либо действия, а f обо-
значает адрес регистра, в котором расположен обрабатываемый бит.
Для символьных команд и команд управления k обозначает
8-битную постоянную («слово»).

30
ЛАБОРАТОРНЫЕ РАБОТЫ

ЛАБОРАТОРНАЯ РАБОТА 1. РАБОТА С ПОРТАМИ ВВОДА-ВВЫВОДА

Цель работы. Научиться перемещать данные между регистра-


ми, настраивать и выводить данные в порты.
Рабочее задание. В среде MPLAB напишите программу, вы-
полняющую вывод некоторого числа, заданного преподавателем,
в PORTB. Примерный код программы приведён в листинге 5.

Листинг 5. Вывод постоянного значения в PORTB


1 LIST p=PIC16F628A
2 __CONFIG 03F38H
3 #include<p16f84.inc>
4 ORG 0
5 GOTO BEGIN
6 BEGIN BCF STATUS,RP0
7 CLRF PORTB
8 BSF STATUS,RP0
9 MOVLW B'00000000'
10 MOVWF TRISB
11 BCF STATUS,RP0
12
13 START MOVLW B'00001110'
14 MOVWF PORTB
15 GOTO START
16 END

Откомпилируйте программу, убедитесь в её работоспособности.


Снимите скриншоты состояния изменяемых в ходе работы програм-
мы регистров.
Загрузите вашу программу в микроконтроллер учебного стенда,
используя программу IC-Prog. По светодиодам, отображающим со-
стояние PORTB, убедитесь в работоспособности программы.
Содержание отчёта. Отчёт по работе должен содержать ти-
тульный лист, цель работы, ход её выполнения, листинг программы
с пояснениями и результаты её работы (сведения о состоянии реги-
стров).

31
Контрольные вопросы и задания
1. Дайте определение понятия архитектуры RISC.
2. Каким объёмом памяти располагают ОЗУ и ПЗУ в
PIC16F628?
3. Чем обусловлена необходимость деления ОЗУ на банки па-
мяти?
4. Дайте определение понятий регистров общего и специально-
го назначения.
5. Поясните назначение регистра STATUS.
6. Каким образом задаётся направление обмена данными пор-
тов PIC16F628?

ЛАБОРАТОРНАЯ РАБОТА 2. СЛОЖЕНИЕ И ВЫЧИТАНИЕ

Цель работы. Научиться выполнять операции сложения и вы-


читания целых чисел.
Рабочее задание. Напишите программу, реализующую сложе-
ние двух чисел А и B, заданных преподавателем, и выводящую ре-
зультат сложения в PORTB. Примерный код программы приведён
в листинге 6.
Листинг 6. Сложение чисел
1 LIST p=PIC16F628A
2 __CONFIG 03F38H
3 #include<p16f84.inc>
4 ORG 0
5 GOTO BEGIN
6 BEGIN BCF STATUS,RP0
7 CLRF PORTB
8 MOVLW B'00000000'
9 BSF STATUS,RP0
10 MOVWF TRISB
11 BCF STATUS,RP0
12
13 START MOVLW D'29' ; слагаемое A
14 ADDLW D'200' ; слагаемое B
15 MOVWF PORTB
16 GOTO START
17 END

32
Откомпилируйте программу и убедитесь в её работоспособ-
ности.
Задайте числа А и B такими, чтобы A + B > 255.
Напишите программу, выполняющую вычитание двух чисел, за-
данных преподавателем, и выводящую результат сложения в PORTB.
Задайте числа такими, чтобы результат вычитания был больше нуля.
Примерный код программы приведён в листинге 7.

Листинг 7. Вычитание чисел


1 LIST p=PIC16F628A
2 __CONFIG 03F38H
3 #include<p16f84.inc>
4 ORG 0
5 GOTO BEGIN
6 ORG 100h
7 BEGIN BCF STATUS,RP0
8 CLRF PORTB
9 MOVLW B'00000000'
10 BSF STATUS,RP0
11 MOVWF TRISB
12 BCF STATUS,RP0
13
14 START MOVLW D'29' ; вычитаемое B
15 ADDLW D'200' ; уменьшаемое A
16 MOVWF PORTB
17 GOTO START
18 END

Откомпилируйте программу и убедитесь в её работоспособ-


ности.
Задайте числа такими, чтобы результат вычитания был равен
нулю. Откомпилируйте программу и запишите состояние регистра
STATUS после выполнения команды вычитания.
Задайте числа такими, чтобы результат вычитания был меньше
нуля. Откомпилируйте программу и запишите состояние регистра
STATUS после выполнения команды вычитания.
Содержание отчёта. Отчёт по работе должен содержать ти-
тульный лист, цель работы, ход её выполнения, листинг программы с
пояснениями и результаты её работы (сведения о состоянии регистров
STATUS и PORTB при различных значениях А и B).

33
Контрольные вопросы и задания
1. Какие команды выполняют операции сложения и вычитания?
2. Какое число записывается в регистр W в результате опера-
ции сложения, если сумма двух слагаемых больше 255?
3. Какое число записывается в регистр W в результате опера-
ции вычитания, если разность двух операндов меньше нуля?
4. Поясните назначение битов C, DC, и Z регистра STATUS.
5. Предложите способ сложения и вычитания чисел со знаком.
6. Предложите способ сложения и вычитания двухбайтных
чисел.

ЛАБОРАТОРНАЯ РАБОТА 3. УМНОЖЕНИЕ И ДЕЛЕНИЕ

Цель работы. Научиться выполнять операции умножения и де-


ления целых чисел.
Рабочее задание. Напишите программу, реализующую умно-
жение двух чисел, заданных преподавателем, и выводящую резуль-
тат сложения в PORTB. Примерный код программы приведён в лис-
тинге 8.
Листинг 8. Умножение чисел
1 LIST p=PIC16F628A
2 __CONFIG 03F38H
3 #include <p16f84.inc>
4 PC EQU 01H
5
6 ; Умножение чисел /////////////////////
7
8 ORG 0
9 GOTO BEGIN
10
11 BEGIN BCF STATUS,RP0
12 CLRF PORTB
13 MOVLW B'00000000'
14 BSF STATUS,RP0
15 MOVWF TRISB
16 BCF STATUS,RP0
17

34
18 START MOVLW D'6'
19 ADDWF PC
20 CLRW
21 LOOP ADDLW D'31'
22 DECFSZ PC,1
23 GOTO LOOP
24 MOVWF PORTB
25 GOTO START
26 END

Задайте A = 0 и откомпилируйте и запустите программу.


Отметьте ход выполнения программы и результат, выведенный
в PORTB.
Задайте B = 0 и откомпилируйте и запустите программу.
Отметьте ход выполнения программы и результат, выведенный
в PORTB.
Напишите программу, выполняющую деление двух чисел A/B,
заданных преподавателем, и выводящую результат деления в PORTB.
Примерный код программы приведён в листинге 9.

Листинг 9. Деление чисел


1 LIST p=PIC16F628A
2 __CONFIG 03F38H
3 #include<p16f84.inc>
4
5 ; Деление чисел /////////////////////
6
7 PC EQU 01H
8 DIGIT EQU 0DH
9
10 ORG 0
11 GOTO BEGIN
12 ORG 100h
13 BEGIN BCF STATUS,RP0
14 CLRF PORTB
15 MOVLW B'00000000'
16 BSF STATUS,RP0
17 MOVWF TRISB
18 BCF STATUS,RP0
19
20 START MOVLW D'96' ; делимое A
21 MOVWF PC

35
22 CLRW
23 CLRF DIGIT
24 MOVLW D'6' ; делитель B
25 LOOP SUBWF PC,1
26 INCF DIGIT,1
27 MOVF PC,1
28 BTFSS STATUS,Z
29 GOTO LOOP
30 MOVF DIGIT,0
31 MOVWF PORTB
32 GOTO START
33 END

Задайте A = 0 и откомпилируйте и запустите программу.


Опишите ход выполнения программы и результат, выведенный
в PORTB.
Задайте B = 0 и откомпилируйте и запустите программу.
Опишите ход выполнения программы и результат, выведенный
в PORTB.
Задайте числа A и B такими, чтобы результат деления не являл-
ся целым числом. Откомпилируйте и запустите программу. Опишите
ход выполнения программы и результат, выведенный в PORTB.
Содержание отчёта. Отчёт по работе должен содержать ти-
тульный лист, цель работы, ход её выполнения, листинг программы с
пояснениями и результаты её работы (сведения о состоянии регистров
STATUS и PORTB, а также описания выполнения программы при
различных значениях А и B).

Контрольные вопросы и задания


1. Какое число записывается в аккумулятор, если A×B > 255?
2. Какое число записывается в аккумулятор при A×0?
3. Какое число записывается в аккумулятор при 0×B?
4. Выполняется ли равенство A×0 = 0×B?
5. Опишите ход выполнения программы при делении числа на
ноль.
6. Опишите ход выполнения программы при делении ноля на
число. Доработайте программу так, чтобы при A = 0 в результате де-
ления получался ноль.

36
ЛАБОРАТОРНАЯ РАБОТА 4. ИСПОЛЬЗОВАНИЕ ПОДПРОГРАММ

Цель работы. Научиться работать с подпрограммами.


Рабочее задание. Напишите программу, выполняющую генера-
цию прямоугольных импульсов напряжения с частотой 1 Гц. Выход-
ное напряжение выдавайте на один из разрядов PORTB. Примерный
код программы приведён в листинге 10.

Листинг 10. Пример использования подпрограмм


1 LIST p=PIC16F628A
2 __CONFIG 03F38H
3 #include<p16f84.inc>
4
5 ; Использование подпрограмм /////////////////////
6
7 REG1 EQU 0DH
8 REG2 EQU 0EH
9
10 ORG 0
11 GOTO BEGIN
12 BEGIN BCF STATUS,RP0
13 CLRF PORTB
14 MOVLW H'0'
15 BSF STATUS,RP0
16 MOVWF TRISB
17 BCF STATUS,RP0
18
19 START MOVLW b'00000001'
20 CALL PAUSE
21 MOVLW b'00000000'
22 CALL PAUSE
23 GOTO START
24
25 PAUSE MOVWF PORTB
26 MOVLW d'3'
27 MOVWF REG1
28
29 LOOP1 MOVWF REG2
30 LOOP2 DECFSZ REG2,1
31 GOTO LOOP2

37
32 DECFSZ REG1,1
33 GOTO LOOP1
34 RETURN
35 END

Определите задержку между переключениями уровней напря-


жения на выходе, с помощью секундомера MPLAB (Window /
Stopwatch). Для того чтобы показания секундомера отображали дей-
ствительное время выполнения команд, в MPLAB следует ввести зна-
чение частоты используемого кварцевого резонатора. Для этого от-
кройте окно Development Mode (Project / Edit project / Change) и во
вкладке Clock задайте частоту равной 3,6864 МГц.
Вычислите и задайте такие значения регистров REG1 и REG2,
чтобы длительность выполнения подпрограммы задержки стала равна
1 секунде.
Содержание отчёта. Отчёт по работе должен содержать ти-
тульный лист, цель работы, ход её выполнения, листинг программы с
пояснениями, расчёт параметров для подпрограммы задержки.

Контрольные вопросы и задания


1. Какие команды выполняют вызов подпрограмм и возврат
из неё?
2. Опишите процедуру определения адреса подпрограммы в
памяти.
3. Чем отличается реализация вызова подпрограмм с помощью
команд CALL и RETURN от реализации вызова с помощью команд
безусловного перехода?
4. Доработайте программу так, чтобы для задания задержки ис-
пользовался таймер TMR0.

ЛАБОРАТОРНАЯ РАБОТА 5. ОПРОС КЛАВИАТУРЫ

Цель работы. Научиться работать со входными регистрами.


Рабочее задание. Напишите программу, управляющую состоя-
нием светодиода, подключенному к одному из выводов PORTB с по-
мощью кнопки, на одном из выводов PORTA. Примерный код про-
граммы приведён в листинге 11.

38
Листинг 11. Пример опроса входного порта (клавиатуры)
1 LIST p=PIC16F628A
2 __CONFIG 03F29H
3 REG EQU 20H
4 ORG 0
5 ; Опрос клавиатуры /////////////////////
6
7 GOTO BEGIN
8
9 BEGIN BCF STATUS,RP0
10 MOVLW 0x07 ; выключаем аналоговые компараторы
11 MOVWF CMCON ; с помощью регистра CMCON
12 BSF STATUS,RP0
13 MOVLW B'00000000'
14 MOVWF TRISB
15 MOVLW B'11111'
16 MOVWF TRISA
17 BCF STATUS,RP0
18
19 CLRF PORTB
20 CLRF PORTA
21
22 START MOVLW B'00000001'
23 MOVWF PORTB
24 MOVF PORTA,0 ; чтение из PORTA
25 MOVWF REG
26 BTFSC REG,0 ; проверяем бит RA0 ==0
27 CALL SUBRTN ; если 1
28 GOTO START ; если 0
29
30 SUBRTN MOVLW B'00000000'
31 MOVWF PORTB
32 MOVF PORTA,0 ; чтение из PORTA
33 MOVWF REG
34 BTFSC REG,0 ; проверяем бит RA0==0
35 GOTO SUBRTN ; если 1
36 RETURN ; если 0
37 END

Содержание отчёта. Отчёт по работе должен содержать ти-


тульный лист, цель работы, ход её выполнения, листинг программы с
пояснениями.

39
Контрольные вопросы и задания
1. C какой целью используется регистр REG?
2. Поясните назначение записи числа 7h в регистр CMCON.
3. На основе программ из лабораторных работ 4 и 5 напишите
программу, выполняющую последовательное включение светодиодов
(«бегущие огни»), направление движения которых задавалось бы со-
стоянием кнопки.

40
БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. IC-Prog [Электронный ресурс]. – Электрон. дан. и прогр. –


2015. – Режим доступа: http://www.ic-prog.com. – Загл. с экрана.
2. MicroCHIP. Словарь терминов и сокращений [Электронный
ресурс]. – Электрон. дан. – 2015. – Режим доступа:
http://www.microchip.ru/?mid=3x2. – Загл. с экрана.
3. MicroCHIP. Статьи на русском языке [Электронный ресурс]. –
Электрон. дан. – 2015. – Режим доступа: http://www.microchip.ru/
lit/?mid=1x0. – Загл. с экрана.
4. MPASM. Руководство пользователя [Электронный ресурс]. –
Электрон. дан. – 2001. – Режим доступа:
http://www.microchip.ru/files/d-sheets-rus/mpasm.pdf. – Загл. с экрана.
5. MPLab [Электронный ресурс]. – Электрон. дан. – 2008. – Ре-
жим доступа: http://www.mplab.ru/. – Загл. с экрана.
6. MPLAB IDE. Интегрированная среда разработки для микро-
контроллеров PICmicro компании Microchip Technology Incorporated
[Электронный ресурс]. – Электрон. дан. – 2001. – Режим доступа:
http://www.microchip.ru/files/d-sheets-rus/mplab_ide.pdf. – Загл. с эк-
рана.
7. PIC16F62X. Однокристальные 8-разрядные FLASH CMOS
микроконтроллеры компании Microchip Technology Incorporated
[Электронный ресурс]. – Электрон. дан. – 2001. – Режим доступа:
http://www.microchip.ru/files/d-sheets-rus/pic16f62x.pdf. – Загл. с эк-
рана.
8. Предко, М. PIC-микроконтроллеры: архитектура и програм-
мирование : пер. с англ. / М. Предко. – М. : ДМК Пресс, 2010.

41
ПРИЛОЖЕНИЕ
Технические характеристики PIC16F628A

Характеристика RISC ядра

Тактовая частота может быть в диапазоне от 0 до 20 МГц.


Поддержка прерываний.
8-уровневый аппаратный стек.
Прямая, косвенная и относительная адресация.
35 однословных команд (все команды выполняются за один ма-
шинный цикл, кроме команд ветвления и условия с истинным резуль-
татом).

Особенности микроконтроллеров

Внешний и внутренний режимы тактового генератора (прецизи-


онный внутренний генератор 4МГц, энергосберегающий внутренний
генератор 37 кГц, режим внешнего генератора для подключения квар-
цевого или керамического резонатора).
Режим энергосбережения SLEEP.
Программируемые подтягивающие резисторы на входах
PORTB.
Сторожевой таймер WDT с отдельным генератором.
Режим низковольтного программирования.
Программирование на плате через последовательный порт
(ICSP) (с использованием двух выводов).
Защита кода программы.
Сброс по снижению напряжения питания BOR.
Сброс по включению питания POR.
Таймер включения питания PWRT и таймер запуска генерато-
ра OST.
Широкий диапазон напряжения питания от 2,0 до 5,5 В.
Промышленный и расширенный температурный диапазон.
Высокая выносливость ячеек FLASH/EEPROM (100 000 циклов
стирания/записи FLASH-памяти программ, 1 000 000 циклов стира-
ния/записи EEPROM-памяти данных, длительность хранения данных
FLASH/EEPROM-памяти более 100 лет).

42
Периферия

16 каналов ввода-вывода с индивидуальными битами направле-


ния.
Сильноточные схемы портов сток/исток, допускающих непо-
средственное подключение светодиодов.
Модуль аналоговых компараторов: два аналоговых компарато-
ра, внутренний программируемый источник опорного напряжения,
внутренний или внешний источник опорного напряжения, выходы
компараторов могут быть подключены на выводы микроконтроллера.
TMR0: 8-разрядный таймер/счетчик с программируемым пред-
делителем.
TMR1: 16-разрядный таймер/счетчик с внешним генератором.
TMR2: 8-разрядный таймер/счетчик с программируемым пред-
делителем и постделителем.
CCP модуль: разрешение захвата 16 бит, разрешение сравнения
16 бит, 10-разрядный ШИМ.
Адресуемый USART-модуль.

43
Учебно-методическое издание

ОСНОВЫ МИКРОПРОЦЕССОРНОЙ ТЕХНИКИ:  
ПРОГРАММИРОВАНИЕ МИКРОКОНТРОЛЛЕРА  
PIC16F628A 
 
Методические указания

Составитель
Сухарев Евгений Николаевич

Редактор Т. Е. Ильющенко
Оригинал-макет и верстка М. А. Светлаковой

Подписано в печать 02.11.2015. Формат 60×84/16. Бумага офсетная.


Печать плоская. Усл. печ. л. 2,6. Уч.-изд. л. 2,8. Тираж 50 экз.
Заказ . С 576.
Санитарно-эпидемиологическое заключение
№ 24.04.953.П.000032.01.03 от 29.01.2003 г.

Редакционно-издательский отдел Сиб. гос. аэрокосмич. ун-та.


Отпечатано в отделе копировально-множительной техники
Сиб. гос. аэрокосмич. ун-та.
660037, г. Красноярск, просп. им. газ. «Красноярский рабочий», 31.

44
Таблица 5
Команды микроконтроллера PIC16F628A
При-
Мнемоника
Описание Циклы Флаги меча-
и операнды
ния

Байт-ориентированные операции

ADDWF f, d Сложение W и f 1 C,DC,Z 1,2


ANDWF f, d Операция И над W и f 1 Z 1,2
CLRF f Очистка регистра f 1 Z 2
CLRW – Очистка аккумулятора W 1 Z
COMF f, d Дополнение f 1 Z 1,2
DECF f, d Декремент f 1 Z 1,2
DECFSZ f, d Декремент f и пропустить след. команду если f = 0 1 (2) 1,2,3
INCF f, d Инкремент f 1 Z 1,2
INCFSZ f, d Инкремент f и пропустить след. команду если f = 0 1 (2) 1,2,3
IORWF f, d Операция ИЛИ над W и f 1 Z 1,2
MOVF f, d Перемещение содержимого регистра f 1 Z 1,2
MOVWF f Поместить значение W в f 1
NOP – Нет операции 1
RLF f, d Сдвиг влево f через флаг переноса C 1 C 1,2
RRF f, d Сдвиг вправо f через флаг переноса C 1 C 1,2
SUBWF f, d Вычесть W из f 1 C,DC,Z 1,2
SWAPF f, d Поменять местами полубайты в f 1 1,2
XORWF f, d Исключающее ИЛИ над W и f 1 Z 1,2
Бит-ориентированные операции
BCF f, b Очистить бит b в регистре f 1 1,2
BSF f, b Установить бит b в регистре f 1 1,2
BTFSC f, b Если b = 0 в регистре f, то пропустить след. команду 1 (2) 3
BTFSS f, b Если b = 1 в регистре f, то пропустить след. команду 1 (2) 3
Пословные операции и операции управления
ADDLW k Сложить слово и содержимое W 1 C,DC,Z
ANDLW k Операция И над словом и W 1 Z
CALL k Вызвать подпрограмму 2
CLRWDT – Очистить сторожевой таймер 1 TO,PD
GOTO k Перейти на заданный адрес 2
IORLW k Операция ИЛИ над словом и W 1 Z
MOVLW k Записать слово в W 1
RETFIE – Вернуться из прерывания 2
RETLW k Вернуться, записав слово в W 2
RETURN – Вернуться из подпрограммы 2
SLEEP – Перейти в спящий режим 1 TO,PD
SUBLW k Вычесть W из слова 1 C,DC,Z
XORLW k Исключающее ИЛИ над словом и W 1 Z

1. При выполнении операций «чтение – модификация – запись» с портом ввода-


вывода (например, командой MOVF PORTB,1), то исходные значения считываются
с выводов порта, а не из выходных триггеров. Например, если в выходном триггере
было записано «1», а на соответствующем выходе присутствует низкий уровень
напряжения, то обратно в регистр будет записано значение «0».
2. Если данная команда выполняется над регистром TMR0 (и d = 1), то предде-
литель будет очищен при назначении Timer0.
3. Если счётчик команд (PC) изменён или соблюдено условие в команде услов-
ного перехода, то команда выполняется за 2 цикла. Второй цикл выполняется как NOP.

45

Оценить