Электромеханические системы автоматизации

Характеристика, устройство, конфигурация и назначение микроконтроллеров I8051, PIC16F877, организация их памяти. Основные методы и приемы системного программирования микроконтроллеров и интерфейса на языках семейства ассемблер MCS-51 и PICmicro.

Рубрика Коммуникации, связь, цифровые приборы и радиоэлектроника
Вид методичка
Язык русский
Дата добавления 18.04.2010
Размер файла 3,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Для программирования будем применять микропроцессорную систему, выполненную на основе учебно-отладочного стенда EV8031. Первая задача, которую нужно выполнить - определение оборудования системы, способы адресации к устройствам и распределение адресного пространства.

Распределение адресного пространства внешней памяти в стенде выполняет дешифратор адреса DD7 (Рис. 24). Своими входами он подключен к старшей тетраде 16-разрядного внешнего адреса. На входе управления Е3 будет логическая «1», разрешающая работу дешифратора, если адресуемое устройство имеет адрес больше 7FFFh. Т. о. дешифратор распределяет адресное пространство старшей половины внешних адресов микроконтроллера. В зависимости от комбинации уровней на входах 0, 1 и 2 дешифратора, подключенных к шине адреса, появляется низкий уровень только на одном выходе, номер которого в двоичной форме задан на входах. Сигналы с выходов дешифратора называются (Chip Select) и имеют свой номер. Каждый сигнал соответствует только своему адресному пространству. Низкий уровень этого сигнала указывает на адресацию к устройству, которое подключается к шинам микропроцессора данным сигналом. Адресные пространства, соответствующие сигналам указаны на рис. 24:

Рисунок 24 - Дешифратор адресного пространства внешней памяти стенда

Анализируя принципиальную схему стенда, можно увидеть, что к сигналу подключена микросхема параллельного периферийного адаптера КР580ВВ55; к - буфер чтения клавиатуры; - старшая пара статических индикаторов; - младшая пара статических индикаторов.

Для простоты схемы дешифрации адреса (в данном случае она построена только на микросхеме DD7), дешифратор выбирает из адресной шины некоторый промежуток адресов, в котором можно поместить множество устройств. Физически в таком диапазоне находится только одна (в некоторых случаях - несколько) ячеек. Поэтому для адресов обращения при программировании принимают только первую (несколько первых) ячеек. К примеру, для записи числа в регистр-защелку статического индикатора можно обратиться по адресу внешней памяти 0A000h, 0A001h и т. д. до 0AFFFh. Тогда при программировании принимают только адрес 0A000h.

Рассмотрим несколько примеров. Пусть нам необходимо засветить число на статических индикаторах HG3 и HG4. Для этого нам необходимо загрузить двоично-десятичное число в аккумулятор и записать эти данные в ячейку внешней памяти данных по адресу 0B000h согласно анализу принципиальной схемы. Расположение статических индикаторов на стенде и их нумерация указана на рис. 25.

Рисунок 25 - Статические индикаторы

Пример участка программы:

Mov A,#56 ; Число, которое выводим на индикатор.

Mov DPTR,#0b000h ; Адрес регистра индикатора.

Movx @DPTR,A ; Вывод на индикатор.

Данные, выводимые на эти индикаторы, должны быть представлены в двоично-десятичной форме (тетрады имеют значения 0-9). При выводе шестнадцатеричного числа, код тетрады которого больше 9 (Ah-Fh) дешифратор индикатора не сможет преобразовать число в правильную комбинацию сигналов для отображения цифры и сегменты индикатора будут потушены.

На основе предыдущего примера можно изменить условие. Пусть нам теперь необходимо вывести тоже число, только индикатор HG3 должен не светиться. Для выполнения этой задачи необходимо, чтобы старшая тетрада числа была равна Fh. Этого можно добиться путем выполнения операции «логическое ИЛИ» над числом и константой F0h. Такой способ в программировании называется маскирование:

Mov A,#56 ; Число, которое выводим на индикатор.

Orl A,#0F0h ; Налаживаем маску - тушим старшую тетраду.

Mov DPTR,#0b000h ; Адрес регистра индикатора.

Movx @DPTR,A ; Вывод на индикатор.

С помощью операции «логическое И» можно выполнять сброс битов числа или тетрады, а операцией «исключающее ИЛИ» - инверсию битов.

Теперь приведем пример написания программы секундомера. Индикаторы HG1 и HG2 отображают секунды, HG3 и HG4 - десятые и сотые секунды. Кнопки клавиатуры выполняют управление: «1» - старт; «2» - стоп; «3» - сброс показаний.

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

Рисунок 26 - Структурная схема устройства измерения времени

Генератор импульсов эталонной длительности должен вырабатывать импульсы с частотой 100 Гц, что соответствует дискретности времени 0,01 сек. Частота тактового генератора стенда составляет 7 372 800 Гц. Внутри микроконтроллера есть встроенный делитель импульсов на 12, который тактирует счетный вход таймеров. Для определения константы, загружаемой в таймер для формирования счетного импульса можно воспользоваться формулой:

где FOSC - частота кварцевого генератора;

FТ - необходимая частота после деления таймером.

Подставив числовые значения, получим:

.

Учитывая это, структурная схема устройства примет вид, указанный на рис. 27. Все элементы данного устройства, кроме дешифратора и индикаторов необходимо выполнить программно. Для такого выполнения разобьем устройство на составные части. Генератор эталонных импульсов (ГЭИ) представляет таймер микроконтроллера, генерирующий импульсы с частотой 100 Гц. Эти импульсы мы будем подавать на программный счетчик с коррекцией показаний секунд (после 59 секунды принимает значение 0). ГЭИ и схему сканирования клавиатуры выполним в одном потоке - подпрограмме прерывания от переполнения Т/С0. Это позволит избавиться от алгоритма устранения дребезга контактов. Счетчик и схему управления - в другом потоке: это будет основная программа.

Для такой организации программы необходимы ячейки памяти для предоставления необходимой информации между потоками (синхронизация потоков). Такая ячейка у нас будет называться STATUS. Она будет представлять собой набор битов, устанавливающихся и сбрасывающихся программой в определенных ситуациях. Необходимы следующие биты:

Count - Бит, устанавливаемый п/п обработки прерываний переполнения таймера, для отсчета сотых долей секунды; Сбрасывает основная программа после выполнения инкремента счетчика;

KeyRun - обнаружено нажатие кнопки «1». П/п прерывания сообщает основной программе о нажатии кнопки;

KeyStop - обнаружено нажатие кнопки «2». П/п прерывания сообщает основной программе о нажатии кнопки;

KeyReset - обнаружено нажатие кнопки «3». П/п прерывания сообщает основной программе о нажатии кнопки;

RunProcessed - флаг обработки кнопки «1». Необходим для однократного выполнения события нажатия при удержании нажатой кнопки. Сбрасывается когда KeyRun=0 (кнопка отжалась);

