Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дубров ОМТ.pdf
Скачиваний:
6
Добавлен:
17.05.2015
Размер:
4.02 Mб
Скачать

Федеральное агентство железнодорожного транспорта Уральский государственный университет путей сообщения

Кафедра «Автоматика, телемеханика и связь на железнодорожном транспорте»

И. А. Дубров М. Ю. Белошицкий

А. Н. Попов

ОСНОВЫ МИКРОПРОЦЕССОРНОЙ ТЕХНИКИ

Екатеринбург Издательство УрГУПС

2012

Федеральное агентство железнодорожного транспорта Уральский государственный университет путей сообщения

Кафедра «Автоматика, телемеханика и связь на железнодорожном транспорте»

И. А. Дубров М. Ю. Белошицкий

А. Н. Попов

ОСНОВЫ МИКРОПРОЦЕССОРНОЙ ТЕХНИКИ

Учебно-методическое пособие по дисциплинам «Основы микропроцессорной техники», «Программирование периферийных контроллеров» для студентов специальностей

190402 – «Автоматика, телемеханика и связь на железнодорожном транспорте», 190901 – «Системы обеспечения движения поездов» всех форм обучения

Екатеринбург Издательство УрГУПС

2012

УДК 656.259.12 Д79

 

Дубров, И. А.

 

Д79

Основы

микропроцессорной техники: учеб.-метод пособие.

 

/ И. А. Дубров,

М. Ю. Белошицкий, А. Н. Попов. – Екатеринбург :

 

Изд-во УрГУПС, 2012. – 99,[1] с.

 

В пособии

описана архитектура, принцип действия и система команд

микроконтроллеров семейства PIC-micro, изложены методические указания к выполнению лабораторных работ для обучения основам программирования на

языке Ассемблер в интегрированной среде разработки MPLAB.

 

 

Пособие предназначено для студентов специальностей 190402 – «Автома-

тика,

телемеханика

и

связь

на

железнодорожном

транспорте

и 190901 – «Системы обеспечения движения поездов» всех форм обучения.

 

УДК 656.259.12

Печатается по решению редакционно-издательского совета университета.

Авторы: И. А. Дубров, старший преподаватель кафедры «Автоматика, телемеханика и связь на ж.-д. транспорте», УрГУПС

А. Н. Попов, ассистент кафедры «Автоматика, телемеханика и связь на ж.-д. транспорте», УрГУПС

М. Ю. Белошицкий, ассистент кафедры «Автоматика, телемеханика и связь на ж.-д. транспорте», УрГУПС

Рецензент: А. А. Новиков, профессор кафедры «Автоматика, телемеханика и связь на ж.-д. транспорте», УрГУПС

© Уральский государственный университет путей сообщения (УрГУПС), 2012

 

Оглавление

 

ВВЕДЕНИЕ……………………............................................................................................4

ЛАБОРАТОРНАЯ РАБОТА 1 Изучение интегрированной среды разработки MPLAB

...5

ЛАБОРАТОРНАЯ РАБОТА 2 Изучение запоминающих устройств микроконтроллеров

 

PIC-micro ........................................................................

21

ЛАБОРАТОРНАЯ РАБОТА 3 Изучение работы параллельных портов

 

 

микроконтроллеров PIC-micro.......................................

31

ЛАБОРАТОРНАЯ РАБОТА 4

Изучение работы последовательных портов

 

 

микроконтроллеров PIC-micro.......................................

40

ЛАБОРАТОРНАЯ РАБОТА 5

Изучение работы таймеров микроконтроллеров PIC-

 

 

micro................................................................................

54

ЛАБОРАТОРНАЯ РАБОТА 6

Изучение работы аналого-цифрового преобразователя

 

 

микроконтроллеров PIC-micro.......................................

69

ЛАБОРАТОРНАЯ РАБОТА 7

Изучение работы модуля захвата/сравнения/ШИМ

 

 

микроконтроллеров PIC-micro.......................................

78

Библиографический список …............................................................................................85

Приложение 1. Схема лабораторного макета ....................................................................

86

Приложение 2. Краткое описание набора инструкций PIC16 ..........................................

87

Приложение 3. Список команд PIC16 и их подробное описание .....................................

88

3

 

 

 

 

ВВЕДЕНИЕ

 

 

 

 

В настоящее время в устройствах железнодорожной автоматики,

 

телемеханики и связи применяется большое количество различных

 

микропроцессоров и микроконтроллеров. В зависимости от

решаемых

 

задач они могут иметь

отличия в архитектуре, наборе периферийных

 

устройств, производительности, системе команд и т. д.

 

 

 

 

В данном курсе при выполнении лабораторных работ используется 8-

 

разрядный

 

универсальный

микроконтроллерPIC16F873A

фирмы

 

Microchip, построенный по гарвардской архитектуре и включающий в себя

 

весь необходимый набор периферийных модулей, таких, как системный

 

монитор,

запоминающие

устройства,

порты ввода-вывода,

таймеры,

 

аналого-цифровой преобразователь, схемы захвата и сравнения, широтно-

 

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

 

 

 

 

Все микроконтроллеры фирмы Microchip имеют сокращенный набор

 

команд (RISC). В частности, микроконтроллер PIC16F873A имеет всего 35

 

уникальных

команд,

что

обуславливает легкость

в

изучении основ

 

программирования

данного

микроконтроллера. Подробное

 

описание

 

системы команд микроконтроллера приведено в прил. 4.

 

 

 

 

Для

написания,

компиляции, тестирования и

отладки

программ

 

используется интегрированная среда разработкиMPLAB, позволяющая

 

использовать языки программирования Ассемблер и . КромеСи того,

 

MPLAB

позволяет

 

имитировать

работу

микроконтроллера

на

персональном

компьютере (симулятор

MPLAB-SIM),

либо

с

помощью

 

программатора-отладчика PICkit-2 загружать разрабатываемую программу

 

впамять реального микроконтроллера.

Сцелью практического изучения программирования микропроцессоров и микроконтроллеров на кафедре«Автоматика, телемеханика и связь на ж.-д. транспорте» разработаны специализированные лабораторные

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

модулей. Принципиальная

электрическая

схема

макета

приведена

в прил. 1.

 

 

 

 

4

ЛАБОРАТОРНАЯ РАБОТА 1

Изучение интегрированной среды разработки MPLAB

Цель работы:

ознакомиться с лабораторным макетом по ОМТ и

средой разработки MPLAB.

Лабораторный макет по ОМТ включает в себя демонстрационную

плату, построенную

на микроконтроллереPIC16F873A, программатор-

отладчик PICkit 2 и персональный компьютер с установленной программой MPLAB. В одном корпусе макета расположены два комплекта аппаратуры (два рабочих места).

Структурная схема макета приведена на рис. 1.1. Она состоит из микроконтроллера PIC16F873A, с подключенными к нему периферийными

устройствами, программатора-отладчика PICkit 2 и

персонального

компьютера.

 

В состав периферийных устройств входят:

 

кнопка SA1 «RESET» (сброс);

кнопки SA2..SA6, подключенные к входам параллельного порта микроконтроллера;

потенциометр R1, подключенный к входу аналого-цифрового преобразователя микроконтроллера;

пьезокерамический звукоизлучатель BZ1;

светодиоды HL1...HL6, подключенные к выходам параллельного порта микроконтроллера;

– микроамперметр

PV1, подключенный

к

выходу

широтно-

импульсного модулятора микроконтроллера;

 

 

 

– драйвер последовательного интерфейса RS-232C (микросхема DD2

типа ILX232N),

предназначенный для

согласования

уровней

сигналов на выводах последовательного порта микроконтроллера и персонального компьютера;

– светодиоды HL8 «TXD» и HL9 «RXD», индицирующие передачу

либо прием информации по последовательному порту.

 

 

Программатор-отладчик PICkit 2 предназначен

для

записи

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

Принципиальная электрическая схема приведена непосредственно на лицевой панели макета и в прил. 1.

5

 

 

Рис. 1.1. Структурная схема макета

 

 

 

 

 

Интегрированная

среда

разработкиMPLAB

IDE

для

 

микроконтроллеров PIC-micro фирмы Microchip Technology Incorporated

 

позволяет писать, отлаживать и оптимизировать текст программы. MPLAB

 

IDE включает в себя текстовый редактор, компилятор с языка Ассемблер

 

MPASM,

компановщик

объектных

файлов(линковщик)

 

MPLINK,

 

компановщик библиотек MPLIB, менеджер проектов, симулятор MPLAB-

 

SIM и

другие

необходимые

программы. Кроме того, в

MPLAB

 

обеспечивается

поддержка

аппаратных средств

программирования

и

отладки, таких, как PICkit, MPLAB ICD, MPLAB ICE, разработки самой

 

фирмы Microchip

и сторонних разработчиков. Структурная

схема

 

обработки информации в MPLAB приведена на рис. 1.2. Исходный текст

 

программы на языке Ассемблер должен быть сохранен в файле(файлах) с

 

расширением .asm. При компиляции

программы

в

машинные

коды

с

помощью

программы MPASM

генерируются

объектные

файлы

с

расширением .о. Компановщик MPLINK соединяет имеющиеся объектные файлы в файл с шестнадцатеричными машинными кодами и имеющий расширение .hex, при этом происходит выделение областей памяти каждому из фрагментов исходной программы, присвоение конкретных адресов меткам и т. д.

6

Рис. 1.2. Структурная схема обработки информации в MPLAB

 

 

В

формируемый hex-файл

могут

включаться готовые фрагменты

программы, хранящиеся в библиотечных файлах с расширением .lib. Кроме

hex-файла

MPLINK

генерирует

файл

с

полным

текстом

программы

(листинг), имеющий расширение .lst, файл с планом распределения памяти

программ

с

расширением.map

и

файл – отчет

об

обнаруженных

при

компиляции ошибках с расширением .err. Программа в шестнадцатеричных

кодах

(hex-файл)

может быть

загружена

в

программный

имитатор

(симулятор) микроконтроллера или с помощью аппаратного программатора

непосредственно

 

во

внутреннююFLASH

память

реального

микроконтроллера. В лабораторном макете доступны оба варианта отладки

программы,

но

при

отладке

 

на симуляторе

отсутствует

возможность

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

используется редактор библиотек MPLIB.

 

 

 

 

Структура

исходного

текста

программы

на

языке

Ассемблер

представляет из себя таблицу(см. табл. 1.1). Колонки таблицы должны разделяться символами пробела или табуляции. Каждая строка программы содержит одну ассемблерную команду, преобразуемую компилятором MPASM в исполняемый машинный ,кодлибо директиву (указание)

ассемблеру или линковщику, называемую псевдокомандой. Псевдокоманды

вмашинные коды не транслируются.

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

7

для того, чтобы удобно ссылаться на то или иное место программы, например писать

GOTO start

вместо

GOTO 0x0002

Вторая колонка содержит мнемонический код ассемблерной команды (псевдокоманды).

Третья колонка – данные, которые обрабатываются в данной команде, называемые операндами. Если команда использует несколько операндов, то они разделяются запятой, если команда не использует операндов, третья колонка остается пустой.

Четвертая колонка является необязательной и содержит текстовый комментарий к данной команде. Комментарий начинается с символа (точка с запятой). Содержимое комментария игнорируется компилятором и не влияет на работу программы.

Пример исходного текста программы на языке Ассемблер Таблица 1.1

Метка:

Мнемокод

Операнды

 

;Комментарии

 

 

 

 

 

 

#include

p16f873a.inc

 

 

ORG

H'001'

;начальный адрес программы

 

 

 

 

;начало цикла

M100:

 

 

 

;проверка портов

 

BTFSC

PORTB,5

;скачек, если нажата кнопка SA2

 

GOTO

M210

;переход к гашению HL2

 

BSF

PORTC,0

;включаем HL2

 

GOTO

M220

;переход к проверке SA3

 

· · · · · · · · · · · · · · · · · · · · · · · · · ·

 

 

BTFSC

PORTB,1

;скачек, если нажата кнопка SA5

 

GOTO

M320

;переход

 

BTFSC

PORTB,0

;скачек, если нажата кнопка SA6

 

GOTO

M320

;переход

 

BCF

PORTA,3

;выдаем паузу на PORTA,3

M320:

BTFSC

PORTB,5

;скачек, если нажата кнопка SA2

 

 

 

 

 

8

 

 

 

 

Продолжение табл. 1.1

Метка:

Мнемокод

 

Операнды

;Комментарии

 

 

 

 

 

 

GOTO

M600

;переход к проверке АЦП

 

BTFSC

PORTB,4

;скачек, если нажата кнопка SA3

 

GOTO

M600

;переход к проверке АЦП

 

BCF

PORTA,2

;выдаем паузу на PORTA,2

M600:

 

 

 

;проверка АЦП и ШИМ

 

MOVF

ADRESH,W

;считываем значение с АЦП

 

MOVWF

CCPR1L

;переписываем в регистр CCP1

 

MOVLW

B'00000101'

;включение и запуск АЦП

 

MOVWF

ADCON0

;программируем регистр АЦП 0

 

 

 

 

;выдержка времени

 

MOVLW

H'FF'

;|

 

MOVWF

H'20'

;|

M940:

DECFSZ

H'20',F

;|

 

GOTO

M940

;|

 

GOTO

M100

;конец цикла

 

END

 

 

Применение оконного интерфейса в современных версияхMPLAB существенно упростило процесс создания программы. Преобразование

файлов в необходимый формат и вызов

соответствующих программ

происходит

автоматически, практически

без

участия

программиста.

Интерфейс MPLAB схож с интерфейсом другихWindows приложений и легок в освоении.

Скриншот основного окна MPLAB приведен на рис. 1.3.

9

Рис. 1.3. Основное окно MPLAB: 1 – панель меню, 2 – панель инструментов, 3 – рабочая область и 4 – строка состояния

На

панели

инструментов

доступны

шесть

групп,

кнопо

повторяющих основные функции текстового меню:

 

 

 

 

– стандартная,

включающая

 

кнопки

 

управления

,файлами

редактирования, печати и др.;

 

 

 

 

 

 

– менеджер проектов;

 

 

 

 

 

 

– контрольная сумма;

 

 

 

 

 

 

– отладки, включающая

кнопки

управления

выполнением

программы;

 

 

 

 

 

 

 

управления программатором-отладчиком PICkit 2;

ресурсов устройства, используемых при отладке программы.

На рабочей области основного окнаMPLAB размещаются окна с открытыми файлами, всплывающие меню, диалоговые окна и другая информация.

Строка состояния отображает текущие настройки системы и основные данные разрабатываемой программы.

10

Методика выполнения работы

1. Создание нового проекта

Выбрать пункт меню Project › New... либо щелкнуть левой клавишей

мыши

по

соответствующей

кнопке

на

панели

инструментов. В

появившемся диалоговом окне, скриншот которого приведен на рис. 1.4.,

необходимо

ввести название

программы

и

путь к ,

гдепапке будут

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

Рис. 1.4. Диалоговое окно «Новый проект»

2. Создание файла с исходным текстом программы

Выбрать пункт менюFile › New, либо нажать соответствующую кнопку на панели инструментов. В рабочей областиMPLAB откроется окно текстового редактора(см. рис. 1.5.), с помощью которого можно набирать текст своей программы. В первой лабораторной работе можно скопировать через буфер обменаWindows в это окно текст готовой программы, например из файла test_all.asm.

Сохранить (File › Save As...) исходный текст программы в рабочей папке проекта в файле с расширением .asm.

11

Рис. 1.5. Окно текстового редактора MPLAB

3. Добавление файла к проекту

Открыть окно менеджера проектов(View › Project) (см. рис. 1.6.). Щелкнуть правой клавишей мыши по папкеSource Files и выбрать пункт выпадающего меню Add Files.... При этом откроется диалоговое окно открытия файла, приведенное на рис. 1.7. Необходимо выбрать нужный файл и нажать клавишу Открыть.

12

Рис. 1.6. Окно менеджера проектов

