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

Методическое пособие 140

.pdf
Скачиваний:
2
Добавлен:
30.04.2022
Размер:
460.08 Кб
Скачать

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

Таймеры могут работать в одном из четырех режимов:

режим 0: 13-битный таймер;

режим 1: 16-битный таймер;

режим 2: 8-битный автоперезагружаемый таймер;

режим 3: таймер 0 как 2 раздельных 8-битных таймера. Кроме того, таймер 1 можно использовать для задания

скорости передачи (baud rate) последовательного порта.

Для переключения режимов работы таймеров используются биты M0 и M1 регистра специальной функции TMOD (прил. 2). Название образовано от сокращения двух английских слов: T(timer) – таймер и mode – режим.

Таймер может включаться и выключаться битами TR0, TR1 (timer restart). Биты включения таймеров TR0 и TR1 размещены в регистре TCON (timer control) (см. прил. 2).

Для работы таймера также необходимо разрешить прерывания, установив в 1 ET0 или ET1 (enable timer) в регистре масок прерываний IE, а также снять блокировку подсистемы прерываний через управляющий бит EA.

В лабораторной работе будем использовать режим 2 таймера/счетчика, поэтому рассмотрим особенности этого режима. В режиме 1 имеем дело с 16-битным таймером. В режиме 2 регистр таймера TLi работает как 8-битный счетчик с автоматической перезагрузкой начального значения из регистра ТНi в регистр TLi. Переполнение регистра TLi не только устанавливает флаг TFi, но и загружает регистр TLi содержимым регистра ТНi, который предварительно инициализируется программно. Перезагрузка не изменяет содержимое регистра ТНi.

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

11

установить для таймера режим автоперезагрузки. В этом режиме при переполнении таймера его регистры загружаются заранее определенными значениями, что исключает необходимость инициализации. Для таймеров 0 и 1 режим автоперезагрузки устанавливается следующим образом: в регистр THx помещается значение автоперезагрузки, при этом регистр TLx при переполнении перезагружается значением, указанным в THx. Значение THx при этом остается неизменным; в регистре TMOD указывается значение режима работы, равное 2. Например, если в регистре TH0 указать значение 150, то регистр TL0 при перезагрузке каждый раз будет инкрементироваться, начиная со значения 150 и заканчивая 255. Таким образом, при установке режима автоперезагрузки для таймеров 0 и 1 значение THx остается неизменным, а сам таймер фактически работает в 8-битовом режиме.

Пример написания обработчика прерывания для работы с таймером/счетчиком 0 в режиме 1 приведен ниже.

void timer0ISR (void) interrupt 1

{

//вставить тело обработчика прерываний

}

main(void)

{

TH0 = 0; //инициализация старшего байта Т/С0 TL0 = 0; //инициализация младшего байта Т/С0 TMOD |= 0x1;//установка режима 1 Т/С0

TR0 = 1; //разрешение работы Т/С0

ET0 = 1; // разрешение прерываний от Т/С0

EA = 1;//снятие блокировки подсистемы прерываний

//вставить необходимый программный код

}

12

После ключевого слова interrupt стоит 1. Это означает, что обрабатываться будут прерывания от Т/С0, и обработчик прерываний будет расположен по адресу 0x00B (см. табл. 2).

Задания на лабораторную работу

Задание 1. Подключите к МПС на основе МК iMCS-51 светодиод. Разработайте программный модуль, который изменяет состояние светодиода с частотой, заданной преподавателем, в режиме программно-управляемой передачи данных, инициализируемой МК. Отладьте программный модуль.

Задание 2. Подключите к МПС на основе МК iMCS-51 светодиод. Разработайте программный модуль, который изменяет состояние светодиода с частотой, заданной преподавателем. Способ передачи данных – посредством прерываний от таймера. Используйте второй режим работы таймера/счетчика (режим автоперезагрузки). Отладьте программный модуль.

Пояснения к выполнению задания № 2

В функции main() обязательно нужно установить биты ЕА, TRi, ETi, инициализировать THi, а также режим работы таймера в регистре TMOD. Начальное значение THi выбирается по усмотрению разработчика программы. При этом нужно иметь в виду, что обработчик прерываний должен успеть выполнить предписанные ему действия до наступления следующего прерывания. Например, если записать максимально возможное число в TH0 255 (0xFF), то время отработки обработчика прерываний составит 1 машинный такт. Функция main() должна заканчиваться бесконечным циклом.