StopProcessed - флаг обработки кнопки «2». Сбрасывается когда KeyStop=0;

ResetProcessed - флаг обработки кнопки «3». Сбрасывается когда KeyReset=0;

Run - флаг, разрешающий счет времени.

Рисунок 27 - Уточненная структурная схема устройства измерения времени

Кроме регистра STATUS нам необходимо определить, где будут храниться числа, выводимые на индикатор. Примем регистр R7 для счета долей секунд, R6 - для счета секунд. Содержимое этих регистров будем выводить на индикаторы. Для дальнейшего написания программы нам нужен алгоритм:

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

Рисунок 28, лист 2 - Блок-схема алгоритма основной программы секундомера

Алгоритм подпрограммы обслуживания прерывания приводить не будем. Он строится на аналогичных принципах. Данная подпрограмма должна выполнить перезагрузку счетчика Т/С0, установить флаг Count, просканировать клавиатуру и, если нажата какая-либо клавиша, установить соответствующий бит в ячейке STATUS; если клавиша не нажата - сбросить соответствующий бит. С помощью этой ячейки выполняется своеобразный «мостик» для обмена информацией между потоком в прерывании и основной программой (Рис. 29). Иногда такие ячейки называют регистрами событий, а биты - флагами событий.

Рисунок 29 - Связь между потоком основной программы и потоком прерывания

При этом у каждого потока могут быть свои независимые переменные. В нашем случае это регистры счетчика R6 и R7 для основной программы и регистры таймера TH0 и TL0 для потока прерывания.

Составляем программу секундомера на языке ассемблер MCS-51:

$nolist

$include(mod51)

$list

;Программа реализации секундомера на стенде EV8031

;---------------------------------------------------------------------------

;Определение переменных

TMConst set 6144 ;Общий коэффициент деления тактовой

;частоты Fosc/(12*Ft)

;Fosc=7372800 Гц, Ft=100 Гц

L_IND equ 0a000h;Адреса С_Инд. во внешней памяти

R_IND equ 0b000h

Low_Counter equ R7 ;Назначение имен регистрам

High_Counter equ R6

But1 equ 9006h ;Адрес обращения к кнопке 1

But2 equ But1-1;Адрес обращения к кн.2=Адр.Кн1-1

But3 equ But1-3;Адрес обращения к кн.3

DownStek EQU 127 ;Определяем дно стека

;Битовая адресация к флагам в ячейке РПД 20h STATUS:

Count bit 0 ;Флаг счета

KeyRun bit 1 ;Флаг нажатия кнопки запуска

KeyStop bit 2 ;Флаг нажатия кнопки останова

KeyReset bit 3 ;Флаг нажатия кнопки сброса

RunProcessed bit 4 ;Флаг обработки события запуска

StopProcessed bit 5 ;Флаг обработки события останова

ResetProcessed bit 6 ;Флаг обработки события сброса

Run bit 7;Флаг разрешения счета времени

;---------------------------------------------------------------------------

;Точка входа в программу по вектору сброса процессора

Org 0

jmp Main

;---------------------------------------------------------------------------

;Точка входа в прерывание процессора по переполнению Т/С0

Org 0bh

TMR0_Int: ;Точка входа в п/п прерывания Т/С0

Push PSW ;Сохранение состояния программы

Push ACC

Push DPL

Push DPH

CLR TR0 ;Останавливаем таймер

Mov TL0,#LOW(NOT(TMConst+1)) ;загружаем константы

Mov TH0,#HIGH(NOT(TMConst+1))

SETB TR0 ;Запускаем таймер

SETB Count ;Сообщаем, что прошла 1/100 секунды

Mov DPTR,#But1 ;Адрес обращения к буферу клавиатуры

Movx A,@DPTR

Jb ACC.0, NoRun ; Кн.1 нажата?

SETB KeyRun ;Да, установим флаг

sjmp KEY2

NoRun:CLR KeyRun ;Нет, сбросим флаг

KEY2: Mov DPTR,#But2 ;Адрес обращения к буферу клавиатуры

Movx A,@DPTR

Jb ACC.0, NoStop ; Кн.2 нажата?

SETB KeyStop ;Да, установим флаг

sjmp KEY3

NoStop:CLR KeyStop ;Нет, сбросим флаг

KEY3: Mov DPTR,#But3 ;Адрес обращения к буферу клавиатуры

Movx A,@DPTR

Jb ACC.0, NoReset ; Кн.3 нажата?

SETB KeyReset ;Да, установим флаг

sjmp DoneKey

NoReset:CLR KeyReset ;Нет, сбросим флаг

DoneKey:Pop DPH ;Возврат состояния программы

Pop DPL

Pop ACC

Pop PSW

RETI

;---------------------------------------------------------------------------

;Основная программа

;Здесь начинается инициализация

Main: Mov SP,#DownStek-28 ;Настройка указателя стека

Mov TMOD,#00000001b ;Т/С0, режим 1 (16-разрядов)

Mov TL0,#LOW(NOT(TMConst+1));загружаем константы

Mov TH0,#HIGH(NOT(TMConst+1))

SETB IT0 ;Разрешение прерываний от Т/С0

SETB TR0 ;Запуск таймера

SETB EA ;Разрешение прерываний

CLR A

Mov 20h,A ;Отчистка управляющих битов STATUS

Clear:Mov High_Counter,A ;Отчистка регистров счетчика

Mov Low_Counter,A

Mov DPTR, #L_IND ;Вывод на индикаторы 0

Movx @DPTR,A

Mov DPTR,#R_IND

Movx @DPTR,A

;Конец инициализации. Начало основной программы

Wait: Jnb Count,$ ;Ожидание 1/100 сек.

CLR Count

Jnb Run, KeyProcessed ; Счет разрешен?

;Здесь начинается счетчик долей и секунд

Inc Low_Counter ;Да, увеличиваем сотые сек.

Mov A,Low_Counter

DA A ;Двоично-десятичная коррекция

Mov Low_Counter,A

JNC NoCarry ; Число больше 99?

Mov A, High_Counter ;Да, увеличим счетчик секунд

INC A

DA A ;Двоично-десятичеая коррекция

CJNE A,#60h,Less60 ;Секунд 60?

CLR A ;Да, сбросим старший разряд счетчика

Less60:Mov High_Counter,A ;Нет, сохраним результаты

NoCarry:Mov A,High_Counter

Mov DPTR, #L_IND ;Вывод на индикаторы секунд

Movx @DPTR,A

Mov A, Low_Counter ;и долей секунд

Mov DPTR,#R_IND

Movx @DPTR,A

;Обработка нажатий кнопок

KeyProcessed:

IsRun?:Jb KeyRun, SetRun ;Нажата кнопка запуска?

CLR RunProcessed ;Нет, отчистить флаг обработки

IsStop?:Jb KeyStop, SetStop ;Нажата кнопка стоп?