Рис. 1.7. Окно добавления файла в проект

13

4. Компиляция исходного текста программы в машинные коды

Перед компиляцией программы необходимо указатьMPLAB тип используемого микроконтроллера. Для этого необходимо выбрать пункт меню Configure › Select Device... и в открывшемся диалоговом окне(рис. 1.8.) выбрать тип устройства. В данном случае это PIC16F873A.

 

Рис. 1.8. Окно выбора микроконтроллера

 

Доступ

к

конфигурационной

ячейке

микроконтролл

осуществляется через меню Configure › Configuration bits. Вид окна битов

конфигурации

приведен

на рис. 1.9. Поскольку в

лабораторном

макете в

качестве источника тактового сигнала используется высокочастотный кварцевый резонатор, то в первой строке в колонкеSetting необходимо выбрать пункт HS Oscillator (см. рис. 1.9). Содержимое остальных пунктов данного окна можно оставить без изменения.

Альтернативным

способом

настройки конфигурационных ячеек

является настройка

директивами

в исходном . Напримеркоде, для

14

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

__CONFIG _HS_OSC;

При этом флажок «Configuration Bits set in code» в окне Configuration Bits должен быть установлен.

Для преобразования исходного текстового файла шестнадцатеричный hex-файл необходимо выбрать пункт менюProject ›

Make, либо щелкнуть по соответствующей кнопке на панели инструментов.

При этом в рабочей папке проекта будут созданы выходные файлы с расширениями .o, .hex, .lst, .map, .err.

Рис. 1.9. Окно битов конфигурации

Просмотреть содержимое этих файлов можно в окне текстового редактора MPLAB (File › Open..., либо кнопка на панели инструментов).

Ход выполнения компиляции и сообщения об обнаруженных ошибках отображаются в выходном окне MPLAB (рис. 1.10).

15

Рис. 1.10. Выходное окно MPLAB

5. Запись кода программы во внутреннююFLASH память микроконтроллера

Для программирования микроконтроллера и отладки программы в

лабораторном

макете

применяется

программатор-отладчикPICkit 2,

 

который должен быть подключен кUSB порту персонального компьютера.

 

Указание MPLAB об

использовании PICkit 2 как

отладчика дается через

 

пункт меню Debugger › Select Tool › PICkit 2. После подключения PICkit

 

становятся

доступными

команды

программирования

в

меню

соответствующие им кнопки на панели инструментов. Запись программы в

 

память микроконтроллера осуществляется командойDebugger › Program,

 

чтение памяти программ – Debugger › Read, а чтение энергонезависимой

 

памяти данных –

Debugger

› Read

EEDATA.

Результат

успешного

 

программирования микроконтроллера или возникшие при этом ошибки отображаются в выходном окне MPLAB.

16

6. Отладка (выполнение) программы

Запуск выполнения программы возможен в нескольких режимах. Для

этого

предусмотрены

соответствующие команды в меню и кнопки на

панели

инструментов.

Debugger › Run запускает программу в режиме

реального

времени. При

частоте

кварцевого

резонатора4

МГц время

выполнения одной команды составляет ровно1 мкс. Debugger › Animate

запускает

программу

в

режиме

мультипликации. Время

выполнения

команды

составляет

примерно0,5

 

с,

что

позволяет

 

наблюдать

ход

выполнения

программы.

Debugger ›

Step Into

приводит к выполнению

одной

очередной

команды

в

 

основной

программе

и

вложенны

подпрограммах. Debugger

Step

Over

работает

аналогично,

но

без

выполнения подпрограмм. Очередная выполняемая команда обозначается

курсором

в

виде

зеленой

стрелки, расположенной

слева

от

текста

программы.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Выполнение программы может быть остановлено командой Debug-

ger › Halt,

а

также

при помощи предварительно установленной точки

останова, задаваемой в команде меню Debugger › Breakpoints... или путем

двойного щелчка правой клавишей мыши по нужной строке исходного

текста программы. Точка останова отображается в виде красного кружка с

буквой

В

 

слева

от

 

текста

программы. Неактивные

точки

останова

отображаются в виде красной окружности.

Во время отладки можно наблюдать изменения, производимые программой в памяти микроконтроллера и его встроенных периферийных

устройствах. Для этого необходимо открыть соответствующее

окно в

рабочей области MPLAB.

 

Команда View › Disassembly Listing открывает одноименное

окно

(рис. 1.12), в котором отображается содержимое памяти программ в виде машинных кодов и мнемонических обозначений команд. View › EEPROM открывает окно энергонезависимой памяти данных(рис. 1.11). View › File Registers открывает окно памяти данных (рис. 1.13). View › Hardware Stack открывает окно аппаратного стека(рис. 1.14). View › Program memory – окно памяти программ (рис. 1.15). и др.

Рис. 1.11. Окно энергонезависимой памяти данных

17

Рис. 1.12. Окно дизассемблера

Рис. 1.13. Окно памяти данных

18

Рис. 1.14. Окно аппаратного стека

Рис. 1.15. Окно памяти программ

19

Содержание отчета

В отчете необходимо привести скриншот(скриншоты) основного окна программы MPLAB для различных этапов написания и отладки программы (по заданию преподавателя).

Контрольные вопросы

1.Назначение программы MPLAB.

2.Что содержит в себе asm-файл? hex-файл?

3.Какое окно вы вызовете для просмотра ячеек энергонезависимого ПЗУ?

4.В процессе отладки вам необходимо наблюдать состояние бита3 ячейки памяти по адресу 0x73. Ваши действия.

5.Представьте, что ваша программа занимается реккурентным вычислением (для реализации которого нужно использовать цикл).

По окончании вычисления его результат выводится на устройства

ввода/вывода.

В

процессе

отладки

вам

необходим

проконтролировать результат вычисления. Чем вы воспользуетесь:

 

точками останова либо анимацией?

 

 

 

6. В лабораторной

работе была

рассмотрена

конфигурационная

ячейка настройки тактового генератора. Какие еще существуют конфигурационные ячейки? Каково их назначение?

7.Перечислите источники тактовой частоты микроконтроллера и укажите два способа их выбора в MPLAB.

20

ЛАБОРАТОРНАЯ РАБОТА 2

Изучение запоминающих устройств микроконтроллеров PIC-micro

Цель работы: изучение работы и программирование памяти микроконтроллера PIC16F873A.

Всостав микроконтроллераPIC16F873A входят четыре вида

запоминающих

устройств: 14-разрядная

FLASH память

программ,

объемом

4096 слов,

192 ячейки 8-разрядной статической

оперативной

памяти

данных,

128

ячеек 8-разрядной

энергонезависимой EEPROM

памяти данных и восьмиуровневый аппаратный стек.

FLASH память программ

Память программ предназначена для хранения кода исполняемой программы и неизменяемых данных, т. е. констант. Чтение и запись информации из FLASH памяти программ осуществляются аналогично чтению и записи информации в энергонезависимуюEEPROM память данных и будут рассмотрены ниже. Запись программы во FLASH память осуществляется с помощью программатора-отладчикаPICkit 2, для этого используются три вывода микроконтроллера: PGD – вход данных, PGC – вход синхронизации иPGM – вход выбора режима низковольтного программирования.

Карта памяти программ микроконтроллера PIC16F873A приведена на рис. 2.1.

Рис. 2.1. Организация FLASH памяти программ

 

 

Оперативная память данных – регистровый файл

 

 

Оперативная

память

данных

предназначена

для

хранени

информации, с которой работает микроконтроллер.

Чтение и запись информации в память данных производится самим микроконтроллером при выполнении любой команды, имеющей в качестве операнда регистр общего или специального назначения. При обращении к

21

памяти данных возможны два способа адресации: прямая и косвенная. При прямой адресации адрес ячейки памяти указывается непосредственно в операнде команды. При косвенной адресации фактический адрес ячейки памяти помещается в регистр адресаFSR, а в самой команде в качестве операнда указывается физически не реализованный регистр INDF.

Рис. 2.2. Организация оперативной памяти данных

Вся память данных распределена между регистрами общего и специального назначения и разделена на четыре банка. Первые 32 ячейки в каждом банке зарезервированы под РСН, а 96 ячеек банка 0 и банка 1 занимают РОН. Выбор активного банка осуществляется изменением

22

соответствующих разрядов регистраSTATUS: RP0 и RP1 при прямой адресации, или IRP при косвенной.

Карта оперативной памяти данных приведена на рис. 2.2.

Следует отметить, что обращение к РСН в программе возможно как путем указания их фактического шестнадцатеричного адреса, так и путем указания их символьного имени. В последнем случае в состав исходного текста программы необходимо включить директиву Ассемблера#include p16f873a.inc, подключающую файл соответствия символьных обозначений числовым значениям адресов для данного микроконтроллер. Символьными именами можно обозначать и отдельные биты РСН.

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

Энергонезависимая EEPROM память данных предназначена для хранения информации, которая должна сохраняться даже при отключении электропитания микроконтроллера. EEPROM память может быть перезаписана большее количество раз по сравнениюFLASH.с Минимальное число циклов стирание/записьEEPROM составляет 100 тысяч, а FLASH памяти – всего 1 тысяча.

Карта памяти EEPROM приведена на рис. 2.3.

Рис. 2.3. Организация энергонезависимой памяти данных EEPROM

Для чтения и записи информации EEPROMв

память

данных

и во

FLASH

память

программ

используются

регистры

специального

назначения: EEDATA – регистр

данных (младший байт данных при

обращении к 14-разрядной памяти

программ), EEDATH – старший

байт

данных

при

обращении

к памяти программ, EEADR – регистр адреса

(младший байт адреса при обращении к4К памяти программ), EEADRH –

старший байт адреса при обращении к памяти программ, EECON1 –

первый регистр управления EEPROM (FLASH), EECON2 – второй регистр

управления

EEPROM

(FLASH),

INTCON –

регистр

управления

прерываниями, PIE2 – второй регистр разрешения прерываний иPIR2 – второй регистр флагов прерываний.

Для чтения данных из EEPROM необходимо выполнить следующую последовательность действий:

– записать адрес необходимой ячейки памяти в регистр EEADR;

23

сбросить в «0» бит EEPGD в регистре EECON1;

инициировать операцию чтения путем установки в«1» бита RD в регистре EECON1;

считать полученные данные из регистра EEDATA.

Чтение данных изFLASH памяти программ осуществляется аналогично, последовательность действий при этом немного сложней:

– записать младший байт адреса необходимой ячейки в регистр EEADR, а старший – в регистр EEADRH;

установить в «1» бит EEPGD в регистре EECON1;

инициировать операцию чтения путем установки в«1» бита RD в регистре EECON1;

сформировать выдержку времени длительностью два машинных цикла, например путем выполнения двух холостых команд NOP;

считать младший байт полученных данных из регистраEEDATA, а

старший – из регистра EEDATH.

Последовательность действий при записи информации EEPROMв следующая:

1.Проверить состояние битаWR в регистре EECON1 и убедиться, что он равен«0», те есть в настоящий момент не производится запись в EEPROM либо FLASH.

2.Записать адрес нужной ячейки в регистр EEADR.

3.Записать данные в ячейку EEDATA.

4.Сбросить в «0» бит EEPGD в регистре EECON1.

5.Установить в «1» бит WREN в регистре EECON1, разрешив запись

вEEPROM.

6.Запретить прерывания, если они были разрешены.

7.Выполнить обязательную последовательность из пяти команд.

– записать значение H'55' в регистр EECON2 (две команды, сначала запись в W, затем в EECON2).

– записать значение H'AA' в регистр EECON2 (две команды, сначала запись в W, затем в EECON2).

– установить в «1» бит WR в регистре EECON1.

8.Разрешить прерывания, если это необходимо.

9.Сбросить в «0» бит WREN в регистре EECON1.

10.По окончании цикла записи автоматически сбрасывается «0»в

бит WR регистра EECON1 и взведется в«1» флаг прерывания EEIF в регистре PIR2 (сбрасывается программно).

Несмотря на то, что флаг прерывания взводится после окончания каждого цикла записи обработка прерываний будет инициирована только в том случае если они разрешены установкой«1»в битов GIE и PEIE регистра INTCON и не маскированы (бит EEIE в регистре PIE2 взведен).

24

Стек

Стеком называется область оперативной памяти, организованная по

принципу «первым

вошел –

последним

вышел». В

микроконтроллерах

PIC16 стек используется исключительно для хранения адресов возврата из

подпрограмм.

В

отличие

от

других

микропроцессоров

микроконтроллеров, в микроконтроллерах PIC16 запись данных на стек не

предусматривается. Выбор очередной свободной ячейки стековой памяти

осуществляется автоматически, указатель стека программно не доступен.

Стек имеет всего восемь 13-разрядных ячеек статической

оперативной

памяти (рис.

2.4.),

следовательно,

в

программе для

микроконтроллера

PIC16 не

должно

быть более

восьми вложенных

подпрограмм, с учетом обработчиков (драйверов) прерываний.

Рис. 2.4. Организация стековой памяти

Порядок выполнения работы

В данной лабораторной работе необходимо разработать и отладить программу, реализующую обращение к определенным областям памяти микроконтроллера PIC16F873A. Конкретное задание выдается преподавателем.

В качестве примера рассмотрим следующее задание: необходимо разработать программу, заполняющую все регистры общего назначения банка 0 возрастающими двоичными числами, начиная с h'00', и копирующую эти данные в EEPROM.

1. Постановка задачи

Представим исходную словесную форму задания в аналитическом виде. Для этого обозначим буквойN число, записываемое в очередной регистр, буквой F адрес регистра, а буквой E – адрес ячейки EEPROM.

Поскольку адреса РОН в банке 0

начинаются с H'20',

а заканчиваются

H'7F', то можно записать, что F

 

[H'20', H'7F']. Соответственно в этот

массив памяти поместятся числа отH'00' до H'5F', или N

[H'00', H'5F'].

 

 

 

 

При копировании в EEPROM будут задействованы ячейки с адресамиE [H'00', H'5F']. Также можно записать: [F0]=0, [Fi]=Ni, [Fi+1]=Ni+1, [Ei]=[Fi].

25

Впоследних формулах квадратные скобки обозначают, что буквами F

иE обозначены не адреса ячеек памяти, а содержимое ячеек памяти с этими адресами.

2.

Разработка алгоритма программы

 

 

 

 

 

Укрупненный алгоритм программы приведен на рис. 2.5.

 

 

 

В первом блоке алгоритма производятся предварительные настройки

 

Ассемблерной программы: ссылки на включаемые в

основной

текст

 

файлы, задание начального адреса программы, распределение РОН и т. д.

 

 

Блоки со второго по седьмой описывают запись возрастающих чисел

 

в банк 0 регистрового файла.

 

 

 

 

 

 

Во втором

и

третьем блоке задаются начальные значения адреса

 

ячейки оперативной памяти данных и число, записываемое в эту ячейку.

 

 

В четвертом блоке производится собственно запись числа в ячейку

 

памяти.

 

 

 

 

 

 

 

 

 

 

В

пятом

и

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

следующей ячейки и следующего числа(в данном примере это просто

 

увеличение на единицу).

 

 

 

 

 

 

 

В седьмом блоке алгоритма производится сравнение числа с его

 

конечным значением. Следует учесть, что в данном примере сравнение

 

происходит после

увеличения числа, поэтому в качестве конечного

 

значения взято число 60, а не 5F. Если число не достигло своего конечного

 

значения, то программа возвращается к записи этого числа в очередную

 

ячейку (блок 4, М10:), если же результат сравнения положительный, то

 

 

программа

переходит

к

копированию информации из

ОЗУEEPROMв

 

 

(блоки с восьмого по тринадцатый).

 

 

 

 

 

В восьмом и девятом блоках задаются начальные значения адресов

 

ячеек оперативной памяти данных и EEPROM.

 

 

 

 

 

В

десятом

 

блоке

производится

копирование

информации

из

очередной ячейки ОЗУ в EEPROM.

 

 

 

 

 