Обработчик прерываний будет подсчитывать прерывания, которые во втором режиме происходят при переполнении ре-

гистра TLx c частотой 12 МГц / (12 · (256 – (TH0)).

13

Перед написанием программы необходимо вычислить, сколько прерываний должно произойти для отработки заданного временного интервала. Пусть таких прерываний будет Т. Тогда частота, с которой будет изменяться состояние светодиода, составит 12 МГц / (12 · T · (256 – (TH0)). Для того чтобы определить Т, нужно приравнять это выражение к частоте, заданной преподавателем. В обработчике необходимо определить переменную, в которой будет храниться число прерываний от таймера, и как только произойдет Т прерываний – изменить состояние светодиодов, а переменную сбросить в 0.

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

1.Сколько портов ввода/вывода содержит МК iMCS-51?

2.Каково функциональное назначение порта Р3?

3.Как обратиться к разряду порта на языке СИ51?

4.Как вывести число в порт МК iMCS-51?

5.Что такое «принцип наложения сред» и с какой целью он используется в архитектуре однокристальных контроллеров?

6.Что такое таймер/счетчик МК iMCS-51?

7.Как синхронизировать процесс в МПС на основе МК iMCS-51 без использования таймера/счетчика?

8.По какому алгоритму работает реализованный Вами обработчик прерываний от таймера/счетчика?

9.Как рассчитывается временной интервал события при использовании программно-управляемой передачи данных, инициализируемой МК (задание 1)?

10.Как рассчитывается временной интервал при использовании передачи данных по прерыванию от таймера/счетчика?

11.Какие управляющие биты Вы использовали для инициализации таймера/счетчика?

12.Что такое метод передачи данных по прерыванию, и в чем его сущность?

13.Что такое вектор прерывания?

14

14.Что такое обработчик прерывания?

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

16.Как осуществить выбор вектора прерывания для описания обработчика прерывания?

Домашнее задание

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

15

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

УНИВЕРСАЛЬНЫЙ АСИНХРОННЫЙ ПРИЕМОПЕРЕДАТЧИК МК iMCS-51

Цель работы: изучение основ последовательной передачи данных между микроконтроллерами.

Краткие теоретические сведения

Через универсальный асинхронный приемопередатчик (УАПП), который в литературных источниках часто называют последовательным портом, осуществляются прием и передача информации, представленной в последовательном коде (младшими битами вперед). Наличие буферного регистра приемника SBUF позволяет совмещать операцию чтения ранее принятого байта с приемом очередного. Но если к моменту окончания приема байта предыдущий не был считан из SBUF, то он будет потерян. Работой последовательного порта управляют три регистра:

регистр управления/статуса приемопередатчика микроконтроллера SCON (sequential – последовательный, control – управлять);

бит SMOD регистра управления мощностью МК PCON (power control);

буферный регистр приемопередатчика SBUF.

Регистр SCON содержит не только управляющие биты, определяющие режим работы последовательного порта, но и девятый бит принимаемых или передаваемых данных (RB8 и ТВ8), а также биты прерывания приемопередатчика (R1 и Т1).

Последовательный порт микроконтроллера iMCS-51 может быть настроен на работу в одном из четырех различных режимов.

16

Режим 0. Синхронный режим.

Информация передается и принимается через вывод входа приемника RxD. Принимаются или передаются 8 бит данных. Через вывод TxD выдаются импульсы синхронизации, которые сопровождают каждый бит. Скорость передачи фиксирована и составляет 1/12 Fг, где Fг – частота кварцевого резонатора.

Режим 1. Асинхронный 8-ми битовый режим.

Передаются (через TxD) или принимаются (через RxD) 10 бит: старт-бит (логический 0), 8 бит данных (младшим разрядом вперед) и стоп-бит (логическая 1). При приеме стоп-бит поступает в бит RB8 регистра SCON. Скорость передачи в режиме 1 является переменной: для управления скоростью передачи можно использовать таймер Т1 и/или Т2.

Режим 2. Асинхронный 9-ти битовый режим с фиксированной скоростью передачи.

Передаются (через TxD) или принимаются (через RxD) 11 бит: старт-бит, 8 бит данных (младшим разрядом вперед), программируемый 9-й бит данных и стоп-бит. При передаче в 9-й бит данных (бит ТВ8 регистра SCON) может быть записан логический 0 или 1, например, значение бита четности (бит Р регистра PSW). При приеме 9-й бит данных поступает в бит RB8 регистра SCON. Присутствие стоп-бита контролируется схемой обнаружения ошибки кадра. Скорость передачи программируется и может быть равна либо 1/32, либо 1/64 частоты резонатора в зависимости от управляющего бита SMOD.

Режим 3. Асинхронный 9-ти битовый режим.

Этот режим совпадает с режимом 2 во всех деталях, за исключением частоты приема/передачи, которая задается таймером.

Во всех четырех режимах передача начинается любой командой, которая использует SBUF как регистр-приемник. Прием в режиме 0 начинается при условии RI = 0, REN = 1. Прием в других режимах начинается с приходом старт-бита, если бит REN установлен.

17

Флаг прерывания передатчика ТI устанавливается аппаратно в конце периода передачи стоп-бита во всех режимах. Соответствующая подпрограмма обслуживания прерывания должна сбрасывать бит TI.

Флаг прерывания приемника RI устанавливается аппаратно в конце периода приема восьмого бита данных в режиме 0 и в середине периода приема стоп-бита в режимах 1, 2 и 3. Подпрограмма обслуживания прерывания должна сбрасывать бит

RI.

Все библиотечные функции ввода/вывода, такие как printf(), scanf(), getchar(), putchar() и т. д., работают с вво-

дом/выводом через последовательный порт микроконтроллера. Это означает, например, что хорошо знакомая программистам функция printf() классического ANSI CИ в компиляторе С51 выводит данные в последовательный порт микроконтроллера iMCS-51, а не на экран консоли. Точно так же стандартная библиотечная функция СИ scanf() в СИ51 ожидает приема данных с последовательного порта, а не с консоли, как в обычных компиляторах СИ.

Задание на лабораторную работу

Организуйте связь по последовательному каналу между двумя МПС, реализованными на базе МК iMCS-51. Режим работы – асинхронный, двунаправленный.

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

18

Ucc

 

RxD

 

 

RST

RESET

TxD

 

Uss

 

 

 

 

ALE

 

EA

PSEN

 

 

 

XTAL2

P2.0

 

 

 

 

P2.1

 

XTAL1

P2.2

 

 

P2.3

 

 

P2.4

 

 

P2.5

 

 

P2.6

 

 

P2.7

RxD

TxD

RESET

 

ALE

EA

PSEN

 

XTAL2

P2.0

 

 

P2.1

XTAL1

P2.2

 

P2.3

 

P2.4

 

P2.5

 

P2.6

 

P2.7

Рис. 3. Функциональная схема подсистемы последовательного обмена данными между однокристальными

микроконтроллерами iMCS-51

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

#include <REG51.h>

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

#include <stdio.h>

//intrins.h – файл заголовка, обеспечивающий работу со //строковыми данными

#include <intrins.h>

main()

{

int i; //переменная цикла

unsigned char s[5]=”Hello”;//слово, выводимое через УАПП

19

EA=1;//разрешение прерываний SM1=1;//задание режима работы УАПП SM0=0;//задание режима работы УАПП TH1=0x56;//для задания частоты прерываний от

//таймера1

TMOD=0x2;//задаем режим работы таймера TR1=1;//запускаем таймер1 ET1=1;//разрешаем прерывания от таймера1 REN=0;//запрещаем прием данных через УАПП for(i=0; i<5; i++)

{

TI=1;//установка флага прерывания передатчика putchar(s[i]);//вывод символа через УАПП

}

for(;;);

}

Требуется написать и отладить фрагмент программы инициализации каналов для машины-приемника, а также приема последовательности заданной длины. Для этого достаточно скорректировать вышеприведенный модуль. Обращение к функции ввода будет выглядеть как

s[i]=getchar();

Также в программном модуле необходимо разрешить прием данных через УАПП и установить флаг прерывания приемника.

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

1.В чем сущность последовательной и параллельной передачи данных?

2.В чем сущность методов асинхронной и синхронной передачи информации?

3.Что представляет собой УАПП МК iMCS-51?

20