CLR StopProcessed ;Нет, отчистить флаг обработки

IsReset?:Jb KeyReset,SetReset ;Нажата кнопка сброс?

CLR ResetProcessed ;Нет, отчистить флаг обработки

Jmp Wait ;Кнопки не нажаты. Ожидаем 1/100 сек.

SetRun:Jb RunProcessed,IsStop?;Кнопка была отпущена?

SETB Run ;Да, разрешим счет.

SETB RunProcessed ;и установим флаг обработки кнопки

Jmp Wait

SetStop:Jb StopProcessed,IsReset? ;Кнопка была отпущена?

CLR Run ;Да, запретим счет.

SETB StopProcessed ;и установим флаг обработки кнопки

Jmp Wait

SetReset:Jb ResetProcessed, Wait ;Кнопка была отпущена?

CLR A ;Да, отчистим аккумулятор

SETB ResetProcessed ;и установим флаг обработки кнопки

Jmp Clear ;Прыжок на отчистку счетчика

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

;---------------------------------------------------------------------------

END

Вводим исходный текст программы в редакторе текстовых файлов «Блокнот» (или любом другом) и сохраняем файл с расширением *.asm

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

Asm51.exe [путь к файлу]SecMeter.asm

Результатом компиляции являются файлы, имеющие название исходной программы и расширения *.HEX и *.LST. Первый из них - полученный код программы в формате Intel Hex, а второй - листинг компиляции, в котором компилятор указывает на ошибки (если они есть) и другую служебную информацию. Если эти файлы не созданы, то процесс компиляции не мог начаться из-за ошибки. Наиболее частыми причинами таких ошибок бывают:

- Отсутствуют по указанному пути файлы, объявленные директивой $include;

- В пути к исходному файлу программы или ее модулей есть пробелы, русские символы или другие элементы, не подходящие под формат файлов DOS8.3.

Если программа пишется объектным кодом ассемблера (используются описатели сегментов кода, директивы резервирования переменных), то процесс компиляции выполняется в несколько этапов. На первом этапе с помощью компилятора получают объектный код каждого модуля программы с расширением *.obj. Далее объектный код модулей с помощью линкера соединяется в один файл, из которого получают *.hex файл.

3.3 Оптимизация кода программы и стиль программирования

Критерии оптимизации программ с точки зрения экономии ресурсов должны выбираться в зависимости от конкретных обстоятельств. Задачей программиста является экономия таких ресурсов, как время работы программы и используемые объемы ОЗУ и ПЗУ. В отличие от больших проектов программирование для микроконтроллеров осуществляется, как правило, или одним программистом, или небольшой группой программистов. Хороший стиль программирования всегда полезен. Он важен для экономии времени, затрачиваемого на разработку программы, ее отладку и поддержку, необходимую в процессе усовершенствования изделия по результатам его эксплуатации или в случае введения доработок в аппаратуру.

Стиль программирования в значительной степени определяет успехи программиста и отражает его индивидуальность. Неряшливость в программировании тоже можно считать стилем, но это плохой стиль. Для улучшения стиля программисту время от времени необходимо осмысливать проделанную работу не только с точки зрения достигнутых результатов, но и с точки зрения затраченных на это средств. Усвоение хорошего стиля программирования должно идти параллельно с обучением программированию на ассемблере. Стиль характеризует творческую сторону работы программиста, поэтому строгих правил здесь нет. Однако каждый программисту позволено применять те или другие советы по-своему или не применять их. Важно не сотворить себе кумира и по мере накопления опыта создавать удобные для себя правила и приемы программирования.

4 Практикум по ассемблеру MCS-51

4.1 Требования к отчетам по практикуму

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

Каждый отчет должен содержать:

- Тему практического задания;

- Цель практического задания;

- Описание полученного задания;

- Блок-схему алгоритма решения задания;

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

R6 - Слагаемое №1;

R7 - Слагаемое №2;

R5 - Хранит код единиц числа для отображения на семисегментном индикаторе;

KeyPress - флаг нажатия клавиш.

- Исходный текст программы на языке ассемблер;

- Выводы о проделанной работе.

При написании подпрограмм в программе в поле комментариев перед самой подпрограммой необходимо указывать входные и выходные данные:

;Decode-Подпрограмма перевода числа в код семисегментного индикатора

;Вход: А - ДД число формата 0Х

;Выход: А - семисегментный код числа

;Изменяет: DPTR

Decode: ;Здесь начинается подпрограмма

Практические задания построены для выполнения на учебно-отладочных стендах EV8031/AVR фирмы Open Systems.

4.2 Практическое задание №1

Тема: Система команд ОЭВМ MCS-51. Полноэкранный отладчик FD51.

Цель: Знакомство с ассемблером семейства микроконтроллеров MCS-51. Получение навыков в программировании и отладке программ для микроконтроллеров MCS-51.

Таблица 3 - Варианты заданий к самостоятельной работе

Вариант

Задание

1

Разработать программу подсчета положительных чисел в массиве.

2

Разработать программу подсчета отрицательных чисел в массиве

3

Разработать программу подсчета количества нулевых элементов в массиве

4

Разработать программу подсчета количества элементов массива, отличных от нуля

5

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

6

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

7

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

8

Разработать программу подсчета единичных битов в байтах массива

9

Разработать программу поиска количества элементов массиве, равных первому элементу

10

Разработать программу сортировки по возрастанию массива

11

Разработать программу сортировки по убыванию в массиве

12

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

13

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

14

Разработать программу, реализующую сумму всех элементов массива

15

Разработать программу, реализующую разность всех элементов массива

16

Разработать программу поиска наибольшего числа в массиве

17

Разработать программу поиска наименьшего числа в массиве

18

Разработать программу вычисления среднего арифметического массива (число элементов принять равное 8)

19

Разработать программу сложения элементов 2х массивов. Результат заносить в 1й массив.

20

Разработать программу перемещения блока памяти на 16 байт вперед

21

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

22

Разработать программу логического сдвига всех битов в массиве влево

23

Разработать программу логического сдвига всех битов в массиве вправо

24

Разработать программу вычисления суммы отдельно положительных и отрицательных элементов массива

25

Разработать программу вычисления суммы отдельно четных и нечетных элементов массива

26

Разработать программу преобразования числа из двоичной формы в двоично-десятичную

27

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

28

Разработать программу заполнения элементов массива по убыванию

29

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

30

Разработать программу нахождения разности наибольшего и наименьшего элементов массива.

Примечание: если в задании варианта не указано количество элементов массива, то рекомендуется принять 10.

4.3 Практическое задание №2

Тема: Изучение стенда и команд ОЭВМ КР1816ВЕ31.

Цель: Изучение функциональных возможностей учебно-отладочного стенда, внутренней структуры и системы команд ОЭВМ КР1816ВЕ31.

Таблица 4 - Варианты заданий к самостоятельной работе

Вариант