В одиннадцатом и двенадцатом адреса ячеек ОЗУEEPROMи

 

 

увеличиваются на единицу.

 

 

 

 

 

 

 

В

тринадцатом

блоке производится

сравнение

адреса

ячейки

EEPROM с конечным значением, увеличенным на единицу. Если адрес ячейки не достиг своего конечного значения, то программа возвращается к блоку 10 (М20:), иначе – переход к концу программы.

26

Рис. 2.5. Блок-схема алгоритма программы

27

3. Написание текста программы на языке Ассемблер

Исходный текст программы приведен далее:

; предварительные настройки

 

 

#include

p16f873a.inc

 

 

CONFIG

_HS_OSC

;

 

ORG

H'000'

;вектор сброса

CNT

EQU

H'A0'

;определение регистра счетчика

 

 

 

;с адресом А0 (банк 1)

; запись возрастающих чисел в ОЗУ

 

BCF

STATUS,RP1 ; ┬ выбираем банк регистров 1

 

BSF

STATUS,RP0 ; ┘

 

MOVLW

H'20'

;загрузка в рабочий регистр адреса

 

 

 

;первого РОН в банке 0

 

MOVWF FSR

;записываем начальный адрес

 

 

 

;в регистр косв. адресации

 

CLRF

CNT

;обнуляем регистр счетчик

M10:

MOVF

CNT,W

;загружаем значение счетчика в рабочий регистр

РОН

MOVWF INDF

;сохраняем очередной отсчет в косвенно адресуемый

INCF

FSR,F

;увеличение адреса РОН

 

 

 

 

;в регистре косвенной адресации

 

INCF

CNT,F

;увеличение счетчика на 1

 

MOVF

CNT,W

;загружаем новое значение счетчика

 

 

 

;в рабочий регистр

 

XORLW

H'60'

;сравниваем его с последним значением +1

 

BTFSS

STATUS,Z

;если совпадают, то скачек через одну команду

 

GOTO

M10

;если не совпадают, то возврат

 

 

 

;к записи следующей ячейки

;копирование из ОЗУ в EEPROM

 

 

MOVLW

H'20'

;загрузка в рабочий регистр

 

 

 

;адреса первого РОН в банке 0

 

MOVWF FSR

;записываем начальный адрес

 

 

 

;в регистр косв. адресации

 

CLRF

CNT

;обнуляем регистр счетчик адреса EEPROM

M20:

BSF

STATUS,RP1

; ┬ выбираем банк регистров 3

 

BSF

STATUS,RP0

; ┘

 

BTFSC

EECON1,WR ; ┬ проверка окончания предыдущей

 

 

 

; │ записи в EEPROM

 

GOTO

M20

; ┘

 

BCF

STATUS,RP1

; ┬ выбираем банк регистров 1

 

BSF

STATUS,RP0

; ┘

 

MOVF

CNT,W

;загружаем значение счетчика в рабочий регистр

 

BSF

STATUS,RP1

; ┬ выбираем банк регистров 2

 

BCF

STATUS,RP0

; ┘

 

MOVWF

EEADR

;сохраняем адрес очередной ячейки в регистре адреса

 

MOVF

INDF,W

;считываем данные из очередного РОН

28

 

 

 

;в рабочий регистр

 

 

 

 

MOVWF EEDATA

;и сохраняем их в регистре данных EEPROM

 

BSF

STATUS,RP1 ; ┬ выбираем банк регистров 3

 

BSF

STATUS,RP0 ; ┘

 

 

 

 

 

 

BCF

EECON1,EEPGD

;выбираем EEPROM

 

 

BSF

EECON1,WREN

;разрешаем

запись

 

 

BCF

INTCON,GIE ;запрещаем прерывания

 

 

 

MOVLW

H'55'

; ┐

 

 

 

 

 

 

MOVWF

EECON2

; │

 

 

 

 

 

 

MOVLW

H'AA'

; ├ обязательная последовательность из пяти команд

 

MOVWF

EECON2

; │

 

 

 

 

 

 

BSF

EECON1,WR ; ┘

 

 

 

 

 

 

BCF

EECON1,WREN

;запрещаем

запись

 

 

BCF

STATUS,RP1 ; ┬ выбираем банк регистров 1

 

BSF

STATUS,RP0 ; ┘

 

 

 

 

 

 

INCF

FSR,F

;увеличение адреса РОН

 

 

 

 

;в регистре косвенной адресации

 

INCF

CNT,F

;увеличение счетчика на 1

 

 

MOVF

CNT,W

;загружаем новое значение счетчика

 

 

 

;в рабочий регистр

 

 

 

 

XORLW

H'60'

;сравниваем его с последним значением +1

 

BTFSS

STATUS,Z

;если

совпадают то

скачек

через одну команду

 

GOTO

M20

;если нет, то переход к копированию

 

 

 

;очередной ячейки

 

 

 

M30:

GOTO

M30

;зацикливаемся здесь

 

 

 

END

 

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

 

 

 

 

4. Трансляция

исходного

текста

программы в машинные

 

коды

 

 

 

 

 

 

 

 

Процесс

создания

нового

проекта

и

компиляции программы

подробно описан в лабораторной работе 1.

5. Тестирование и отладка

На этапе отладки программы необходимо выявить и устранить все возникшие на предыдущих этапах .ошибкиОписание процесса программирования микроконтроллера и запуска программы приведены в лабораторной работе 1. Необходимо учесть, что состояние ячеек энергонезависимой EEPROM памяти данных отображается только после выполнения команды Debugger › Read EEDATA.

6. Сопровождение

Поскольку все программы, разрабатываемые при изучении курса ОМТ, носят чисто учебный характер, то их работоспособность необходимо

поддерживать лишь до момента защиты лабораторной работ преподавателю.

29

Содержание отчета

В отчете необходимо привести постановку задачи, блок-схему

алгоритма и текст программы на языке Ассемблер с исправлениями,

возникшими на этапе отладки.

 

 

 

 

 

 

Контрольные вопросы

 

 

 

1. Какие

виды

памяти

присутствуют

в

микроконтроллер

PIC16F873A?

 

 

 

 

 

2. Деление

памяти

данных

на

банки

создает

определенные

неудобства

при

конструировании

программ: программисту

приходится постоянно помнить о том, в каком банке данных он

работает в настоящий момент, в какой банк данных необходимо

переключиться, для того чтобы установить контрольный бит

заданного контрольного регистра и .т п.

Тем не менее разделение

памяти на банки присутствует в микроконтроллерах PIC16. Как Вы думаете, что заставило разработчиков этой архитектуры пойти на

такое решение?

 

 

 

 

3. В первом пункте алгоритма записи данных EEPROMв

(FLASH)

проверяется флаг WR

регистра

EECON1, т. е. факт

того, что

микпроконтроллер не

занят

записью EEPROMв

(FLASH) в

данный момент. Придумайте несколько ситуаций, в которых эта проверка покажет свою полезность.

4.Какие инструкции из набораPIC16 записывают данные в стек и удаляют данные из него?

5.Почему ячейки памяти стека имеют 13-разрядный размер?

6.Представьте, что Вы проектируете кассовый аппарат. Каким видом памяти следует воспользоваться для хранения текста распечатываемого чека; для хранения порядкового номера распечатываемого чека?

30

 

 

 

ЛАБОРАТОРНАЯ РАБОТА 3

 

 

 

Изучение работы параллельных портов микроконтроллеров

 

 

 

 

 

 

PIC-micro

 

 

 

 

Цель работы: изучение работы и программирование параллельных

 

портов микроконтроллера PIC16F873A.

 

 

 

 

 

 

Микроконтроллер PIC16F873A имеет три параллельных порта ввода-

 

вывода: 6-разрядный порт A и два 8-разрядных порта B и C. К внешним

 

устройствам

 

порты

ввода-вывода

 

подключаются

через

вывод

микроконтроллера RA0...RA5, RB0...RB7 и RC0...RC7 соответственно.

 

Выводы порта A мультиплексированы со входами аналого-цифрового

 

преобразователя,

порта B

со схемой

низковольтного

программирования

 

(используются программатором-отладчиком PICkit 2) и со входом запроса

 

прерывания, а порта C – со схемами интервального таймера T1, широтно-

 

импульсного модулятора, последовательной шины и последовательного

 

порта. Кроме того,

ко входам порта B могут быть подключены внутренние

 

подтягивающие резисторы.

 

 

 

 

 

 

 

 

В схеме лабораторного макета выводы

параллельных

портов

распределены следующим образом: RA0

вход

аналого-цифрового

 

преобразователя, RA2 и RA3 – выходы

к

которым

подключен

пьезокерамический

звукоизлучатель BZ1,

RA5 –

верхний

желтый

 

светодиод HL1, RC0 – зеленый светодиод HL2, RC1 – красный светодиод

 

HL3, RC2 – выход ШИМ, RC3 – нижний желтый светодиод HL4, RC4 –

 

зеленая полоса HL5, RC5 – лунно-белый

светодиод HL6, RC6 – выход

 

последовательного

порта

ввода-вывода, RC7 –

вход

последовательного

 

порта ввода-вывода, RB0 – кнопка SA6, RB1 – кнопка SA5, RB2 – кнопка

 

SA4, RB3 – вход

низковольтного

программирования, RB4 – кнопка SA3,

 

RB5 – кнопка SA2, RB6 – вход синхронизации

программатора-отладчика

 

PICkit 2 и RB7 – вход данных программатора-отладчика PICkit 2.

 

 

Для

управления

работой

портов

ввода-вывода

используются

следующие РСН:

 

 

 

 

 

 

 

 

 

 

TRISA, TRISB и TRISC определяют

направление

передачи

информации через порты ввода-вывода, при записи логического«0» в

 

какой -либо разряд регистраTRIS соответствующий разряд порта ввода-

 

вывода начинает работать как выход, а при записи «1» – как вход. Легко

 

запомнить: «0» как «O» – «Output», «1» как «I» – «Input».

 

 

 

PORTA, PORTB и PORTC –

регистры портов

ввода-вывода, если

 

порт настроен на вывод информации, то

запись «0» или

«1» в

 

определенный

 

разряд

этих

регистров

приводит

к

появлен

соответствующего сигнала на выходах параллельного порта, если же порт настроен на ввод информации, то из этих регистров можно считать фактические логические уровни, присутствующие на входах параллельного порта (не зависимо от того, что было записано в эти регистры ранее).

31

ADCON1 определяет, какие из выводов порта A будут использоваться для ввода аналогового сигнала, а какие для ввода или вывода цифрового, в схеме данного макета аналоговый сигнал подается на выводRA0, поэтому перед использованием порта A в качестве порта ввода-вывода необходимо записать в регистр ADCON1 число H'0E'.

OPTION_REG позволяет подключить ко входам портаB внутренние подтягивающие резисторы и определяет вызов внешнего прерывания по переднему или заднему фронту импульса на выводеRB0. Сброс в «0» разряда OPTION_REG.-RBPU приводит к подключению внутренних подтягивающих регистров, а установка в«1» – к отключению, «0» в разряде OPTION_REG.INTEDG – прерывание по заднему фронту сигнала

на входе RB0, «1» – по переднему.

Порядок выполнения работы

В данной лабораторной работе необходимо разработать и отладить

программу, реализующую

 

обращение

к

портам

ввода-вывода

микроконтроллера

PIC16F873A.

Конкретное

 

задание

выдается

преподавателем.

 

 

 

 

 

 

В качестве примера рассмотрим следующее задание. В исходном

состоянии все светодиоды погашены, звуковой сигнал не подается. После

нажатия кнопки SA2 выдается

звуковой сигнал

частотой1 кГц. После

нажатия кнопки SA3 включается красный светодиод в мигающем режиме.

После нажатия кнопки SA4 схема возвращается в исходное состояние.

Постановка задачи

 

 

 

 

 

Представим исходную словесную форму задания в

виде графа

переходов (рис. 3.1.).

 

 

 

 

 

 

Рис. 3.1. Граф переходов по программе

32

Разработка алгоритма программы

Укрупненный алгоритм основной программы приведен на рис. 3.2.

Поскольку

в

программе

многократно

используется

блок

выдержки

времени,

то

данная последовательность

команд оформлена

в виде

подпрограммы, алгоритм которой приведен на рис. 3.3.

 

 

Рис. 3.2. Блок-схема алгоритма основной программы

33

В

первом

 

блоке

алгоритма

 

подключается

текстовый

файл

с

символьными

 

обозначениями

,

РСНприсваиваются

 

символьные

 

наименования трем регистрам общего назначения, выполняющим роль

 

счетчиков времени, задается адрес вектора сброса и начальный адрес

 

основной программы, производится настройка параллельных портов ввода-

 

вывода на соответствующий режим работы.

 

 

 

 

 

 

 

 

Порты

А

и,

 

к С которым

подключены

 

светодиоды

и

пьезокерамический звукоизлучатель, настраиваются на вывод информации,

 

а порт В, к которому подключены контакты кнопок, – на ввод. К выводам

 

порта В подключаются внутренние подтягивающие резисторы.

 

 

 

 

Блоки со второго по пятый соответствуют

исходному

состоянию

 

графа. Во втором и третьем блоках осуществляется гашение светодиода и

 

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

 

опрос состояния контактов кнопок. Если контакты кнопокSA2 и SA3

 

разомкнуты, то программа возвращается

на метку 10М и

данный

цикл

 

повторяется заново. Если нажата кнопка SA2, то осуществляется переход

 

на метку М30, а если нажата SA3, то – М20.

 

 

 

 

 

 

 

 

Блоки с шестого по одиннадцатый отвечают за мигание красного

 

светодиода. В шестом блоке происходит подача питания на светодиод.

 

Седьмой блок вызывает подпрограмму выдержки времени длительностью

 

1 с. В восьмом блоке питание со светодиода снимается. Девятый блок

 

вызывает

подпрограмму

выдержки

времени

длительностью0,5

с. В

 

десятом и одиннадцатом блоках производится опрос состояния контактов

 

кнопок. Если

контакты

кнопокSA2 и

SA4 разомкнуты, то

программа

 

возвращается на метку 20М и данный цикл повторяется заново. Если

 

нажата кнопка SA2,

то

осуществляется

переход

на

метку 30,М а

если

 

нажата SA4, то – М10.

 

 

 

 

 

 

 

 

 

 

 

 

Блоки

с

двенадцатого

по

семнадцатый

обеспечивают

подачу

звукового сигнала. В двенадцатом блоке формируется передний фронт

 

импульса, подаваемого на звукоизлучатель. Тринадцатый блок вызывает

 

подпрограмму выдержки времени длительностью 0,5 мс. В четырнадцатом

 

блоке

формируется

 

задний

фронт

, имподавульсаемого

 

на

 

звукоизлучатель.

Пятнадцатый

блок

 

снова

вызывает

подпрограмму

 

выдержки времени, длительностью 0,5 с. В шестнадцатом и семнадцатом

 

блоках производится опрос состояния контактов кнопок. Если контакты

 

кнопок SA3 и SA4 разомкнуты, то программа возвращается на метку М30

 

и данный цикл повторяется заново. Если нажата кнопкаSA3, то

 

осуществляется переход на метку М20, а если нажата SA4, то – М10.

 

 

 

Перед

вызовом

подпрограммы

 

выдержки времени в регистры-

 

счетчики

необходимо

 

записать

определенные

 

числовые

. значения

Методика расчета этих значений приведена ниже.

 

 

 

 

 

 

 

Во-первых, необходимо определить количество регистров-счетчиков.

 

Тактовая

частота

микроконтроллераPIC16F873A в

лабораторном макете

 

34

равна 4 МГц, а длительность машинного цикла– четырем периодам тактовой частоты, или 1 мкс. Большинство команд микроконтроллера выполняются за один машинный цикл, исключение составляют команды перехода, вызова и возврата из подпрограмм, которые выполняются за два цикла. Проще всего реализовать цикл требуемой длительности, используя следующие команды:

T10:

DECFSZ

CNT,F

;уменьшение значения счетчика на 1,

 

 

 

;скачек если 0

 

GOTO

T10

;возврат к декременту счетчика.

Команда DECFSZ выполняется за один машинный цикл, а GOTO за два, т. е. время выполнения цикла составляет3 мкс.* При использовании одного регистра-счетчика можно сформировать выдержку времениT от 3 до 3·28=768 мкс, при использовании двух регистров-счетчиковT ≤ 3·216=196 608 мкс, при использовании трех регистров T ≤ 3·224=50 331 648 мкс и т. д. В нашем примере достаточно трех регистров-счетчиков.

Рис. 3.3. Блок-схема алгоритма подпрограммы выдержки времени

*Длительность цикла можно увеличить, добавив в него необходимое количество холостых команд NOP.

35

Во-вторых , необходимо вычислить числовые значения, помещаемые в каждый из этих регистров. Число циклов старшего регистра определяется

 

 

 

 

 

 

 

 

 

 

æ T

- 2

16

ö

 

 

 

 

 

T

 

 

 

 

ç

 

 

÷

 

 

 

 

 

 

 

 

3

 

по формуле

H =

 

 

 

, число

циклов второго регистра–

M =

è

 

 

 

ø

, а

3· 2

16

 

 

 

 

 

 

 

 

28

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

младшего – L =

T

- (216 + M·28 ). Рассчитывается количество полных циклов,

 

 

3

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

В-третьих, необходимо

учесть, что

в команде DECFSZ

сначала

выполняется декремент и лишь потом сравнение содержимого регистра с

нулем (преддекремент), т. е.

в начале первого цикла число, записанное в

регистр, будет уменьшено на единицу, что приведет к ошибке в

 

счете.

Такая ошибка может оказаться фатальной, если число циклов равно нулю.

Поэтому к

вычисленным

значениям

необходимо

прибавить

 

единицу:

CNT_H = H +1, CNT_M = M +1, CNT_L = L +1. Эти значения заносятся в регистры-счетчики перед вызовом подпрограммы выдержки времени.

Алгоритм самой подпрограммы выдержки времени включает блоки с восемнадцатого по двадцать пятый. Вход в подпрограмму осуществляется по метке 10Т . В девятнадцатом, двадцать первом и двадцать третьем блоках производится последовательный декремент регистров-счетчиков, а в двадцатом, двадцать втором и двадцать четвертом– сравнение значений этих счетчиков с нулем. При обнулении всех счетчиков в двадцать пятом блоке происходит выход из подпрограммы.

Написание текста программы на языке Ассемблер

Исходный текст программы приведен далее:

;предварительные настройки

 

 

#include

p16f873a.inc

 

 

__CONFIG

_HS_OSC

;

CNT_L:

EQU

H'20'

;определение младшего регистра счетчика

CNT_M:

EQU

H'21'

;определение среднего регистра счетчика

CNT_H:

EQU

H'22'

;определение старшего регистра счетчика

 

ORG

H'000'

;вектор сброса

 

GOTO

H'05'

;переход на адрес, следующий

 

 

 

;за вектором прерыв.

 

ORG

H'05'

;начало основной программы

 

BCF

STATUS,RP1

;выбираем банк регистров 1

 

BSF

STATUS,RP0 ;|

 

MOVLW

B'00001110'

;задаем аналоговый входPORTA,0

 

MOVWF

ADCON1

;программируем регистр АЦП1

 

MOVLW

B'00000001'

;PORTA,7-1 выходы, PORTA,0 вход

 

MOVWF

TRISA

;программируем регистр направления PORTA

 

MOVWF

OPTION_REG;включаем подтягивающие резисторы PORTB

36

 

MOVLW

B'11111111'

;PORTB,7-0 входы

 

MOVWF

TRISB

;программируем регистр направления PORTB

 

MOVLW

B'11000000'

;PORTC,7-6 вход, PORTC,5-0 выходы

 

MOVWF

TRISC

;программируем регистр направления PORTC

;исходное состояние

 

 

M10:

BCF

STATUS,RP1 ;выбираем банк регистров 0

 

BCF

STATUS,RP0 ;|

 

CLRF

PORTC

;гасим все светодиоды и выключаем пищалку

 

CLRF

PORTA

;|

 

BTFSS

PORTB,5

;скачок, если не нажата кнопкаSA2

 

GOTO

M30

;переход к включению пищалки

 

BTFSS

PORTB,4

;скачок, если не нажата кнопкаSA3

 

GOTO

M20

;переход к включению светодиода HL3

 

GOTO

M10

;возврат к исходному состоянию

;включение мигания красного светодиода HL3

M20:

BSF

PORTC,1

;включаем HL3 на 1 с

 

MOVLW

D'6'

;задаем начальное значение старшего счетчика

 

MOVWF

CNT_H

;|

 

MOVLW

D'23'

;задаем начальное значение среднего счетчика

 

MOVWF

CNT_M

;|

 

MOVLW

D'22'

;задаем начальное значение

 

 

 

;младшего счетчика

 

MOVWF

CNT_L

;|

 

CALL

T10

;вызов подпрограммы выдержки времени

 

BCF

PORTC,1

;гасим HL3 на 0,5 с

 

MOVLW

D'3'

;задаем начальное значение старшего счетчика

 

MOVWF

CNT_H

;|

 

MOVLW

D'140'

;задаем начальное значение среднего счетчика

 

MOVWF

CNT_M

;|

 

MOVLW

D'11'

;задаем начальное значение

 

 

 

;младшего счетчика

 

MOVWF

CNT_L

;|

 

CALL

T10

;вызов подпрограммы выдержки времени

 

BTFSS

PORTB,5

;скачок, если не нажата кнопкаSA2

 

GOTO

M30

;переход к включению пищалки

 

BTFSS

PORTB,2

;скачок, если не нажата кнопкаSA4

 

GOTO

M10

;переход к исходному состоянию

 

GOTO

M20

;возврат к включению светодиода HL3

;включение пищалки

 

 

M30:

BCF

PORTC,1

;гасим HL3

 

BSF

PORTA,2

;подаем на пищалку импульс длительностью

 

 

 

0,5 мс

 

MOVLW

D'1'

;задаем начальное значение старшего счетчика

 

MOVWF

CNT_H

;|

 

MOVLW

D'1'

;задаем начальное значение среднего счетчика

 

MOVWF

CNT_M

;|

 

MOVLW

D'168'

;задаем начальное значение

 

 

 

;младшего счетчика

 

MOVWF

CNT_L

;|

37

 

CALL

T10

;вызов подпрограммы выдержки времени

 

BCF

PORTA,2

;подаем на пищалку интервал,

 

 

 

;длительностью 0,5 мс

 

MOVLW

D'1'

;задаем начальное значение старшего счетчика

 

MOVWF

CNT_H

;|

 

MOVLW

D'1'

;задаем начальное значение среднего счетчика

 

MOVWF

CNT_M

;|

 

MOVLW

D'168'

;задаем начальное значение

 

 

 

;младшего счетчика

 

MOVWF

CNT_L

;|

 

CALL

T10

;вызов подпрограммы выдержки времени

 

BTFSS

PORTB,4

;скачок, если не нажата кнопкаSA3

 

GOTO

M20

;переход к включению светодиода

 

BTFSS

PORTB,2

;скачок, если не нажата кнопкаSA4

 

GOTO

M10

;переход к исходному состоянию

 

GOTO

M30

;возврат к включению пищалки

;подпрограмма выдержки времени

 

T10:

DECFSZ

CNT_L,F

;уменьшение младшего счетчика

 

 

 

;на 1, скачок, если 0

 

GOTO

T10

;возврат к декременту счетчика

 

DECFSZ

CNT_M,F

;уменьшение среднего счетчика

 

 

 

;на 1, скачок, если 0

 

GOTO

T10

;возврат к декременту счетчика

 

DECFSZ

CNT_H,F

;уменьшение старшего счетчика

 

 

 

;на 1, скачок, если 0

 

GOTO

T10

;возврат к декременту счетчика

 

RETURN

 

;выход из подпрограммы

 

END

 

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

Трансляция текста программы в машинные коды

Процесс создания нового проекта и компиляции программы подробно описан в лабораторной работе 1.

Тестирование и отладка

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

Сопровождение

Поскольку все программы, разрабатываемые при изучении курса ОМТ, носят чисто учебный характер, то их работоспособность необходимо

поддерживать лишь до момента защиты лабораторной работ преподавателю.

38

Содержание отчета

В отчете необходимо привести постановку задачи, блок-схему алгоритма и текст программы на языке Ассемблер с исправлениями, возникшими на этапе отладки.

Контрольные вопросы

1. Что называется мультиплексированием портов ввода/вывода?

2. Какое значение следует записать в регистрTRISB, чтобы настроить вывод 3 порта PORTB как выход?

3.Как организована выдержка времени в предложенном алгоритме? Существуют ли другие способы организации выдержки времени в микроконтроллерах?

4.Каким образом происходит формирование звукового сигнала, подаваемого на пьезоизлучатель?

5.Предположим, микроконтроллер тактируется частотой200КГц.

Какое

максимальное

значение

выдержки

времени

можно

обеспечить, используя один регистр-счетчик?

 

 

39

ЛАБОРАТОРНАЯ РАБОТА 4 Изучение работы последовательных портов

 

 

 

микроконтроллеров PIC-micro

 

 

 

 

Цель

работы:

изучение

работы

и

программирование

последовательных портов микроконтроллера PIC16F873A.

 

 

 

Микроконтроллер PIC16F873A имеет

два последовательных

порта

ввода-вывода: синхронный последовательный порт MSSP и универсальный

синхронно-асинхронный передатчик USART.

 

 

 

 

 

Синхронный

последовательный

портMSSP

предназначен

для

организации

связи

микроконтроллера

с

периферийными

микросхемами

или другими микроконтроллерами. При этом возможно

использование

двух интерфейсов: последовательный периферийный интерфейс SPI, либо

двухпроводная последовательная шина для связи интегральных микросхем

I2C.

Для

соединения

черезSPI

используются

четыре

вывода

микроконтроллера: -SS – выбор ведомого, SCK – тактовый сигнал, SDI –

вход

принимаемых

данных

иSDO – выход

передаваемых

данных. Для

подключения к последовательной шине I2C используются два вывода: SCL

– тактовый сигнал и SDA – данные. В лабораторном макете порт MSSP не задействован.

Универсальный синхронно-асинхронный приемопередатчикUSART предназначен для организации связи микроконтроллера с персональным либо промышленным компьютером по интерфейсамRS-232, RS-422 или RS-485. В лабораторном макете реализован интерфейсRS-232 без аппаратного управления потоком, позволяющий передавать и принимать какую -либо информацию от COM порта персонального компьютера. При этом в схеме задействованы выводы микроконтроллера: TX – выход передаваемых данных иRX – вход принимаемых данных, а также микросхема ILX232N, предназначенная для согласования уровней сигналов

на выводах последовательного порта микроконтроллера и персонального компьютера. Кроме того, к выводам TX и RX через инверторы подключены

светодиоды HL8 и HL9, позволяющие

контролировать наличие

 

сигналов

передачи и приема.

 

 

 

 

 

 

Передача

и

прием

информации

по

интерфейсуRS-232

осуществляются в асинхронном дуплексном режиме.

 

 

 

Для

управления

работой

портов

ввода-вывода

используются

следующие РСН:

TXREG – регистр данных передатчика;

RCREG – регистр данных приемника;

TXSTA – регистр управления и статуса передатчика; RCSTA – регистр управления и статуса приемника; SPBRG – регистр генератора скорости обмена.

40

Если в программе используется обработка прерываний, то дополнительно задействуются регистры:

PIR1 – регистр флагов прерываний периферийных модулей;

PIE1 – регистр масок прерываний периферийных модулей. Назначение отдельных разрядов регистраTXSTA представлено на

рис. 4.1, а RCSTA – на рис. 4.2.

Рис 4.1. Регистр управления и статуса передатчика TXSTA

В асинхронном режиме скорость обмена информацией зависит от коэффициента деления генератора скорости обмена, который задается записью определенного числа в регистрSPBRG и «0» либо «1» в разряд BRHG регистра TXSTA. Если BRHG = 0, то скорость обмена определяется

по формуле VПЕР =

64(X +1) , где FOSC – частота тактового генератора, а X

 

FOSC

число, записанное

в регистр генератора скорости обменаSPBRG. Если

41

BRHG = 1, то скорость обмена определяется по формуле VПЕР

=

16(X +1) .

 

 

 

FOSC

Рис. 4.2. Регистр управления и статуса приемника RCSTA

Структурная схема передатчикаUSART в приведена на рис. 4.3. Основным элементом программно не доступный сдвиговый

асинхронном

режиме

в этой

схеме

является

регистр

передатчикаTSR,

42

осуществляющий преобразование информации из параллельного вида в последовательный. Для загрузки данных в регистрTSR используется буферный регистр специального назначенияTXREG, расположенный в банке 0. После записи данных в регистрTXREG проверяется, что регистр TSR свободен (предыдущая передача завершена) и содержимое регистра

TXREG копируется в

регистрTSR. Освобождение

регистра TXREG для

новой информации

подтверждается установкой «1»в

флага

TXIF в

регистре

PIR1. Если

передача

разрешена записью«1» в

разряд TXEN

регистра

TXSTA, то

на вход синхронизации регистраTSR начинают

поступать

импульсы

от

генератора

скорости ,

которыеобмена

осуществляют сдвиг информации вTSR от старших разрядов к младшим. Из нулевого разряда регистраTSR данные поступают через буферную схему на вывод TX.

Скорость передачи зависит от коэффициента деления генератора скорости обмена, который задается записью определенного числа в регистр

SPBRG и «0» либо «1» в разряд BRHG регистра TXSTA.

Рис. 4.3. Структурная схема передатчика USART

В дополнение к восьми разрядам, копируемым из регистра TXREG, может передаваться девятый разряд, обыкновенно используемый для обнаружения ошибок при передаче путем проверки на четность. Если разряд TX9 регистра TXSTA сброшен, то девятый разряд не передается, если взведен, то передается. Значение же самого девятого разряда задается программно, записью «0» или «1» в разряд TX9D регистра TXSTA. Кроме

того,

к передаваемому байту информации автоматически

в начале

добавляется нулевой стартовый бит, а в конце– единичный стоповый.

После

окончания передачи и освобождения регистраTSR взводится

флаг

43

TRMT регистра TXSTA. Работа USART может быть полностью запрещена записью «0» в разряд SPEN регистра RCSTA.

Для передачи одного информации черезUSART необходимо выполнить следующую последовательность действий:

установить требуемую скорость передачи с помощью регистра

SPBRG и бита BRHG в регистре TXSTA;

выбрать асинхронный режим сбросом битаSYNC в «0» и установкой бита SPEN в «1»;

если необходимо, разрешить прерывания установкой битаTXIE в регистре PIE1 в «1» (биты GIE и PEIE в регистре INTCON также должны быть установлены в «1»);

если передача 9-разрядная, установить бит TX9 в «1» и записать 9-

йбит данных в TX9D;

разрешить передачу установкой бита TXEN в «1»;

записать данные в регистр TXREG;

Структурная схема приемникаUSART в асинхронном режиме приведена на рис. 4.4.

 

Рис. 4.4. Структурная схема приемника USART

В

этой

схеме

главным

является

сдвиговый RSR,регистр

осуществляющий преобразование последовательного кода, поступающего

на вход

приемника, в параллельный.

Работа приемника так же, как и

44

передатчика разрешается либо запрещается записью, соответственно, «1» или «0» в разряд SPEN регистра RCSTA, а также установкой либо сбросом разряда CREN регистра RCSTA. Если прием разрешен, то сигнал с входа RX попадает на мажоритарный детектор, назначение которого – с максимальной достоверностью определить логический уровень сигнала, поступающего в данном импульсе. Далее последовательный код поступает