Задание

1

Занести в регистр R4 ДД число 0Х, в R6 - Х0. Сумму чисел отобразить на С_Инд. HG1, HG2 с попеременным миганием тетрад с частотой 1 Гц.

2

Занести в регистр R4 число XXh. Выполнить двоично-десятичное преобразование числа и вывести результат на С_Инд. (HG2, HG3, HG4 - сотни, десятки и единицы соответственно)

3

Занести в регистр В ДД число ХХ, в R2 - 0Х. Результат разницы чисел B-R2 c двоично-десятичной коррекцией результата вывести на С_Инд. HG1, HG2 с миганием 2 Гц.

4

Занести в А ДД число ХХ, в регистр R5 - Х0. Число из А отобразить на С_Инд. HG1, HG2, число из R5 - попеременно отображать на С_Инд. HG3, HG4 с частотой 0,5 Гц.

5

Занести в регистр R2 ДД число 0Х, в R5 Х0. Сумму чисел попеременно отображать на С_Инд. HG1, HG2 и HG3, HG4 с частотой 1 Гц.

6

Занести в ячейку внутренней памяти с адресом 70h ДД число 0Х, в регистр R3 - Х0. Сумму чисел попеременно отображать на С_Инд. HG2, HG3 и HG1 HG4 с частотой 2 Гц.

7

Занести в регистр R0 число 0. прибавлять к регистру единицу с частотой 4 Гц до 99, выполнять двоично-десятичную коррекцию и выводить результат на С_Инд. HG1, HG2.

8

Занести в регистр B ДД число Х0, в регистр R1 - ХХ. Число из В отображать на С_Инд. HG1 с частотой 1 Гц, число из R1 отображать на С_Инд. HG3, HG4 с частотой 0,5 Гц.

9

Прочитать значение регистра PSW, сбросить старшие биты тетрад прочитанного значения и отображать его на С_Инд. В следующем порядке: HG1, HG2HG2, HG3HG3, HG4 с временем смены индикаторов 0,5 сек.

10

Занести в регистр R4 ДД число 0Х, в регистр R1 Х0. Сумму чисел отображать на С_Инд. HG1, HG2 с плавным угасанием числа на протяжении 5 сек.

11

Занести в А ДД число Х0, в регистр В - 0Х. Младшую тетраду суммы постоянно отображать на С_Инд. HG4, а старшую - попеременно на индикаторах HG1, HG2 и HG3 c интервалом в 0,5 сек.

12

Занести в регистр В ДД число 0Х, в регистр R5 - Х0. Старшую тетраду суммы постоянно отображать на С_Инд. HG1, а младшую - попеременно на индикаторах HG4, HG3 и HG2 c интервалом в 1 сек.

13

Занести в регистр R1 ДД число 0Х. Отнимая от числа единицу отображать результат на С_Инд. HG2 до нуля с частотой 1 Гц. После этого потушить индикатор на 2 сек. и выполнять программу заново.

14

Занести в регистр R3 ДД число ХХ, в регистр R5 - ХХ. Попеременно отображать эти числа на С_Инд. HG4,HG3 и HG2,HG1 с частотой 2 Гц. После 10 сек. потушить индикаторы на 2сек., зациклить программу.

15

Занести в регистр А ДД число 0Х, в регистр R2 - Х0. Число из А попеременно отображать на С_Инд. HG2, HG1 с частотой 1 Гц, из R2 - на С_Инд. HG3, HG4 с частотой 2 Гц.

16

Занести в регистр R4 ДД число Х0, в R6 - 0Х. Разницу чисел с двоично-десятичной коррекцией отобразить на С_Инд. HG1, HG2 с попеременным миганием тетрад с частотой 1 Гц.

17

Занести в регистр R1 ДД число 0Х, в регистр R5 Х0. Десятки суммы последовательно отображать на всех С_Инд. с задержкой времени 0,25 сек.

18

Занести в регистр А ДД число 0Х, в R5 Х0. Сумму чисел попеременно отображать на С_Инд. HG1, HG3 и HG2, HG4 с частотой 2 Гц.

19

Занести в ячейку внутренней памяти с адресом 20h ДД число Х0, в регистр R3 - 0Х. Разницу чисел с двоично-десятичной коррекцией попеременно отображать на С_Инд. HG2, HG3 и HG1 HG4 с частотой 2 Гц.

20

Занести в регистр R0 ДД число 10. отнимать от регистра единицу с частотой 2 Гц до 0, затем прибавлять до 10. Выводить результаты на С_Инд. HG1, HG2.

21

Занести в регистр B ДД число ХХ, в регистр R1 - 0Х. Число из В отображать на С_Инд. HG1, HG2 с частотой 1 Гц, число из R1 отображать на С_Инд. HG3, HG4 с частотой 0,5 Гц.

22

Прочитать значение регистра SP, отображать его значение на С_Инд. В следующем порядке: HG3, HG4HG2, HG3HG1, HG2 с временем смены индикаторов 1 сек.

23

Занести в регистр R1 ДД число 0Х, в регистр R2 Х0. Сумму чисел отображать на С_Инд. HG1, HG4 с плавным зажиганием числа на протяжении 5 сек.

24

Занести в B ДД число 0Х, в регистр R1 - Х0. Младшую тетраду суммы постоянно отображать на С_Инд. HG1, а старшую - попеременно на индикаторах HG4, HG3 и HG2 c интервалом в 1 сек.

25

Занести в регистр TH0 ДД число Х0, в регистр R2 - 0Х. Старшую тетраду суммы постоянно отображать на С_Инд. HG1, а младшую - попеременно на индикаторах HG2, HG3 c интервалом в 1 сек.

26

Занести в регистр R1 число 0. Каждые 0,5 сек к числу прибавлять 1. Каждые 5 сек прибавлять 10. Счет вести в двоично-десятичном коде. Результат отображать на С_Инд. HG3, HG4.

27

Занести в регистр R1 число 0. Каждые 0,5 сек к числу прибавлять 1. Счет вести в двоично-десятичном коде. Результат отображать на С_Инд. HG3, HG4. По достижении числа 20 остановить счет и отображать результат с мерцанием в 0,5 сек.

28

Занести в регистр R2 ДД число ХХ, в регистр R3 - ХХ. Одновременно отображать эти числа на С_Инд. HG3,HG4 и HG1,HG2 с частотой 1 Гц. После 5 сек. потушить индикаторы на 1сек., зациклить программу.

30

Занести в регистры R1 и R4 числа 0Хh. После умножения выполнить двоично-десятичное преобразование результата и вывести результат на С_Инд. (HG2, HG3, HG4 -сотни, десятки и единицы соответственно).

Примечания: 1. ДД - двоично-десятичное число (числа в тетрадах 0…9);

2. XXh - произвольное шестнадцатеричное число;

3. ДД 0Х - двоично-десятичное число старшая тетрада которого равна 0, а младшая имеет значения 0…9;

4. Индикаторы HG1 и HG2 имеют адреса во внешней памяти данных 0A000h (старшая и младшая тетрады соотв.);

5. Индикаторы HG3 и HG4 имеют адреса во внешней памяти данных 0B000h (старшая и младшая тетрады соотв.).

4.4 Практическое задание №3

Тема: Программирование параллельного интерфейса КР580ВВ55.

Цель: Изучение схем динамической индикации.

Таблица 5 - Варианты заданий к самостоятельной работе

Вариант

Задание

1

Занести в регистр R1 число ХХh, отнимая от числа единицу отображать на Д_Инд. HG5, HG6 полученное значение до нуля с частотой 1 сек. С частотой 0,5 Гц. Переключать Свет. HL3, HL4.

2

Занести в В ДД число Х0, в регистр R1 ХХh, число из В. отображать на С_Инд. HG1 с частотой 1 Гц, число из R1 отображать на Д_Инд. HG5, HG6 с частотой 0,25 Гц.

3

Вкл. Свет. HL1. Занести в регистр В ДД число 0Х, в регистр R5 X0, два разряда суммы (десятки и единицы) поочередно отображать на С_Инд. HG1, HG2 и на Д Инд. HG5, HG6 с частотой 1 Гц.

4

Занести в per. R6 ДД число ХХ, в per.R5 ДД XX, в регистр R0 ДД XX, последовательно отображать эти числа по одному разряду на на Д_Инд. HG5, HG6, С_Инд. HG1, HG2, HG3, HG4.

5

Попеременно вкл. Свет. HL8-HL7 с частотой 2 Гц. Занести в регистр R2 ДД число 0Х, в регистр R1 0Х, сумму чисел отобразить на Д_Инд. HG5, HG6.

6

Занести в регистр А ДД число 0Х, в регистр R2 X0, число из А отобразить на С_Инд. HG3, число из регистра R2 отображать на Д_Инд. HG5, HG6 с частотой в 0.25 Гц.

7

Занести в А ДД число XX, в регистр R1 XX, младшие два разряда суммы чисел отобразить на Д_Инд. HG5, HG6, старшую тетраду С Инд. HG3.

8

Занести в регистр R6 число ХХh. Число из регистра R6 вывести в шестнадцатеричной форме на Д_Инд. HG5, HG6, а его двоично-десятичный эквивалент на С_Инд. HG2-HG4.

9

Занести в регистр В ДД число XX, в регистр R3 XX, разность чисел отобразить на Д_Инд. HG2, HG3 в ДД форме.

10

Вкл. Свет. HL5. Занести в А ДД число XX, в регистр R5 Х0, число из А отобразить на С_Инд. HG1, HG2, число из R5 отобразить на Д_Инд. HG5,HG6.

11

Занести в регистр R0 ДД число XX, попеременно отображать мл. и ст. тетраду на Д_Инд. HG5, HG6 с частотой 0,25 Гц.

12

Занести в регистр R2 ДД число 0Х, в регистр R5 0X, сумму чисел отобразить на Д_Инд. HG2, HG3.

13

Занести в регистр В ДД число, с частотой 2 Гц выводить это число на С_Инд. HG1, HG2 и одновременно на Д_Инд. HG5, HG6.

14

Попеременно вкл. Свет. HL4-HL6. Занести в ячейку с адресом 0010h внешней памяти ОЭВМ ДД число 0Х, в регистр R3 XXh, сумму чисел отобразить на Д_Инд. HG5, HG6.

15

Занести в регистр R1 ДД число 0Х, в регистр R3 XX, младшие два разряда суммы отобразить на Д_Инд. HG5, HG6 с изменением частоты смены этих индикаторов, старшую на С Инд. HG1.

4.5 Практическое задание №4

Тема: Система прерываний. Опрос дискретных датчиков.

Цель: Изучение системы прерываний ОЭВМ КР1816ВЕ31 и программ опроса дискретных датчиков.

Таблица 6 - Варианты заданий к самостоятельной работе

Вариант

Задание

1

Прерывание INT0 увеличивает показания счетчика на 1, состояние которого выводится на С_Инд. HG3, HG4, а прерывание INT1 - уменьшает.

2

Реализовать опрос клавиатуры. Номер нажатой клавиши отображать зажиганием соответствующей точки на матричном индикаторе HG7.

3

Реализовать опрос клавиатуры. Номер нажатой клавиши отображать на С_Инд.

4

Прерывание INT0 запускает бегущий огонь на светодиодах HL1-HL8 с частотой 2 Гц, а INT1 - тушит все светодиоды.

5

Программа выполняет мерцание любого числа на С_Инд. Прерывание INT0 выполняет сдвиг бегущего огня на светодиодах HL1-HL8 на один шаг влево, а INT1 - вправо.

6

Реализовать опрос клавиатуры. Номер клавиши указывать позиционным кодом на светодиодах HL1-HL8.

7

Реализовать программу ввода двухзначного числа с клавиатуры используя С_Инд. для отображения.

8

Реализовать опрос клавиатуры. Номер клавиши указывать на Д_Инд. HG5, HG6.

9

Программа выполняет мерцание любого числа на С_Инд. Прерывание INT0 запускает бегущий огонь на матрице HG7, а INT1 - тушит все точки.

10

Программа выполняет бегущий огонь на светодиодах HL1-HL8. Прерывание INT0 останавливает огонь. Повторное INT0 запускает бегущий огонь

11

Прерывание INT0 засвечивает все точки на матрице HG7. Прерывание INT1 - тушит все точки.

12

Прерывание INT0 засвечивает точки в шахматном порядке на матрице HG7. Прерывание INT1 - тушит все точки.

13

Реализовать программу введения трехзначного числа с клавиатуры, используя С_Инд.

14

Прерывание INT1 выполняет запуск бегущей тени на матрице HG7. Повторный вызов прерывания тушит все точки.

15

Реализовать опрос клавиатуры. Номер клавиши указывать двоичным кодом на светодиодах HL1-HL8.

4.6 Практическое задание №5

Тема: Цифроаналоговое преобразование. Работа таймеров.

Цель: Изучение методов цифроаналогового преобразования. Знакомство с таймерами ОЭВМ КР1816ВЕ31.

Таблица 7 - Варианты заданий к самостоятельной работе

Вариант

Задание

1

Сформировать пилообразное напряжение с частотой повторения 50 Гц. Отображать на С_Инд число сгенерированных импульсов.

2

По нажатию S1 сформировать треугольные импульсы, передний фронт 20 мсек, задний 10 мсек.

3

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

4

Сформировать синусоиду с частотой повторения 120 Гц.

5

Сформировать пилообразное напряжение с частотой повторения 200 Гц и длительностью переднего фронта 2 мсек.

6

По нажатию S3 сформировать синусоиду с частотой повторения 100 Гц.

7