на вход сдвигового регистраRSR. На вход синхронизации этого же регистра поступают тактовые импульсы от генератора скорости обмена. Частота следования данных импульсов равна частоте синхронизации передатчика (скорость приема и передачи одинаковы).

После поступления стопового импульса и заполнения регистраRSR, байт данных копируется в двухуровневый буфер приемника, построенный по принципу «первым пришел – первым вышел» FIFO, но только в том случае, если он заполнен не полностью. Считать данные из буфера можно, обратившись к РСНRCREG (чтобы считать оба байта, необходимо команду считывания повторить). Девятый бит копируется в разрядRX9D регистра RCSTA, но только в том случае, если это разрешено записью «1» в разряд RX9 этого же регистра.

Окончание приема информации приводит к установке в единичное значение флага RCIF в регистре PIR1 и генерации запроса прерывания, если это прерывание было разрешено записью«1» в разряд RCIE регистра

PIE1.

При наличии помех в линии связи возможно нарушение правильной работы приемника. В микроконтроллере PIC16 детектируются всего два вида ошибок: ошибка кадра и переполнение буфераFIFO. Ошибка кадра возникает при потере стартового или стопового импульсов, недостоверная информация из регистраRSR не копируется, но взводится флагFERR в регистре RCSTA. Переполнение буфера FIFO может произойти, если предыдущая информация не была из него вовремя считана. Тогда данные, находящиеся в регистре RSR, будут потеряны, но взведется флаг OERR в регистре RCSTA.

Рекомендуемые действия при приеме данных в асинхронном режиме:

установить требуемую скорость передачи с помощью регистра

SPBRG и бита BRHG в регистре TXSTA;

выбрать асинхронный режим сбросом битаSYNC в «0» и установкой бита SPEN в «1»;

если необходимо, разрешить прерывания установкой битаRCIE в регистре PIE1 в «1» (биты GIE и PEIE в регистре INTCON также должны быть установлены в «1»);

если прием 9-разрядный, установить бит RX9 в «1»;

разрешить прием установкой бита CREN в «1»;

ожидать установку битаRCIF, или прерывание, если оно было разрешено;

45

проверить флаги ошибок и, если прием 9-разрядный, считать 9-й разряд из бита RX9D;

считать 8 бит данных из регистра RCREG;

при возникновении ошибки переполнения буфераFIFO сбросить

бит RCEN в «0».

Для работы с последовательным портом персонального компьютера можно воспользоваться программойHyper Terminal, входящей в состав операционной системы Windows. При этом в свойствахCOM порта необходимо указать: скорость (бит/с): 19200, биты данных: 8, четность: нет, стоповые биты: 1, управление потоком: нет.

Порядок выполнения работы

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

Вкачестве примера рассмотрим следующее задание. В исходном состоянии все светодиоды погашены, передача по USART отсутствует. После ввода в Hyher Terminalе номера светодиода (с первого по шестой) загорается соответствующий светодиод (с HL1 по HL6) на печатной плате макета. При вводе цифры«ноль» все светодиоды гаснут. При нажатии одной из кнопок сSA2 по SA6 на печатной плате в окне Hyher Terminalа высвечивается ее номер.

Постановка задачи

Представим исходную словесную форму в виде таблиц.

Таблица 4.1

Включение светодиодов

Принимаемые символы

HL1

HL2

HL3

HL4

HL5

HL6

 

 

 

 

 

 

 

1

1

~

~

~

~

~

 

 

 

 

 

 

 

2

~

1

~

~

~

~

 

 

 

 

 

 

 

3

~

~

1

~

~

~

 

 

 

 

 

 

 

4

~

~

~

1

~

~

 

 

 

 

 

 

 

5

~

~

~

~

1

~

 

 

 

 

 

 

 

6

~

~

~

~

~

1

 

 

 

 

 

 

 

0

0

0

0

0

0

0

 

 

 

 

 

 

 

Любой другой символ

~

~

~

~

~

~

 

 

 

 

 

 

 

46

 

 

 

 

 

Таблица 4.2

 

 

 

Передаваемые символы

 

 

 

 

 

 

SA2

SA3

SA4

SA5

SA6

Передаваемые символы

 

 

 

 

 

 

1

1

1

1

1

-

 

 

 

 

 

 

0

1

1

1

1

2

 

 

 

 

 

 

1

0

1

1

1

3

 

 

 

 

 

 

1

1

0

1

1

4

 

 

 

 

 

 

1

1

1

0

1

5

 

 

 

 

 

 

1

1

1

1

0

6

 

 

 

 

 

 

 

Разработка алгоритма программы

 

 

 

 

Укрупненный алгоритм основной программы приведен на рис. 4.5.

 

Алгоритм подпрограммы передачи символа приведен

на.

4рис.6,

а

 

драйвера прерываний от приемника на рис. 4.7.

 

 

 

 

В первом

блоке

алгоритма

подключается

текстовый

файл

с

символьными

обозначениями

. РСНПрисваиваются

символьные

 

наименования трем регистрам общего назначения, первый из которых

 

предназначен для хранения принятого символа, а еще два для организации

 

программного стека.

 

 

 

 

 

 

 

Порты А и С, к которым подключены светодиоды, настраиваются на

 

вывод информации, а порт В, к которому подключены контакты кнопок, –

 

на ввод. К выводам порта В подключаются внутренние подтягивающие

 

резисторы.

 

 

 

 

 

 

 

 

Разрешается

прерывание

от

приемникаUSART.

 

USART

 

настраивается на высокоскоростной асинхронный режим

работы со

 

скоростью передачи 19200 бит/с.

 

 

 

 

 

 

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

Вблоках с двенадцатого по двадцать пятый анализируется принятая через USART информация. При обнаружении символа соответствующего цифрам от 1-го до 6-ти осуществляется включение соответствующего светодиода, а при обнаружении символа «0» – гашение всех светодиодов.

Далее программа возвращается к опросу состояния кнопок.

47

Рис. 4.5. Блок-схема алгоритма основной программы

Рис. 4.6. Блок-схема алгоритма подпрограммы передачи символа

48

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

Рис. 4.7. Блок-схема алгоритма драйвера прерываний

Обработка

прерываний, вызываемых

приемником USART,

производится в

блоках с тридцатого по тридцать третий. В тридцать

первом блоке

проверяется отсутствие ошибок, если ошибок нет, то

принятый символ сохраняется в ОЗУ, если есть ошибки, то принятый символ игнорируется.

Необходимо обратить внимание на то, что в подпрограмме драйвера прерываний изменяется содержимое рабочего регистраW и флагов признаков, располагающихся в регистреSTATUS. Поскольку вызов прерывания происходит в произвольный момент времени, такое изменение может вызвать сбой в работе основной программы. Для предотвращения этого содержимое регистровW и STATUS в начале обработчика прерываний сохраняется в ОЗУ, а в конце считывается обратно.

Написание текста программы на языке Ассемблер

Исходный текст программы приведен далее:

;предварительные настройки

 

 

#include

p16f873a.inc

 

 

__CONFIG

_HS_OSC

;

RCV_S:

SET

H'20'

;принятый символ

STEK_0:

SET

H'21'

;программный стек данных

STEK_1:

SET

H'22'

;|

 

ORG

H'000'

;вектор сброса

 

GOTO

BEGIN

;переход на начало основной программы

 

ORG

H'004'

;вектор прерывания

49

 

GOTO

INT

;переход к обработчику прерываний

;начало основной программы

 

BEGIN:

BCF

STATUS,RP1 ;выбираем банк регистров 1

 

BSF

STATUS,RP0 ;|

;задаем режимы работы параллельных портов

 

MOVLW

B'00001110'

;задаем аналоговый входPORTA,0

 

MOVWF

ADCON1

;программируем регистр АЦП1

 

MOVLW

B'00000001'

;PORTA, 7-1 выходы, PORTA, 0 вход

 

MOVWF

TRISA

;программируем регистр направления PORTA

 

MOVWF

OPTION_REG;включаем подтягивающие резисторы PORTB

 

MOVLW

B'11111111'

;PORTB, 7-0 входы

 

MOVWF

TRISB

;программируем регистр направления PORTB

 

MOVLW

B'10000000'

;PORTC, 7 вход, PORTC, 6-0 выходы

 

MOVWF

TRISC

;программируем регистр направления PORTC

;разрешаем прерывания от приемника USART

 

MOVLW

B'11000000'

;биты GIE и PEIE = 1

 

MOVWF

INTCON

;программируем регистр

 

 

 

;управления прерываниями

 

BSF

PIE1,RCIE

;разрешение прерываний

 

 

 

;от приемника USART

;задаем режим работы последовательного порта

 

MOVLW

D'12'

;скорость передачи по USART 19200

 

MOVWF

SPBRG

;программируем регистр скорости обмена

 

MOVLW

B'00100100'

;разрешение передачи, высокоскоростной

 

 

 

;асинхронный режим

 

MOVWF

TXSTA

;программируем регистр статуса передатчика

 

BCF

STATUS,RP1

;выбираем банк регистров 0

 

BCF

STATUS,RP0 ;|

 

MOVLW

B'10010000'

;включение USART, разрешение приема

 

MOVWF

RCSTA

;программируем регистр статуса приемника

;проверка кнопок и передача символов

 

M10:

BCF

STATUS,RP1 ;выбираем банк регистров 0

 

BCF

STATUS,RP0 ;|

 

BTFSC

PORTB,5

;скачок, если нажата кнопкаSA2

 

GOTO

M20

;переход к опросу SA3

 

MOVLW

A'2'

;загружаем в аккумулятор ASCII символ "2"

 

CALL

TSMIT

;вызов подпрограммы передачи посылки

M20:

BTFSC

PORTB,4

;скачок, если нажата кнопкаSA3

 

GOTO

M30

;переход к опросу SA4

 

MOVLW

A'3'

;загружаем в аккумулятор ASCII символ "3"

 

CALL

TSMIT

;вызов подпрограммы передачи посылки

M30:

BTFSC

PORTB,2

;скачок, если нажата кнопкаSA4

 

GOTO

M40

;переход к опросу SA5

 

MOVLW

A'4'

;загружаем в аккумулятор ASCII символ "4"

 

CALL

TSMIT

;вызов подпрограммы передачи посылки

M40:

BTFSC

PORTB,1

;скачок, если нажата кнопкаSA5

 

GOTO

M50

;переход к опросу SA6

 

MOVLW

A'5'

;загружаем в аккумулятор ASCII символ "5"

 

CALL

TSMIT

;вызов подпрограммы передачи посылки

M50:

BTFSC

PORTB,0

;скачок, если нажата кнопкаSA6

50

 

GOTO

M60

;переход к ожиданию и приему посылок

 

MOVLW

A'6'

;загружаем в аккумулятор ASCII символ "6"

 

CALL

TSMIT

;вызов подпрограммы передачи посылки

;ожидание и прием символа

 

M60:

MOVLW

A'1'

;1 сравниваем

 

XORWF

RCV_S,W

;с принятым символом

 

BTFSC

STATUS,Z

;скачок, если не равно

 

BSF

PORTA,5

;включаем HL1

 

MOVLW

A'2'

;2 сравниваем

 

XORWF

RCV_S,W

;с принятым символом

 

BTFSC

STATUS,Z

;скачок, если не равно

 

BSF

PORTC,0

;включаем HL2

 

MOVLW

A'3'

;3 сравниваем

 

XORWF

RCV_S,W

;с принятым символом

 

BTFSC

STATUS,Z

;скачок, если не равно

 

BSF

PORTC,1

;включаем HL3

 

MOVLW

A'4'

;4 сравниваем

 

XORWF

RCV_S,W

;с принятым символом

 

BTFSC

STATUS,Z

;скачок, если не равно

 

BSF

PORTC,3

;включаем HL4

 

MOVLW

A'5'

;5 сравниваем

 

XORWF

RCV_S,W

;с принятым символом

 

BTFSC

STATUS,Z

;скачок, если не равно

 

BSF

PORTC,4

;включаем HL5

 

MOVLW

A'6'

;6 сравниваем

 

XORWF

RCV_S,W

;с принятым символом

 

BTFSC

STATUS,Z

;скачок, если не равно

 

BSF

PORTC,5

;включаем HL6

 

MOVLW

A'0'

;0 сравниваем

 

XORWF

RCV_S,W

;с принятым символом

 

BTFSS

STATUS,Z

;скачок, если равно

 

GOTO

M10

;возврат к началу программы если нет

 

BCF

PORTA,5

;гасим HL1

 

CLRF

PORTC

;гасим остальные светодиоды

 

GOTO

M10

;возврат к началу программы если нет

;подпрограмма передачи символа

 

TSMIT:

MOVWF

TXREG

;инициируем передачу

 

NOP

 

 

T10:

BTFSS

PIR1,TXIF

;скачок, если буфер освободился

 

GOTO

T10

;иначе, ждем освобождения буфера

 

BCF

PIR1,TXIF

;сброс флага освобождения буфера

 

RETURN

 

;возврат в основную программу

;драйвер прерываний от приемника USART

INT:

MOVWF

STEK_0

;сохраняем аккумулятор в ОЗУ

 

MOVF

STATUS,W

;сохраняем регистр статуса в ОЗУ

 

MOVWF

STEK_1

;|

 

BTFSC

RCSTA,OERR;проверка ошибки переполнения буфера

 

GOTO

I10

;переход, если есть ошибка

 

BTFSC

RCSTA,FERR;проверка ошибки кадра

 

GOTO

I20

;переход, если есть ошибка

51

 

MOVF

RCREG,W

;считываем принятый символ

 

MOVWF

RCV_S

;и сохраняем его в ОЗУ

 

GOTO

I30

;переход к выходу из драйвера прерывания

I10:

MOVF

RCREG,W

;очистка буфера

 

MOVF

RCREG,W

;|

 

GOTO

I30

;переход к выходу из драйвера прерывания

I20:

BCF

RCSTA,CREN;сброс флага ошибки кадра

 

BSF

RCSTA,CREN;|

I30:

MOVF

STEK_1,W

;извлекаем регистр статуса из ОЗУ

 

MOVWF

STATUS

;|

 

MOVF

STEK_0,W

;извлекаем аккумулятор из ОЗУ

 

RETFIE

 

;возврат в основную программу

 

END

 

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

52

Трансляция текста программы в машинные коды

Процесс создания нового проекта и компиляции программы подробно описаны в лабораторной работе 1.

Тестирование и отладка

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

Сопровождение

Поскольку все программы, разрабатываемые при изучении курса ОМТ, носят чисто учебный характер, то их работоспособность необходимо

поддерживать лишь до момента защиты лабораторной работ преподавателю.

Содержание отчета

В отчете необходимо привести постановку задачи, блок-схему алгоритма и текст программы на языке Ассемблер с исправлениями, возникшими на этапе отладки.

Контрольные вопросы

1.Какие преимущества имеет последовательная организация порта ввода/вывода перед параллельной; параллельная перед последовательной?

2.* Как видно из лабораторной работы, передача информации по последовательному интерфейсу заметно сложн, чеем по параллельному. Чем вы это объясните?

53

ЛАБОРАТОРНАЯ РАБОТА 5

Изучение работы таймеров микроконтроллеров PIC-micro

Цель работы: изучение работы и программирование таймеров микроконтроллера PIC16F873A.

Микроконтроллер PIC16F873A имеет четыре таймера TMR0, TMR1, TMR2 и WDT.

Таймер TMR0 представляет из себя 8-разрядный счетчик импульсов с 8-разрядным предделителем. В качестве источника счетных импульсов

может

выступать

внутренний

тактовый

генератор

микроконтроллера,

период следования этих импульсов равен длительности машинного цикла

(FOSC/4),

либо

внешний

сигнал, подаваемый

на выводRA4/T0CKI

микроконтроллера. Максимальная

 

выдержка

времени, которую

можно

сформировать

при

помощи

 

таймераTMR0

без

использования