Сформировать прямоугольные импульсы, с длительностью 25мсек и скважностью 4

8

По нажатию S4 сформировать треугольные импульсы, передний фронт 25 мсек., задний 5 мсек.

9

Сформировать синусоиду с частотой повторения 300 Гц. По нажатию S5 изменить частоту на 100 Гц.

10

Сформировать два прямоугольных импульса, один максимальной амплитудой длительностью и второй 2/3 амплитуды максимальной с периодом повторения 40 Гц.

11

Сформировать прямоугольные импульсы, с длительностью 25 мсек. по нажатию S6 сформировать треугольные импульсы.

12

Сформировать синусоиду с частотой повторения 70 Гц, по нажатию S7 прямоугольные импульсы, с длительностью 25мсек и скважностью 2.

13

По нажатию S8 сформировать треугольные импульсы, передний фронт 15 мсек., задний 40 мсек.

14

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

15

Сформировать три прямоугольных импульса, один 1/3 макс. амплитуды, 2-ой 2/3 амп. макс, 3-ий макс. амп. с периодом повторения 100 Гц.

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

4.7 Практическое задание №6

Тема: Аналого-цифровое преобразование.

Цель: Научиться измерять аналоговую величину с помощью цифровых устройств.

Таблица 8 - Варианты заданий к самостоятельной работе

Вариант

Задание

1

При нажатии на кнопку S10 запустить АЦП последовательного уравновешивания. Результат преобразования выводить на С_Инд в десятичной форме.

2

При нажатии на кнопку S11 запустить АЦП половинных приближений. Результат преобразования выводить на С_Инд в десятичной форме.

3

Запустить следящий АЦП последовательного уравновешивания. Результат преобразования выводить на С_Инд в десятичной форме.

4

Запустить следящий АЦП половинных приближений. Результат преобразования выводить на С_Инд в десятичной форме.

5

По нажатию кнопки S1 запустить АЦП половинных приближений. Результат преобразования выводить на С_Инд в десятичной форме.

6

По нажатию кнопки S2 запустить АЦП последовательного уравновешивания. Результат преобразования выводить на С_Инд в десятичной форме.

7

По нажатию кнопки S3 запустить следящий АЦП половинных приближений. Результат преобразования выводить на С_Инд в десятичной форме.

8

По нажатию кнопки S4 запустить следящий АЦП последовательного уравновешивания. Результат преобразования выводить на С_Инд в десятичной форме.

9

По нажатию кнопки S5 запустить АЦП половинных приближений. Результат преобразования выводить на С_Инд в десятичной форме по нажатию кнопки S1.

10

По нажатию кнопки S6 запустить АЦП последовательного уравновешивания. Результат преобразования выводить на С_Инд в десятичной форме по нажатию кнопки S2.

11

По нажатию кнопки S7 запустить следящий АЦП последовательного уравновешивания. Результат выводить на С_Инд в десятичной форме по нажатию S3.

12

По нажатию кнопки S8 запустить следящий АЦП половинных приближений. Результат выводить на С_Инд в десятичной форме по нажатию S4.

13

При нажатии S9 запустить АЦП половинных приближений. Номер уравновешиваемого разряда выводить в качестве точки на матрицу HG7. После преобразования вывести результат на С_Инд в десятичной форме.

14

При нажатии S10 запустить АЦП последовательного уравновешивания. Номер шага уравновешивания выводить на матрицу HG7 в двоичном коде. После преобразования вывести результат на С_Инд в десятичной форме.

15

При нажатии кнопки S11 запустить АЦП половинных приближений. По нажатию S2 вывести результат на Д_Инд в шестнадцатеричной форме. Допускается использовать С_Инд для старшего разряда (HG1).

5 Описание микроконтроллера PIC16F877

5.1 Общая характеристика микроконтроллера

PIC16F877 - 8-разрядный микроконтроллер, выпускаемый фирмой Microchip Technology. Это специализированный микропроцессор, предназначенный в основном для программного управления автоматизированными системами, автомобильными и электрическими двигателями, устройствами передачи информации и измерительными приборами. В отличие от универсальных процессоров, он имеет развитые средства взаимодействия с внешними устройствами и более простую систему команд.

PIC16F877 представляет собой микросхему с 40 выводами, из которых 32 предназначены для передачи информации от внешнего устройства либо к внешнему устройству. Выполняемая программа хранится в перепрограммируемом ПЗУ, куда она заносится специальным устройством - программатором. Необходимые данные, переменные, результаты несложных расчетов и счетчики циклов хранятся в ОЗУ и теряются при выключении питания. Чтобы избежать потери данных при этом, можно использовать 256 ячеек энергонезависимой памяти данных.

Микроконтроллер PIC16F877 имеет следующие технические характеристики:

- Микроконтроллер выполнен по высокоскоростной RISC технологии. Высокая производительность достигается за счет применения конвейерной архитектуры и малого числа команд (всего 35);

- Тактовая частота МК составляет 20 МГц, при этом время длительности машинного цикла достигает 200 нс;

- 8Кх14 слов FLASH памяти программ;

- 368х8 байт памяти данных (ОЗУ);

- 256х8 байт EEPROM памятью данных;

- Система прерываний имеет 14 источников.

Характеристика периферийных модулей:

- Два 8-разрядных таймера/счетчика;

- Один 16-разрядный таймер/счетчик с возможностью подключения внешнего кварцевого резонатора;

- Два модуля захват/сравнение/ШИМ (CCP):

1) 16-разрядный захват (максимальная разрешающая способность 12.5 нс);

2) 16-разрядное сравнение (максимальная разрешающая способность 200нс);

3) 10 разрядный ШИМ.

- 8-канальный 10-разрядный АЦП;

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

- Ведущий/ведомый режим SPI;

- Ведущий/ведомый режим I2C;

- Последовательный асинхронный приемопередатчик USART c поддержкой детектирования адреса;

- Ведомый 8-разрядный параллельный порт PSP с поддержкой внешних сигналов , , .

5.2 Внутреннее устройство ядра микроконтроллера

Внутреннее устройство показано на рис. 30. МК можно условно разделить на две части: вычислительное ядро (серый цвет) и периферийные модули (белый цвет).

Вычислительное ядро работает следующим образом. Программа работы МК находится в FLASH памяти программ. Программа выполняется последовательно до тех пор, пока не встретится команда перехода. Регистр команд (РК) содержит текущую команду на время ее дешифрации и выполнения, а программный счетчик (PC) предназначен для хранения адреса следующей команды. Когда текущая команда завершена, то:

- По адресу из PC производится выборка команды из памяти программ в РК;

- При дешифрации этой команды, производится инкремент PC на единицу и PC адресует следующую команду;

- Когда выполнение данной команды заканчивается, содержимое PC выдается памяти программ и цикл повторяется.

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

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

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

Действия, связанные с вызовом подпрограммы, как и у других МК, также заменяет содержимое PC на адрес перехода, и также при этом запоминается текущее содержимое PC в стеке. Команда возврата должна восстановить в PC адрес возврата, чтобы после завершения подпрограммы продолжалось последовательное выполнение основной программы.

Рисунок 30 - Внутреннее устройство микроконтроллера PIC16F877

Извлечение команд из памяти команд и их выполнение ядром происходит за 4 машинных такта, благодаря конвейерной обработке, из которых состоит машинный цикл. Диаграмма выборки команд и их исполнение представлена на рис. 31:

Рисунок 31 - Диаграмма машинных циклов

Микроконтроллеры PIC содержат 8-разрядный универсальный арифметический модуль (АЛУ) и 8-разрядный рабочий регистр (W). АЛУ выполняет арифметические и булевы операции между рабочим регистром и любым регистром памяти данных.

Входные данные АЛУ в зависимости от кода операции могут находиться:

- В регистре W;

- В регистре команд;

- В памяти данных.

Результат выполнения операции может сохраняться как в рабочий регистр W, так и в любой регистр памяти данных (файловый регистр):

Рисунок 32 - Арифметико-логическое устройство и рабочий регистр

8-разрядное АЛУ может выполнять сложение, вычитание, поразрядный сдвиг и логические операции. Арифметические операции выполняются по принципу дополнения до двух, если не указано иначе. В командах с двумя операндами: первый операнд находится в рабочем регистре W, а второй операнд расположен в регистре памяти данных или константа. В командах с одним операндом: операндом является регистр W или регистр памяти данных.

Регистр W - не адресуемый 8-разрядный рабочий регистр, который используется в операциях АЛУ. В зависимости от типа команды и результат команды АЛУ может воздействовать на следующие флаги состояния в регистре STATUS: перенос (С), полуперенос (DC), флаг нулевого результата (Z). Биты C и DC работают как биты заема и десятичного заема при выполнении команд вычитания.

В регистре STATUS содержатся флаги состояния АЛУ. Флаги причины сброса микроконтроллера и биты управления банками памяти данных.

Регистр STATUS (Рис. 33) может быть адресован любой командой, как и любой другой регистр памяти данных. Если обращение к регистру STATUS выполняется командой, которая воздействует на флаги Z, DC и C, то изменение этих трех битов командой заблокировано. Эти биты сбрасываются или устанавливаются согласно логике ядра микроконтроллера. Команды изменения регистра STATUS также не воздействуют на биты -TO и -PD. Поэтому результат выполнения команды с регистром STATUS может отличаться от ожидаемого. Например, команда CLRF STATUS сбросит три старших бита и установит бит Z.

При изменении битов регистра STATUS рекомендуется использовать команды, не влияющие на флаги АЛУ (SWAPF, MOVWF, BCF и BSF).

Рисунок 33 - Регистр STATUS

Назначение битов регистра STATUS:

IRP - Бит выбора банка при косвенной адресации (0 - банк РОН 0,1; 1 - банк РОН 2,3);

RP0, RP1 - Биты выбора банка РОН при прямой адресации;

-TO - Флаг переполнения сторожевого таймера;

-PD - Флаг включения питания (0 - после команды SLEEP);

Z - Флаг нулевого результата операции;

DC - Флаг десятичного переноса/заема в младшей тетраде;

С - Флаг переноса/заема при выполнении операции.

5.3 Слово конфигурации микроконтроллера

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

Биты конфигурации могут быть запрограммированы (читаются как «0») или оставлены без изменения (читаются как «1»), чтобы выбрать режим работы микроконтроллера.

Расположение битов конфигурации микроконтроллера представлено на рис. 34:

Рисунок 34 - Слово конфигурации

Биты данного слова выполняют следующие функции:

CP1, CP0 - Биты защиты памяти программ:

11 - Защита памяти программ выключена;

10 - Защищена память программ с адресами 1F00h-1FFFh;

01 - Защищена память программ с адресами 1000h-1FFFh;

00 - Защищена память программ с адресами 0000h-1FFFh.

DEBUG - Бит включения внутрисхемной отладки (ICD):

1 - Отладка отключена;

0 - Отладка включена (линии RB6, RB7 используются отладчиком).

WRT - Бит разрешения записи во FLASH память программ:

1 - Запись в FLASH память программ разрешена через регистр управления EECON;

1 - Запись в FLASH память программ запрещена через регистр управления EECON;

CPD - Бит защиты от записи в EEPROM данных:

0 - Защита записи в EEPROM память данных включена.

LVP - Бит разрешения низковольтного программирования:

1 - Низковольтное программирование включено (вывод RB3/PGM используется для программирования).

BODEN - Бит разрешения сброса по снижению напряжения питания:

1 - Разрешен сброс BOR.

-PWRTE - Бит разрешения работы таймера включения питания:

0 - PWRTE включен;

WDTE - Бит разрешения работы сторожевого таймера:

1 - Работа сторожевого таймера разрешена.

FOSC1, FOSC0 - Биты выбора режима работы тактового генератора:

11 - RC-генератор;

10 - HS-генератор (высокочастотный резонатор 4<f<20 МГц);

01 - XT-генератор (обычный резонатор 0,2<f<4 МГц);

00 - LP-генератор (низкочастотный резонатор f<200 кГц).

В макроассемблере MPASM предоставляется возможность определить биты конфигурации в исходном тексте программы с помощью директивы CONFIG. Использование директивы CONFIG гарантирует запись битов конфигурации при программировании микроконтроллера, что уменьшает риск запрограммировать неправильно слово конфигурации.

Пример использования директивы CONFIG:

LIST p = р16F877 ; Указываем тип процессора

INCLUDE <P16F877.INC> ; Подключаем определения регистров

; Настройка битов конфигурации

_CONFIG _XT_OSC & _PWRTE_ON & _BQDEN_OFF & _CP_OFF & _WDT_ON

org 0x00 ; Начало памяти программ

RESET_ADDR ; Первая команда после сброса

... ; Наша программа

end

Список стандартных имен, используемых в директиве CONFIG для процессора PIC16F877, указан в таблице 9:

Таблица 9 - Стандартные имена директивы CONFIG

Назначение

Символ

Тактовый генератор

_RC_OSC

_LP_OSC

_XT_OSC

_HS_OSC

Сторожей таймер WDT

_WDT_ON

_WDT_OFF

Таймер включения питания PWRT

_PWRTE_ON

_PWRTE_OFF

Сброс по снижению напряжения

_BODEN_ON

питания

_BODEN_OFF

Защита кода программы

_CP_ALL

_CP_ON

_CP_75

_CP_50

_CP_OFF

Защита EEPROM памяти данных

_DP_ON

_DP_OFF

По адресу 2000h-2003h расположена память, предназначенная для хранения контрольной суммы памяти программ и другой служебной информации (ID). Они доступны для чтения и записи только в режиме программирования микроконтроллера. Используются только младшие 4 бита в каждой ячейке.