предделителя, равна 256 периодам счетных импульсов, а с использованием

предделителя –

65

536.

Еще

одной

особенностьюTMR0

является

совместное использование предделителя со сторожевым таймером WDT.

 

Управление работой таймера осуществляется с помощью шести

разрядов регистра OPTION_REG: бит T0SC осуществляет выбор источника

счетных

импульсов,

бит T0SE

– выбор

переднего

или

заднего

фронта

внешних

счетных

импульсов, бит PSA определяет

использование

предделителя TMR0 либо WDT, три

бита PS0...PS2 задают

коэффициент

деления

предделителя.

Значения

 

 

конкретных

разрядов

регистра

OPTION_REG приведены на рис. 5.1.

 

 

 

 

 

 

 

 

 

Структурная схема таймера TMR0 приведена на рис. 5.2. Она состоит

из

регистра-счетчика TMR0,

доступного для

записи

и

считывания

информации

как

регистр

 

специального

назначения, 8-разрядного

предделителя, который программно не доступен, пяти мультиплексоров

MUX, узла

синхронизации

 

внешних

счетных

импульсовSYNC,

сторожевого таймера WDT и логического элемента Исключающее ИЛИ.

 

Схема может работать в четырех режимах:

 

 

 

 

 

 

счетчик

импульсов

внутреннего

тактового

генератора без

предделителя. Для перехода в этот режим битT0SC сбрасывается в «0», а

PSA

взводится

в

«1».

Импульсы

CLKOUT

внутреннего

тактового

генератора проходят через два мультиплексора и узел синхронизации и поступают на вход регистра-счетчикаTMR0. Длительность временного интервала T, формируемого таймером, определяется по формуле: T = 28-N,

где N – число, записанное в регистр TMR0. После переполнения счетчика,

т. е. при

переходе

его значения

изH'FF' в H'00',

взводится флаг T0IF в

регистре

INTCON

и

вызывается

прерывание, если оно разрешено

установкой в «1»

битов

GIE и

T0IE

регистра

INTCON. Необходимо