5.4 Организация памяти программ

Микроконтроллеры среднего семейства имеют 13-разрядный счетчик команд, способный адресовать 8 Кх14 слов памяти программ, и 14-разрядную шину данных памяти программ. Все команды микроконтроллера состоят из 14-разрядного слова.

Вся память программ разделена на 4 страницы по 2 Кслов каждая (0000h-07FFh. 0800h-0FFFh. 1000h-17FFh. 1800h-1FFFh). На рис. 36 показана карта памяти программ и 8-уровневый аппаратный стек.

Рисунок 36 - Карта памяти программ и стек

Для перехода между страницами памяти программ необходимо изменить старшие биты регистра счетчика команд PC, записью в регистр специального назначения PCLATH (старший байт счетчика команд). Изменив значение регистра PCLATH, и выполнив команду ветвления, счетчик команд PC пересечет границу страницы памяти программ без дополнительного вмешательства пользователя.

В любом микроконтроллере PICmicro сброс приведет к очистке счетчика команд (PC), устанавливая адрес 0h. Адрес 0000h называется «адрес вектора сброса», т. к. будет выполнен переход по этому адресу при сбросе микроконтроллера. Вместе со счетчиком команд (PC) очищается регистр PCLATH. устанавливая рабочую страницу памяти программ 0.

Когда возникает разрешенное прерывание, в счетчик команд PC записывается адрес 0004h, называемый «адрес вектора прерываний», при этом значение регистра PCLATH не изменяется.

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

Счетчик команд PC.

13-разрядный регистр счетчика команд PC указывает адрес выбираемой команды для выполнения. Младший байт счетчика программ PCL доступен для чтения и записи. Старший байт РСН, содержащий биты счетчика команд PC <12:8>, не доступен для чтения и записи. Все операции с регистром РСН происходят через дополнительный регистр PCLATH.

Вычисляемый переход.

Вычисляемый переход может быть выполнен командой приращения к регистру PCL (например, ADDWF PCL). При выполнении вычисляемого перехода следует заботиться о том, чтобы значение PCL не пересекло границу блока памяти (каждый блок 256 байт).

При записи значения в регистр PCL, автоматически происходит перезапись 5 младших бит из регистра PCLATH<4:0> в регистр РСН.

Аппаратный стек.

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

В микроконтроллерах среднего семейства PICmicro реализован 8-уровневый 13-разрядный аппаратный стек. Стек не имеет отображения на память программ и память данных, нельзя записать или прочитать данные из стека. Значение счетчика команд заносится в вершину стека при выполнении инструкций перехода на подпрограмму (CALL) или обработку прерываний. Чтение из стека и запись в счетчик команд PC происходит при выполнении инструкций возврата из подпрограммы или обработки прерываний (RETURN, RETLW, RETFIE), при этом значение регистра PCLATH не изменяется.

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

Команды переходов (CALL, GOTO) в микроконтроллерах среднего семейства PICmicro имеют 11-разрядное поле для указания адреса, что позволяет непосредственно адресовать 2Кслов памяти программ. Микроконтроллер PIC16F877 имеет память программ 8Кслов. Для адресации верхних страниц памяти программ используются 2 бита в регистре PCLATH<4:3>. Перед выполнением команды перехода (CALL или GOTO) необходимо запрограммировать биты регистра PCLATH<4:3> для адресации требуемой страницы (Рис. 37 б, в).

а) Непосредственная запись в регистр PCL (PLATH<4:0>PCH)

б) Изменение значения PC при выполнении инструкции GOTO (PLATH<4:3>PCH).

в) Изменение значения PC при выполнении инструкции CALL (PLATH<4:3>PCH). Старое значение PC сохраняется в стеке.


Подобные документы

  • Семейство 16-разрядных микроконтроллеров Motorola 68HC12, их структура и функционирование. Модуль формирования ШИМ-сигналов. Средства отладки и программирования микроконтроллеров 68НС12. Особенности микроконтроллеров семейства MCS-196 фирмы INTEL.

    курсовая работа [239,6 K], добавлен 04.01.2015

  • Рассмотрение структуры и принципов работы таймеров/счетчиков (общего назначения, сторожевого, типов А, В, С, D, Е) микроконтроллеров и аналого-цифрового преобразователя семейства AVR с целью разработки обучающего компьютерного электронного пособия.

    курсовая работа [1,0 M], добавлен 06.03.2010

  • Использование микроконтроллеров AVR фирмы Atmel в проектируемой аппаратуре. Архитектура и общие характеристики прибора, предназначение арифметики логического устройства и понятие флэш-памяти. Формат пакета данных, алгоритм их передачи и система команд.

    контрольная работа [427,3 K], добавлен 12.11.2010

  • Структурная схема микроконтроллеров семейства MCS-51: отличительные особенности, назначение выводов, блок регистров специальных функций. Карта прямоадресуемых бит. Методы адресации, граф команд пересылки, обмена и загрузки. Ввод и отображение информации.

    курсовая работа [135,5 K], добавлен 22.08.2011

  • Адресное пространство микроконтроллеров MSP430F1xx. Байтовая и словная формы инструкций. Система команд MSP микроконтроллеров. Периферийные устройства микроконтроллеров MSP430F1xx. Аналого-цифровой преобразователь ADC12, его технические характеристики.

    курсовая работа [278,1 K], добавлен 04.05.2014

  • Микроконтроллер (MCU) — микросхема, предназначенная для управления электронными устройствами. Их можно встретить во многих современных приборах, в том числе и бытовых. Рассмотрение архитектуры различных микроконтроллеров, ядра, памяти, питания, периферии.

    реферат [216,5 K], добавлен 24.12.2010

  • Понятие и виды микроконтроллеров. Особенности программирования микропроцессорных систем, построение систем управления химико-технологическим процессом. Изучение архитектуры микроконтроллера ATmega132 фирмы AVR и построение на его основе платформы Arduino.

    курсовая работа [1,9 M], добавлен 13.01.2011

  • Проектирование специализированных радиоэлектронных устройств с применением микропроцессорных комплектов и цифровых микросхем среднего и малого уровней интеграции. Архитектура микроконтроллеров семейства INTEL8051. Программа устройства на Ассемблере.

    курсовая работа [42,3 K], добавлен 29.07.2009

  • Общая характеристика операций, выполняемых по командам базовой системы. Описание и мнемокоды команд, используемых при разработке программы на языке AVR Ассемблера. Основные принципы работы команд с обращением по адресу SRAM и к регистрам ввода–вывода.

    реферат [148,4 K], добавлен 21.08.2010

  • Классификация, структура, архитектура и модульная организация микроконтроллеров. Средства разработки программного обеспечения AVR-контроллеров. Директивы транслятора ассемблера, рабочая частота и циклы. Исследование арифметических и логических команд.

    методичка [3,0 M], добавлен 19.09.2019

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.