учитывать, что далее счетчик продолжит счет со значенияH'00' (выдержка

54

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

Рис. 5.1. Регистр OPTION_REG

счетчик импульсов внутреннего тактового генератора с предделителем. Для перехода в данный режим необходимо сбросить в«0»

бит PSA. При этом импульсыCLKOUT сначала поступают на вход8разрядного предделителя, а уже с его выхода на вход регистра-счетчика TMR0. Коэффициент пересчета предделителя задается битамиPS0...PS2.

Длительность временного интервалаT, формируемого таймером, определяется по формуле: T = K(28-N), где K – коэффициент деления предделителя, а N – число, записанное в регистр TMR0. При применении предделителя увеличивается дискретность формирования временного интервала, она равна коэффициенту пересчета предделителя. В остальном работа таймера не отличается от его работы в первом режиме;

счетчик внешних тактовых импульсов без предделителя. Для перехода в этот режим битыT0SC и PSA взводятся в «1». Импульсы с вывода T0CKI микроконтроллера поступают на вход логического элемента

55

«Исключающее ИЛИ». При состояния бита T0SE=0 эти импульсы проходят через него без инверсии и переключение счетчикаTMR0 в очередное состояние происходит по переднему фронту счетных импульсов, а при T0SE=1 счетные импульсы инвертируются и срабатывание счетчика происходит по заднему фронту. Далее счетные импульсы проходят через

два мультиплексора и

попадают на вход схемы синхронизации, где

происходит их стробирование во втором и четвертом машинных тактах.

Таким образом, частота

следования счетных импульсов должна быть

меньше FOSC/2. В остальном работа таймера аналогична первому режиму;

 

 

Рис. 5.2. Структурная схема таймера TMR0

 

 

 

счетчик внешних тактовых импульсов с предделителем. Для перехода

 

в этот режим бит T0SC взводится в «1», а PSA сбрасывается в «0». Работа

 

предделителя в этом режиме аналогична режиму2, а

работа

самого

 

счетчика – режиму 3.

 

 

 

 

 

 

 

 

 

 

 

Таймер

TMR1

является 16-разрядным

счетчиком

импульсов

3с-

 

разрядным

предделителем.

Особенностью

данного

таймера

является

 

возможность

работы

от

отдельного

низкочастотного

кварцевого

резонатора, подключаемого к выводам T1OSO и T1OSI микроконтроллера,

 

а

также

возможность

 

 

отключения

узла

.

синхро

Вышеперечисленные

особенности

обеспечивают

работоспособность

56

таймера TMR1 в режиме микропотребления(SLEEP). Максимальная выдержка времени, которую можно сформировать при помощи таймера TMR1 без использования предделителя равна65 536 периодам счетных импульсов, а с использованием предделителя – 524 288.

Управление работой таймера осуществляется с помощью регистра специального назначения T1CON: бит TMR1ON включает таймер TMR1, бит TMR1CS задает источник счетных импульсов(счетный вход или тактовый генератор микроконтроллера), бит -T1SYNC включает или выключает узел синхронизации, бит T1OSCEN осуществляет включение внутреннего тактового генератора таймераTMR1, а биты T1CKPS0 и T1CKPS1 задают коэффициент деления входного предделителя. Конкретные значения разрядов регистра T1CON приведены на рис. 5.3.

Рис. 5.3. Регистр управления таймера 1 T1CON

Структурная схема таймера TMR1 приведена на рис. 5.4. Она состоит

из 16-разрядного регистра-счетчика TMR1, доступного для записи и считывания информации через два регистра специального назначения–

57

TMR1H и TMR1L, 3-разрядного предделителя, который программно не доступен, двух мультиплексоров, узла синхронизации внешних счетных импульсов, логического элемента ,Итриггера Шмитта и инвертора, выполняющего роль генератора тактовых импульсов.

Схема может работать в трех режимах.

Счетчик импульсов внутреннего тактового генератора. Для перехода

в этот режим необходимо

взвести «1»в бит TMR1ON, а

бит TMR1SC

сбросить

в «0». Импульсы

внутреннего тактового

генератора

частотой

FOSC/4 проходят через мультиплексор, предделитель, узел синхронизации,

второй

мультиплексор, логический

элемент

И и

поступают

на вход

регистра-счетчика TMR0.

Длительность

временного

интервалаT,

формируемого таймером, определяется по формуле: T = K(216-N), где K

коэффициент деления предделителя, а N – 16-разрядное число, записанное

в регистры TMR1H и TMR1L. После

переполнения

счетчика, т. е. при

переходе

его значения изH'FFFF' в H'0000', взводится флаг TMR1IF в

регистре PIR1 и вызывается прерывание, если оно разрешено установкой в «1» битов GIE и T0IE регистра INTCON и бита TMR1IE в регистре PIE1. Аналогично таймеру TMR0 выдержка времени формируется однократно, т. е. для повторного запуска таймера TMR1 в регистры TMR1H и TMR1L необходимо программно загрузить расчетное значение.

Рис 5.4. Структурная схема таймера TMR1

Счетчик внешних тактовых импульсов. Для перехода в этот режим биты TMR1ON и TMR1CS взводятся в «1», а бит T1OSCEN сбрасывается в «0». Импульсы с вывода T1CKI микроконтроллера через триггер Шмитта и мультиплексор поступают на вход предделителя. Далее счетные импульсы

поступают

на

вход

узла

синхронизации. В

рабочем

 

режиме

микроконтроллера, когда включен

его тактовый

генератор, внешние

счетные

импульсы

можно

синхронизировать

вторым

и

четвертым

машинным

тактом

микроконтроллера(аналогично таймеру TMR0),

для

58

этого

бит -T1SYNC сбрасывается

в «0».

Перед

переходом

в

режим

микропотребления (команда SLEEP) узел

синхронизации

необходимо

отключить, для этого бит -T1SYNC взводится в «1». В остальном работа

таймера аналогична первому режиму.

 

 

 

 

 

Счетчик

импульсов встроенного

тактового генератора

таймера

TMR1.

Таймер

TMR1 имеет

собственный

генератор

импульсов,

построенный на инверторе и низкочастотном кварцевом резонаторе,

подключаемом

к выводамT1OSO и T1OSI микроконтроллера. Данный

генератор не выключается при переходе микроконтроллера в режим микропотребления. Частота кварцевого резонатора не должна превышать 200 кГц, стандартное значение для«часового» кварцевого резонатора составляет 32 768 Гц. Для перехода в этот режим биты TMR1ON, TMR1CS

иT1OSCEN взводятся в «1». В остальном работа таймера аналогична второму режиму, в частности таймер также может продолжать свою работу

ив спящем режиме.

Таймер

TMR2 является

8-разрядным счетчиком импульсов

4с-

разрядным

предделителем

4и-разрядным

выходным

делителем.

Особенностью

данного

счетчика

является

возможность

генерации

бесконечной

последовательности

временных

интервалов

заданной

длительности

(программная

перезагрузка

счетчика

не

требуется).

Максимальная выдержка времени, которую можно сформировать при помощи таймера TMR1 без использования делителей, равна 256 периодам счетных импульсов, а с использованием делителей – 65 536.

Управление работой таймера осуществляется с помощью регистра специального назначения T2CON: бит TMR2ON включает таймер TMR2,

биты T2CKPS0

и T2CKPS1 задают коэффициент

деления

входного

предделителя, а

биты TOUTPS0...TOUTPS3 – коэффициент

деления

выходного делителя. Конкретные значения разрядов

регистра T2CON

приведены на рис. 5.5.

 

 

59

Рис. 5.5. Регистр управления таймера 2 T2CON

Структурная схема таймера TMR2 приведена на рис. 5.6. Она состоит

из 8-разрядного регистра-счетчика TMR2,

доступного

для

записи и

считывания

информации

как

регистр

специального

назначения, 4-

разрядного

предделителя 4-разрядного

выходного

делителя(программно

не доступны), регистра периода PR2 и схемы сравнения.

 

 

Работает схема следующим образом. Перед включением таймера

установкой

в «1» бита TMR2ON необходимо

записать в

регистр

периода

PR2 число импульсов, которые будет отсчитывать таймер в каждом цикле.

Импульсы

внутреннего тактового генератора частотойFOSC/4 проходят

через предделитель и поступают на вход регистра-счетчикаTMR2. При

достижении

равенства содержимого

регистра

периодаPR2 и

счетчика

TMR2 на выходе схемы сравнения вырабатывается сигналEQ, который сбрасывает счетчик в состояниеH'00' и процесс заполнения счетчика начинается заново. Через выходной делитель импульсыEQ поступают на выход таймера и взводят флагTMR2IF в регистре PIR1. Флаг TMR2IF может инициировать вызов прерывания, если оно разрешено установкой в «1» битов GIE и T0IE регистра INTCON и бита TMR2IE в регистре PIE1. Длительность временного интервалаT, формируемого таймером, определяется по формуле: T = K1·P·K2, где K1 – коэффициент деления предделителя, P – число, записанное в регистр периодаPR2, K2 – коэффициент деления выходного делителя.

60

 

Рис 5.6. Структурная схема таймера TMR2

 

 

Сторожевой

таймер WDT

предназначен

для

 

сброса

микроконтроллера в случае программного сбоя (зависание, зацикливание и

 

т. д.). При нормальной работе программы сторожевой таймер сбрасывается

 

командой CLRWDT, выполняемой с интервалом, не превышающим период

 

переполнения

сторожевого

таймера. В

случае

программного

сбоя

сторожевой

таймер

переполняется

и

вырабатывает

сигнал

сброса

микроконтроллера, при этом выполнение программы начнется с адреса

вектора сброса H'000'.

 

 

 

 

 

 

 

Сторожевой таймер получает тактовые импульсы от отдельного

встроенного RC генератора, что обеспечивает его работу даже в режиме

микропотребления

(SLEEP).

Включение

сторожевого

таймера

производится установкой в «1» разряда WDTE в конфигурационной ячейке

 

2007. Период переполнения сторожевого таймера зависит от напряжения

питания микроконтроллера, температуры

и

технологического

разброса

параметров времязадающей RC цепи и составляет от7 до 33 мс. Период переполнения может быть увеличен 128до раз путем подключения выходного делителя, используемого совместно с таймером TMR0 (см. рис. 5.2). При этом бит PSA в регистре OPTION_REG взводится в «1», а биты PS0...PS2 задают коэффициент пересчета делителя.

Порядок выполнения работы

Вданной лабораторной работе необходимо разработать и отладить программу, формирующую временные интервалы при помощи таймеров микроконтроллера. Конкретное задание выдается преподавателем.

Вкачестве примера рассмотрим следующее задание. В исходном состоянии звуковой сигнал отсутствует. При нажатии на кнопкуSA6 включается прерывистый зуммер с частотой сигнала2 кГц и периодом звучания 1 с. При повторном нажатии на кнопку SA6 звук прекращается.

61

Постановка задачи

Исходную словесную форму задания можно представить в виде графа переходов (рис. 5.7), аналогично лабораторной работе 3.

 

Рис. 5.7. Граф переходов по программе

 

 

 

Как видно из рисунка, имеется всего два состояния программы и два

 

перехода между ними. Единственную сложность представляет ,точто

 

переходы происходят по нажатию одной и той же кнопки, а как известно,

 

замыкание

контактов

происходит

не

мгновенно

и

сопровождается

явлением,

называемым «дребезгом», т. е. многократным

замыканием и

 

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

 

каком из

состояний окажется программа после очередного нажатия на

 

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

 

способов,

самым

простым

является

проверка

 

замкнутого

либо

разомкнутого состояния контактов на протяжении определенного времени.

 

В большинстве случаев это время не превышает 50 мс.

 

 

 

Разработка алгоритма программы

Алгоритм основной программы приведен на рис. 5.8, а алгоритм драйвера прерываний – на рис. 5.9.

Рис. 5.8. Блок-схема алгоритма основной программы

62

Рис. 5.9. Блок-схема алгоритма обработчика прерываний

63

В

данной

программе

используются

все

три

т

микроконтроллера PIC16F873A. TMR0 формирует

выдержку 50 мс

для

 

 

защиты

от дребезга контактов кнопки, TMR1

формирует выдержку

 

 

времени длительностью пол периода звучания зуммера, т. е. 0,5 с. TMR2

 

 

формирует выдержку времени, равную половине периода частоты 2 кГц.

 

 

В

первом

блоке

алгоритма

подключается

текстовый

файл

с

символьными обозначениями РСН.

 

 

 

 

 

 

Порт А, к которому подключен звукоизлучательBZ1, настраивается

 

 

на вывод информации, а порт В, к которому подключены контакты кнопок,

 

 

– на ввод. К выводам порта В подключаются внутренние подтягивающие

 

резисторы.

 

 

 

 

 

 

 

 

Разрешаются прерывания от таймеров, а также от внешнего входа

 

запроса

прерываний INT, к

которому подключена

кнопкаSA6. Таймеры

 

 

настраиваются на соответствующие режимы работы и выдержки времени.

 

 

Во втором блоке программа ожидает вызов прерываний от одного из

 

 

разрешенных источников.

 

 

 

 

 

 

 

Вся остальная обработка происходит в драйвере прерываний.

 

 

 

После вызова

прерывания(блок 3)

необходимо

опросить

флаги

 

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

Вблоке 4 проверяется флаг прерывания от таймера TMR0. Если флаг сброшен, то программа переходит к опросу флага прерывания от таймера TMR1. Если флаг прерывания от таймераTMR0 взведен, то проверяется состояние кнопки SA6 (блок 5), если она отпущена, то это значит, что либо дребезг контактов еще не закончился, либо дребезг контактов возник при отпускании кнопки. В данном случае программа переходит к опросу флага прерывания от таймераTMR1. Если контакты кнопки замкнуты, то программа переходит к проверке состояния таймераTMR1 (блок 6). Если таймер выключен, то он настраивается на выдержку времени0,5с и включается (блок 7), настраивается на выдержку времени250мкс и включается таймер TMR2, формирующий звуковой сигнал (блок 9). Если таймер TMR1 уже был включен, то оба таймера(TMR1 и TMR2) выключаются (блоки 8 и 10) и звуковой сигнал прекращается.

Вблоке 11 проверяется флаг прерывания от таймераTMR1. Если флаг сброшен, то программа переходит к опросу флага прерывания от таймера TMR2. Если же флаг прерывания от таймераTMR1 взведен, то проверяется состояние таймераTMR2 (блок 12). Во время звукового импульса таймер TMR2 настраивается на выдержку времени250 мкс и включается (блок 13), а во время интервала выключается (блок 14).

Вблоке 15 проверяется флаг прерывания от таймераTMR2. Если он сброшен, то программа переходит к проверке прерывания от внешнего источника (кнопка SA6). Если флаг прерывания от таймера TMR2 взведен,

64

то проверяется текущее состояние второго разряда порта А (блок 16)

и изменение его на противоположное (блоки 17 и 18).

 

 

 

В

блоке 19 проверяется

флаг прерывания

от

внешнего

источника

INTF. Если флаг сброшен, то программа выходит из драйвера прерываний

(блок 21), если флаг взведен(произошло замыкание контактов кнопки

SA6), то

таймер TMR0 настраивается на выдержку

времени50 мс и

включается (блок 20). Далее

программа

выходит

из

обработчика

прерываний в основную программу до возникновения

следующего

прерывания.

 

 

 

 

 

Написание текста программы на языке Ассемблер

Исходный текст программы приведен далее:

;предварительные настройки

 

 

#include p16f873a.inc

 

 

__CONFIG _HS_OSC

;высокочастотный кварцевый резонатор

 

ORG

H'000'

;вектор сброса

 

GOTO

BEGIN

;переход на начало основной программы

 

ORG

H'004'

;вектор прерывания

 

GOTO

INT

;переход к обработчику прерываний

;начало основной программы

 

BEGIN:

BSF

STATUS,RP0 ;выбираем банк регистров 1

;задаем режимы работы параллельных портов

 

MOVLW

B'00001110'

;задаем аналоговый входPORTA,0

 

MOVWF

ADCON1

;программируем регистр АЦП1

 

MOVLW

B'00000001'

;PORTA, 7-1 выходы, PORTA, 0 вход

 

MOVWF

TRISA

;программируем регистр направления PORTA

 

MOVWF

OPTION_REG;включаем подтягивающие резисторы PORTB

 

MOVLW

B'11111111'

;PORTB, 7-0 входы

 

MOVWF

TRISB

;программируем регистр направления PORTB

;задаем режим работы таймера TMR0

 

MOVLW

B'00100111'

;коэфф. деления предделителя1:256

 

MOVWF

OPTION_REG;|

 

BCF

STATUS,RP0 ;выбираем банк регистров 0

 

MOVLW

D'60'

;задаем выдержку времени 256*(256-

60)=50176мкс

 

 

 

MOVWF

TMR0

;|

;задаем режим работы таймера TMR1

 

MOVLW

B'00110000'

;коэфф. деления предделителя 1:8

 

MOVWF

T1CON

;|

 

MOVLW

H'0B'

;задаем выдержку времени

 

 

 

;8*(65536-3036)=500000

 

MOVWF

TMR1H

;|

 

MOVLW

H'DC'

;|

 

MOVWF

TMR1L

;|

;задаем режим работы таймера TMR2

65

 

MOVLW

B'00000000'

;коэфф. деления делителей1:1

 

MOVWF

T2CON

;|

 

BSF

STATUS,RP0

;выбираем банк регистров 1

 

MOVLW

D'250'

;задаем период таймера 2

 

MOVWF

PR2

;|

 

;разрешаем прерывания от таймеров и входа INT

 

MOVLW

B'11110000'

;биты GIE, PEIE, T0IE и INTE = 1

 

MOVWF

INTCON

;программируем регистр управления

 

 

 

;прерываниями

 

BSF

PIE1,TMR1IE;разрешение прерываний от таймера 1

 

BSF

PIE1,TMR2IE;разрешение прерываний от таймера 2

;основная программа

 

 

M10:

GOTO

M10

;зацикливаемся здесь

;драйвер прерываний от таймеров и внешнего входа

INT:

BCF

STATUS,RP0 ;выбираем банк регистров 0

 

BTFSS

INTCON,T0IF;проверка флага прерывания от таймера 0

1

GOTO

I20

;переход к проверке флага прерыв. от таймера

BCF

INTCON,T0IF;сброс флага прерывания от таймера 0

 

 

BSF

STATUS,RP0 ;выбираем банк регистров 1

 

BSF

OPTION_REG,T0CS ;выключаем таймер 0

 

BCF

STATUS,RP0 ;выбираем банк регистров 0

 

BTFSC

PORTB,0

;проверка, что кнопкаSA6 все еще нажата

1

GOTO

I20

;переход к проверке флага прерыв. от таймера

BTFSS

T1CON,TMR1ON ;проверка, что таймер1 включен

 

 

GOTO

I10

;переход к включению таймера 1

 

BCF

T1CON,TMR1ON;выключение таймера 1

 

BCF

T2CON,TMR2ON;выключение таймера 2

1

GOTO

I20

;переход к проверке флага прерыв. от таймера

 

 

 

I10:

MOVLW

H'0B'

;задаем выдержку времени

 

 

 

;8*(65536-3036)=500000

 

MOVWF

TMR1H

;|

 

MOVLW

H'DC'

;|

 

MOVWF

TMR1L

;|

 

BSF

T1CON,TMR1ON;включение таймера 1

 

BSF

T2CON,TMR2ON;включение таймера 2

I20:

BTFSS

PIR1,TMR1IF;проверка флага прерывания от таймера 1

2

GOTO

I40

;переход к проверке флага прерыв. от таймера

BCF

PIR1,TMR1IF;сброс флага прерывания от таймера 1

 

 

MOVLW

H'0B'

;перезапускаем таймер 1

 

MOVWF

TMR1H

;задаем выдержку времени

 

 

 

;8*(65536-3036)=500000

 

MOVLW

H'DC'

;|

 

MOVWF

TMR1L

;|

 

BTFSS

T2CON,TMR2ON;проверка, что таймер 2 включен

 

GOTO

I30

;переход к включению таймера 2

 

BCF

T2CON,TMR2ON;выключение таймера 2

66

 

GOTO

I40

;переход к проверке флага прерыв.

 

 

 

;от таймера 2

I30:

BSF

T2CON,TMR2ON;включение таймера 2

I40:

BTFSS

PIR1,TMR2IF;проверка флага прерывания от таймера 2

 

GOTO

I60

;переход к проверке флага

 

 

 

;внешнего прерывания

 

BCF

PIR1,TMR2IF;сброс флага прерывания от таймера 2

 

BTFSS

PORTA,2

;проверка, что на BZ1 '1'

 

GOTO

I50

;переход к подаче импульса на BZ1

 

BCF

PORTA,2

;сбро с BZ1 в '0'

 

GOTO

I60

;переход к проверке флага

 

 

 

;внешнего прерывания

I50:

BSF

PORTA,2

;установка BZ1 в '1'

I60:

BTFSS

INTCON,INTF;проверка флага внешнего прерывания

 

GOTO

I70

;переход к выходу из драйвера прерываний

 

BCF

INTCON,INTF;сброс флага внешнего прерывания

 

MOVLW

D'60'

;задаем выдержку времени

 

 

 

;256*(256-60)=50176мкс

 

MOVWF

TMR0

;|

 

BSF

STATUS,RP0 ;выбираем банк регистров 1

 

BCF

OPTION_REG,T0CS ;включаем таймер 0

I70:

RETFIE

 

;выход из драйвера прерываний

 

END

 

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

Трансляция текста программы в машинные коды

Процесс создания нового проекта и компиляции программы подробно описан в лабораторной работе 1.

Тестирование и отладка

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

Сопровождение

Поскольку все программы, разрабатываемые при изучении курса ОМТ, носят чисто учебный характер, то их работоспособность необходимо

поддерживать лишь до момента защиты лабораторной работ преподавателю.

67

Содержание отчета

В отчете необходимо привести постановку задачи, блок-схему алгоритма и текст программы на языке Ассемблер с исправлениями, возникшими на этапе отладки.

Контрольные вопросы

1.Выполнением какого фрагмента программы-примера занят микроконтроллер большую часть времени?

2.Для чего нужен предделитель у таймеров-счетчиков?

3.Что такое «вектор прерывания»?

4.Каковы особенности работы сторожевого таймера?

68

ЛАБОРАТОРНАЯ РАБОТА 6 Изучение работы аналого-цифрового преобразователя

микроконтроллеров PIC-micro

Цель работы:

изучение работы

и

программирование

аналого-

цифрового преобразователя микроконтроллера PIC16F873A.

 

 

Микроконтроллер PIC16F873A имеет

пятиканальный 10-разрядный

аналого-цифровой

преобразователь (АЦП),

работающий

по

методу

последовательного приближения.

Структурная схема аналого-цифрового преобразователя приведена на рис. 6.1. Она состоит из входного мультиплексора, мультиплексора опорного сигнала и схемы АЦП.

Рис. 6.1. Структурная схема АЦП

Измеряемое напряжение подается на аналоговые входыAN0...AN4, совмещенные с выводами параллельного порта. ВА каждом цикле аналого-цифрового преобразования измеряется напряжение, поступающее только на один из входов. Выбор конкретного входа осуществляется входным мультиплексором, на управляющие входы которого подаются сигналы битов CHS0...CHS2 регистра ADCON0. Сигнал с выхода мультиплексора VAIN поступает на вход АЦП. В качестве положительного

69

опорного

напряжения VREF+

может

использоваться

напряжение

положительного полюса источника питания VDD либо напряжение на входе

 

AN3, а в качестве отрицательногоVREF-

– напряжение

отрицательного

 

полюса источника питанияVSS

либо напряжение на входеAN2. Выбор

 

источника опорного напряжения осуществляется битамиPCFG0...PCFG3

 

регистра ADCON1.

 

 

 

 

 

 

 

 

 

 

 

 

 

Аналого-цифровое преобразование начинается после установки в «1»

 

бита GO/-DONE регистра ADCON0.

 

 

 

 

 

 

 

 

 

Период преобразования одного цифрового разряда TAD составляет не

 

более 1,6

мкс,

а

суммарное

время

преобразования

 

десяти

разрядов

составляет 12·TAD = 19,2 мкс. Кроме

того,

между

циклами аналого-

 

цифрового

преобразования

необходимо

обеспечить

паузу

длительностью

 

не

менее 2·TAD

=

3,2

мкс,

необходимую для

заряда

 

конденсатора

в

устройстве выборки-хранения. В качестве источника тактового сигнала

 

может выступать тактовый генератор микроконтроллера либо внутренний

 

RC

генератор

модуля

АЦП. Выбор

типа

задающего

генератора

и

коэффициента

 

деления

частоты

следования

тактовых

импульсов

определяется битами ADCS0 и ADCS1 регистра ADCON0.

 

 

 

 

 

По окончании аналого-цифрового преобразования битGO/-DONE

 

автоматически сбрасывается в «0», а бит ADIF в регистре PIR1 взводится в

 

«1». Установка

бита ADIF

вызывает прерывание,

если

оно разрешено

 

установкой в «1» битов GIE и PEIE в регистре INTCON, а также бита ADIE в регистре PIE1.

Рис. 6.2. Выравнивание результата аналого-цифрового преобразования

70

10-разрядный цифровой код с выхода АЦП записывается16- в разрядный регистр результата, отображенный в ОЗУ микроконтроллера на регистры специального назначения ADRESL и ADRESH. В зависимости от

состояния

бита ADFM регистра

ADCON1 восемь

старших

разрядов

результата могут сохраняться в регистре ADRESH, а оставшиеся два – в

регистре

ADRESL (левое

выравнивание), либо наоборот –

восемь

младших

разрядов сохраняются

в регистре ADRESL, а

два старших– в

регистре ADRESH (правое выравнивание). (см. рис. 6.2).

 

 

Назначение конкретных

разрядов регистров ADCON0 и ADCON1

приведены на рис. 6.3. и 6.4.

 

 

 

 

Рис. 6.3. Регистр управления АЦП ADCON0

Рекомендуемая последовательность действий при работе с АЦП следующая.

Настроить модуль АЦП:

1.Настроить выводы портаA как входы измеряемого либо опорного напряжения (ADCON1).

2.Выбрать входной канал АЦП (ADCON0).

3.Выбрать источник тактовых импульсов для АЦП (ADCON0).

71

4. Включить модуль АЦП (ADCON0).

Настроить прерывание от АЦП, если это необходимо:

1.Сбросить бит ADIF регистра PIR1 в «0».

2.Установить бит ADIE регистра PIE1 в «1».

3.Установить бит PEIE регистра INTCON в «1».

4.Установить бит GIE регистра INTCON в «1». Выдержать паузу длительностью 2·TAD ≥ 3,2 мкс.

Начать аналого-цифровое преобразование установкой «1»в бита

GO/-DONE регистра ADCON0.

Ожидать окончания аналого-цифрового преобразования:

1.Ожидать пока бит GO/-DONE регистра ADCON0 не будет сброшен в «0».

2.Либо ожидать прерывание по окончании преобразования. Считать результат аналого-цифрового преобразования из регистров

ADRESL и ADRESH.

Сбросить бит ADIF регистра PIR1 в «0», если это необходимо.

Рис. 6.4. Регистр управления АЦП ADCON1

72

Порядок выполнения работы

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

Вкачестве примера рассмотрим следующее задание. В исходном состоянии все светодиоды погашены. При повороте ручки потенциометра

R1 на одно из делений 1-сго по 6-е включается соответствующий светодиод (HL1...HL6), остальные светодиоды гаснут.

Постановка задачи

Для решения данной задачи вполне достаточно 8-разрядной точности аналого-цифрового преобразования. Весь диапазон цифровых отсчетов составляет 256 значений, а на одно деление шкалы потенциометра приходится 256/10 = 26 дискретных значений. Зависимость включения светодиодов от результатов аналого-цифрового преобразования можно представить в виде таблицы (см. табл. 6.1).

Таблица 6.1

Состояние светодиодов в зависимости от АЦП

Значение на выходе АЦП

HL1

HL2

HL3

HL4

HL5

HL6

 

 

 

 

 

 

 

0...25

0

0

0

0

0

0

 

 

 

 

 

 

 

26...51

1

0

0

0

0

0

 

 

 

 

 

 

 

52...77

0

1

0

0

0

0

 

 

 

 

 

 

 

78...103

0

0

1

0

0

0

 

 

 

 

 

 

 

104...129

0

0

0

1

0

0

 

 

 

 

 

 

 

130...155

0

0

0

0

1

0

 

 

 

 

 

 

 

156...255

0

0

0

0

0

1

 

 

 

 

 

 

 

Разработка алгоритма программы

Впервом блоке алгоритма(рис. 6.5) осуществляется настройка

портов

ввода-вывода

и

аналого-цифрового

преобразователя

н

соответствующие режимы работы и включение модуля АЦП. Нулевой

 

разряд порта А настраивается на ввод информации, а остальные разряды

 

порта А и порт С– на вывод. АЦП настраивается на работу с аналоговым

 

входом AN0 и напряжением

источника

питания

микроконтроллера в

 

качестве

источника

опорного

напряжения. При

частоте

кварцевого

 

генератора

4 МГц

выбирается FOSC/8. Для

обеспечения 8-разрядного

 

преобразования выбирается левое выравнивание результата, при этом достаточно анализировать значение регистра ADRESH.

73

Рис. 6.5. Блок-схема алгоритма основной программы

Во втором блоке запускается аналого-цифровое преобразование, а в третьем ожидается его завершение.

Вблоках 4, 6, 8, 10, 12 и 14 производится сравнение результата аналого-цифрового преобразования с рассчитанными ранее порогами.

Вблоке 5 выключаются все светодиоды, поскольку уровень измеряемого сигнала ниже первого порога.

Вблоках 7, 9, 11, 13, 15 и 16 гасятся все светодиоды, кроме одного, в соответствии с табл. 6.1.

Далее программа возвращается к запуску следующего аналогоцифрового преобразования

Написание текста программы на языке Ассемблер

Исходный текст программы приведен далее:

;предварительные настройки

 

#include

p16f873a.inc

 

__CONFIG

_HS_OSC

;высокочаcтотный кварцевый резонатор

ORG

H'000'

;вектор сброса

74

 

GOTO

BEGIN

;переход на начало основной программы

;начало основной программы

 

 

ORG

H’005’

 

BEGIN:

BSF

STATUS,RP0 ;выбираем банк регистров 1

;задаем режимы работы параллельных портов

 

MOVLW

B'00000001'

;PORTA, 7-1 выходы, PORTA, 0 вход

 

MOVWF

TRISA

;программируем регистр направления PORTA

 

MOVLW

B'11000000'

;PORTC,7-6 вход, PORTC,5-0 выходы

 

MOVWF

TRISC

;программируем регистр направления PORTC

;задаем режим работы АЦП

 

 

MOVLW

B'00001110'

;задаем аналоговый входPORTA,0,

 

 

 

;левое выравн.

 

MOVWF

ADCON1

;программируем регистр АЦП1

 

BCF

STATUS,RP0

;выбираем банк регистров 0

 

MOVLW

B'01000001'

;задаем аналоговый входPORTA,0

 

 

 

;и включаем АЦП

 

MOVWF

ADCON0

;программируем регистр АЦП0

 

NOP

 

;пауза 4 мкс

 

NOP

 

;|

 

NOP

 

;|

 

NOP

 

;|

;основная программа

 

 

M10:

BSF

ADCON0,GO ;запуск преобразования

M20:

BTFSC

ADCON0,GO ;ожидание окончания преобразования

 

GOTO

M20

;|

 

MOVLW

D'26'

;первый порог сравнения

 

SUBWF

ADRESH,W

;сравнение результата преобразования

 

 

 

;с порогом

 

BTFSS

STATUS,C

;скачок, если выше порога

 

GOTO

M30

;переход к гашению всех светодиодов

 

MOVLW

D'52'

;второй порог сравнения

 

SUBWF

ADRESH,W

;сравнение результата преобразования

 

 

 

;с порогом

 

BTFSS

STATUS,C

;скачок, если выше порога

 

GOTO

M40

;переход к вкюч. HL1 и гашению

 

 

 

;остальных светодиодов

 

MOVLW

D'78'

;третий порог сравнения

 

SUBWF

ADRESH,W

;сравнение результата преобразования

 

 

 

;с порогом

 

BTFSS

STATUS,C

;скачок, если выше порога

 

GOTO

M50

;переход к вкюч. HL2 и гашению

 

 

 

;остальных светодиодов

 

MOVLW

D'104'

;четвертый порог сравнения

 

SUBWF

ADRESH,W

;сравнение результата преобразования

 

 

 

;с порогом

 

BTFSS

STATUS,C

;скачок, если выше порога

 

GOTO

M60

;переход к вкюч. HL3 и гашению

 

 

 

;остальных светодиодов

 

MOVLW

D'130'

;пятый порог сравнения

 

SUBWF

ADRESH,W

;сравнение результата преобразования

75

 

 

 

;с порогом

 

BTFSS

STATUS,C

;скачок, если выше порога

 

GOTO

M70

;переход к вкюч. HL4 и гашению

 

 

 

;остальных светодиодов

 

MOVLW

D'156'

;второй порог сравнения

 

SUBWF

ADRESH,W

;сравнение результата преобразования

 

 

 

;с порогом

 

BTFSS

STATUS,C

;скачок, если выше порога

 

GOTO

M80

;переход к вкюч. HL5 и гашению

 

 

 

;остальных светодиодов

 

BCF

PORTA,5

;гашение HL1

 

CLRF

PORTC

;гашение HL2...HL6

 

BSF

PORTC,5

;включение HL6

 

GOTO

M10

;возврат к началу основной программы

M30:

BCF

PORTA,5

;гашение HL1

 

CLRF

PORTC

;гашение HL2...HL6

 

GOTO

M10

;возврат к началу основной программы

M40:

BSF

PORTA,5

;включение HL1

 

CLRF

PORTC

;гашение HL2...HL6

 

GOTO

M10

;возврат к началу основной программы

M50:

BCF

PORTA,5

;гашение HL1

 

CLRF

PORTC

;гашение HL2...HL6

 

BSF

PORTC,0

;включение HL2

 

GOTO

M10

;возврат к началу основной программы

M60:

BCF

PORTA,5

;гашение HL1

 

CLRF

PORTC

;гашение HL2...HL6

 

BSF

PORTC,1

;включение HL3

 

GOTO

M10

;возврат к началу основной программы

M70:

BCF

PORTA,5

;гашение HL1

 

CLRF

PORTC

;гашение HL2...HL6

 

BSF

PORTC,3

;включение HL4

 

GOTO

M10

;возврат к началу основной программы

M80:

BCF

PORTA,5

;гашение HL1

 

CLRF

PORTC

;гашение HL2...HL6

 

BSF

PORTC,4

;включение HL5

 

GOTO

M10

;возврат к началу основной программы

 

END

 

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

Трансляция текста программы в машинные коды

Процесс создания нового проекта и компиляции программы подробно описаны в лабораторной работе 1.

Тестирование и отладка

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

76

Сопровождение

Поскольку все программы, разрабатываемые при изучении курса ОМТ, носят чисто учебный характер, то их работоспособность необходимо

поддерживать лишь до момента защиты лабораторной работ преподавателю.

Содержание отчета

В отчете необходимо привести постановку задачи, блок-схему алгоритма и текст программы на языке Ассемблер с исправлениями, возникшими на этапе отладки.

Контрольные вопросы

1.Сколько выборок в секунду может производить АЦПPIC16?

2.Какие регистры управляют работой АЦП?

3.В каких случаях при работе с АЦП используются прерывания? В каких случаях лучше синхронно ожидать окончания преобразования?

77

ЛАБОРАТОРНАЯ РАБОТА 7 Изучение работы модуля захвата/сравнения/ШИМ

микроконтроллеров PIC-micro

Цель работы: изучение работы и программирование модуляCCP (захват/сравнение/ШИМ) микроконтроллера PIC16F873A.

Микроконтроллер PIC16F873A имеет два модуляCCP1 и CCP2, осуществляющих 16-разрядный захват содержимого таймераTMR1, 16разрядное сравнение содержимого этого таймера с заданным числом, либо

10-разрядную

широтную

модуляцию

импульсов, вырабатываемых

таймером TMR2.

 

 

 

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

Управление режимами

работы модулейCCP осуществляется с

помощью регистров CCP1CON

и CCP2CON. Значения конкретных

значений разрядов этих регистров приведены на рис 7.1.

Рис. 7.1. Регистр управления модуля CCP

78

Режим захвата

Структурная схема CCP в режиме захвата приведена на рис. 7.2. Она состоит из входаCCP1, предварительного делителя на1, 4 или 16, детектора переднего, либо заднего фронта входного импульса, старшего (CCP1H) и младшего (CCP1L) регистров модуля CCP. Кроме того. в схеме используются регистры TMR1H и TMR1L таймера TMR1. Таймер TMR1 должен быть настроен на синхронный режим работы, если он используется в качестве счетчика внешних импульсов (см. рис. 5.3).

Рис. 7.2. Структурная схема модуля CCP в режиме захвата

Событием захвата в данной схеме может являться задний фронт импульса на входе ССР1, передний фронт импульса на входе 1,ССР каждый четвертый передний фронт импульса на входе ССР1 или каждый шестнадцатый передний фронт импульса на входе ССР1. Выбор события,

при

котором

происходит ,

осуществляетсязахват

битами

ССРхМ0...ССРхМ3 регистра CCPxCON.

 

 

Работает схема следующим образом: при возникновении события захвата информация из 16-разрядного регистра-счетчика TMR1 копируется одновременно в регистрыCCPR1H и CCPR1L, при этом таймерTMR1 может продолжать свою работу. Таким образом исключается искажение

информации, возникающее при последовательном считывании информации из регистров TMR1H и TMR1L. После этого в регистреPIR1 взводится флаг CCP1IF и вызывается прерывание, если оно разрешено.

Режим сравнения

Структурная схема CCP в режиме сравнения приведена на рис. 7.3. Она состоит из старшего(CCP1H) и младшего (CCP1L) регистров модуля CCP, схемы сравнения, логической схемы управления триггером, RS

79

триггера и вывода ССР1, а

также регистровTMR1H и TMR1L таймера

TMR1. При этом таймерTMR1 должен быть настроен на синхронный

режим работы, если он

используется в качестве счетчика внешних

импульсов (см. рис. 5.3), а соответствующий разряд параллельного порта С

– на вывод информации.

Рис. 7.3. Структурная схема модуля CCP в режиме сравнения

В момент совпадения значения записанного в регистрыCCPR1H и CCPR1L с числом счетных импульсов, накопленным в регистреTMR1, схема сравнения взводит флаг прерыванияCCP1IF в регистре PIR1. В зависимости от настройки режима работы разрядами ССР10М...ССР1М3 регистра CCP1CON логическая схема воздействует наRS триггер, опрокидывая его в «0» или в «1», либо не изменяя его состояния(только взводится флаг прерывания). Сигнал с выхода RS триггера поступает на вывод CCP1 микроконтроллера. В режиме микропотребления может взводиться триггер специального события, запускающий аналого-цифровое преобразование.

Режим широтно-импульсной модуляции

 

 

Структурная

схема

модуляCCP в

режиме

ШИМ

приведена на

рис. 7.4. Она состоит

из регистров

длительности импульсаCCPR1L

(ведущий) и CCPR1H (ведомый), схемы сравнения, RS триггера, вывода

микроконтроллера

CCP1,

а также регистра-счетчика

таймераTMR2,

регистра периода

таймераTMR2 и его

схемы

сравнения. Временная

диаграмма работы модуля CCP в режиме ШИМ приведена на рис 7.5. Работает схема следующим образом. Таймер TMR2 вырабатывает

бесконечную последовательность импульсов, в соответствии с выбранным режимом работы и с периодом, заданным в регистре периодаPR2

80

(настройку таймера TMR2 см. в лабораторной работе 5).

При равенстве числа в счетчикеTMR2 и в регистреPR2 схема

сравнения

сбрасывает счетчикTNR2 и взводит RS триггер. На выходе

CCP1 появляется логическая «1» (см. рис. 7.5). В этот же момент времени

осуществляется перезапись содержимого ведущего регистраCCPR1L в

ведомый

регистр CCPR1H. Логическая «1» на выходе CCP1 будет

сохраняться до тех пор, пока значение в счетчикеTMP2 не сравняется с содержимым регистра CCPR1H. При равенстве числа в счетчикеTMR2 числу загруженному в регистрCCPR1H схема сравнения сбрасываетRS триггер, и на выходе CCP1 появляется логический «0».

Рис 7.4. Структурная схема модуля CCP в режиме ШИМ

Рис 7.5. Временная диаграмма работы модуля CCP в режиме ШИМ

81

Наличие

ведущего

регистраCCPR1L предотвращает

искажение

 

длительности импульса, формируемого в данном периоде работы счетчика

 

TMR2, т. е. изменение

содержимого

ведущего

регистра

длительности

импульса CCPR1L может

производиться программно и асинхронно с

работой схемы ШИМ, изменение же значения в ведомом регистре CCPR1H

 

всегда будет происходить в начале следующего периода.

 

 

В лабораторном макете к выводуCCP1 подключен микроамперметр,

 

отклонение

стрелки

которого

прямо

пропорционально

значению

постоянной составляющей сигнала, формируемого схемой ШИМ.

Порядок выполнения работы

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

Вкачестве примера рассмотрим следующее задание: показание микроамперметра PV1 обратно пропорционально углу поворота ручки потенциометра R1.

Постановка задачи

По аналогии с лабораторной работой6 будем использовать 8- разрядную точность аналого-цифрового преобразования и формирования сигнала ШИМ.

Преобразование результата аналого-цифрового преобразования в обратный код осуществляется путем вычитания его из шестнадцатеричного числа H’FF’:

PWM = H’FF’ – ADRES,

где PWM – длительность импульса ШИМ;

ADRES – результат аналого-цифрового преобразования.

Разработка алгоритма программы

Алгоритм программы приведен на рис. 7.6.

В первом блоке осуществляется настройка портов ввода-вывода, таймера TMR2 и аналого-цифрового преобразователя на соответствующие режимы работы. Схема CCP1 настраивается на режим ШИМ путем записи двоичного числа «00001111» в регистр CCP1CON.

82

Рис. 7.6. Блок-схема алгоритма программы

Во втором блоке запускается аналого-цифровое преобразование, а в третьем ожидается его завершение.

Вчетвертом блоке считывается результат аналого-цифрового преобразования и вычисляется обратный код.

Впятом блоке задается длительность импульса ШИМ путем записи обратного кода в ведущий регистр CCPR1L.

Затем программа возвращается к запуску следующего аналогоцифрового преобразования.

Написание текста программы на языке Ассемблер

Исходный текст программы приведен далее:

;предварительные настройки

 

 

#include

p16f873a.inc

 

 

__CONFIG

_HS_OSC

;высокочаятотный кварцевый резонатор

 

ORG

H'000'

;вектор сброса

 

GOTO

BEGIN

;переход на начало основной программы

;начало основной программы

 

 

ORG

H’005’

 

BEGIN:

BSF

STATUS,RP0 ;выбираем банк регистров 1

;задаем режимы работы параллельных портов

 

MOVLW

B'00000001'

;PORTA, 7-1 выходы, PORTA, 0 вход

 

MOVWF

TRISA

;программируем регистр направления PORTA

 

MOVLW

B'11000000'

;PORTC,7-6 вход, PORTC,5-0 выходы

 

MOVWF

TRISC

;программируем регистр направления PORTC

;задаем режим работы таймера TMR2

 

 

MOVLW

D'255'

;задаем период таймера 2

 

MOVWF

PR2

;|

83

 

BCF

STATUS,RP0

;выбираем банк регистров 0

 

MOVLW

B'00000000'

;коэфф. деления делителей1:1

 

MOVWF

T2CON

;|

 

BSF

T2CON,TMR2ON;включение таймера 2

;задаем режим работы АЦП

 

 

MOVLW

B'00001110'

;задаем аналоговый входAN0, левое выравн.

 

MOVWF

ADCON1

;программируем регистр АЦП1

 

MOVLW

B'01000001'

;задаем аналоговый входPORTA,0

 

 

 

;и включаем АЦП

 

MOVWF

ADCON0

;программируем регистр АЦП0

 

NOP

 

;пауза 4 мкс

 

NOP

 

;|

 

NOP

 

;|

 

NOP

 

;|

;настройка модуля CCP

 

 

 

MOVLW

B'00001111'

;задаем режим ШИМ

 

MOVWF

CCP1CON

;|

;основная программа

 

 

M10:

BSF

ADCON0,GO ;запуск преобразования

M20:

BTFSC

ADCON0,GO ;ожидание окончания преобразования

 

GOTO

M20

;|

 

MOVF

ADRESH,W

;считываем результат преобразования

 

SUBLW

H'FF'

;вычисляем обратный код

 

MOVWF

CCPR1L

;задаем длительность импульса ШИМ

 

GOTO

M10

;возврат к началу основной программы

 

END

 

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

Трансляция текста программы в машинные коды

Процесс создания нового проекта и компиляции программы подробно описан в лабораторной работе 1.

Тестирование и отладка

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

Сопровождение

Поскольку все программы, разрабатываемые при изучении курса ОМТ, носят чисто учебный характер, то их работоспособность необходимо

поддерживать лишь до момента защиты лабораторной работ преподавателю.

84