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

Пособие HCS12 & Elvis II v.7.01

.pdf
Скачиваний:
219
Добавлен:
03.05.2015
Размер:
4.14 Mб
Скачать

4.На вход микроконтроллера поступает последовательность прямоугольных импульсов, создаваемая функциональным генератором из набора инструментов ELVISmx. Написать программу, с помощью которой микроконтроллер будет генерировать сигналы в ответ на входящий. Параметры выходных импульсов показаны на рисунке ниже. Частота входного сигнала – 1 кГц. Выходные импульсные последовательности вывести на осциллограф Scope.

181

Лабораторная работа №4

Модуль аналого-цифрового преобразователя

Содержание

Ранее, в курсе программирования на ассемблере, уже изучался модуль АЦП микроконтроллера. Теперь же Вы ознакомитесь с ним более углублённо. В лабораторной работе рассматриваются разные режимы работы АЦП: одноканальный и многоканальный, однократный и непрерывный.

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

В процессе подготовки к лабораторной работе №4 рекомендуется повторно ознакомиться с модулем АЦП, его режимах работы. Также желательно рассмотреть пример, приведённый ниже.

Практическая часть

Пример 4.1. На вход микроконтроллера AN00 поступает аналоговый уровень напряжения, создаваемый инструментом Analog Level. Написать программу, с помощью которой микроконтроллер оцифровывает поступающий сигнал и выдаёт на виртуальный прибор Digital Reader. АЦП должен работать в 8-разрядном режиме с однократным преобразованием. При нажатии на кнопку PB1 вместо оцифрованного кода должен отображаться 0x00.

#include <hidef.h>

 

 

#include "derivative.h"

//Подключение файла, содержащего определение

#define PB1 PORTB_BIT0

 

//служебных регистров.

 

//Пользовательское макроопределение линии

#define DOWN 0

 

//подключения кнопки PB1.

 

//Пользовательское макроопределение нажатого

#define UP 0

 

//состояния кнопки.

 

//Пользовательское макроопределение отжатого

 

 

//состояния кнопки.

#define delay(us);

for(delay=us/2;delay!=0;delay--) asm NOP;

 

 

//Макроопределение кода создания программной

 

 

//задержки. Микросекунды переводятся в машинные

 

 

//циклы.

unsigned int delay;

 

//Переменная для создания задержки.

unsigned char BTN = UP;

//Переменная, хранящая состояние кнопки.

void main() {

 

 

PUCR |= 0x03;

 

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

DDRA = 0xFF;

 

//ножках портах A и B.

 

//Установка линий порта A на вывод.

PORTA = 0x00;

 

 

182

DDRB = 0x00;

//Установка линий порта B на ввод.

ATDCTL2 |= 0x82;

//Включение АЦП и прерываний по завершению

delay(50);

//его преобразований.

//Задержка в 50 мкс. Необходима для того, чтобы

 

//аналоговые компоненты АЦП пришли в рабочее

ATDCTL3 = 0x08;

//состояние после его включения.

//Одно преобразование в каждой последовательности.

ATDCTL4 |= 0x81;

//8-битное разрешение АЦП, частота его тактирования

ATDCTL5 = 0x00;

//fATD = fCLK/4 = 1 МГц.

//Выбор аналогового входа AN0, один канал,

 

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

asm CLI;

//последовательности.

//Разрешение прерываний в МК.

for(;;) {

//Бесконечный цикл опроса кнопки.

if (PB1 == UP) BTN = UP; else {

//Если кнопка не нажата, то

delay(1000);

 

 

//BTN = UP. Иначе сделать

 

 

//задержку в 1 мс. Если после неё

if (PB1 == DOWN) BTN = DOWN;

//кнопка ещё нажата, то

else delay(1000);

 

 

//BTN = DOWN. Иначе опять

}

 

 

//задержка и возврат на ожидание

 

 

//нажатия.

}

 

 

 

}

 

 

 

interrupt 22 void ATD0()

{

//Обслуживание прерывания по завершению

 

 

//преобразования АЦП.

if (BTN == UP) PORTA = ATDDR0H; //Если кнопка отжата, то вывести в порт

else PORTA = 0x00;

//оцифрованное значение.

//Иначе записать ноль.

ATDCTL5 = 0x00;

//Выбор ножки AN0 в качестве аналогового

}

//входа. Запуск новой последовательности

//преобразований сигнала с этого входа.

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

183

 

 

 

 

MCU_PORT

Разъём J2

 

 

(J6 или J7)

DAC0

 

 

 

AN00

 

 

 

 

MCU_PORT

Разъём J10

 

 

(J6 или J7)

PB1

 

 

 

PB0

MCU_PORT

 

 

 

(J6 или J7)

 

 

Разъём J4

PA7

 

 

 

DI7

 

 

PA6

 

 

 

DI6

 

 

 

PA5

 

 

 

DI5

 

 

 

 

 

 

 

 

PA4

 

 

 

DI4

 

 

 

PA3

 

 

 

DI3

 

 

 

PA2

 

 

 

DI2

 

 

 

PA1

 

 

 

DI1

 

 

 

PA0

 

 

 

DI0

 

 

 

Рис. 7.11. Необходимые соединения контактов на стенде

Задачи начального уровня для самостоятельной работы

1.На вход микроконтроллера AN4 поступает аналоговый уровень напряжения, создаваемый инструментом Analog Level. Написать программу, с помощью которой микроконтроллер оцифровывает поступающий сигнал и выдаёт на линейку из восьми светодиодов. АЦП должен работать в 8-разрядном режиме с однократным преобразованием. При нажатии на кнопку PB1 вместо оцифрованного кода должен отображаться 0x00.

2.На вход микроконтроллера AN0 поступает аналоговый уровень напряжения, создаваемый инструментом Analog Level. Написать программу, с помощью которой микроконтроллер оцифровывает поступающий сигнал и выдаёт на виртуальный прибор Digital Reader. АЦП должен работать в 10-разрядном режиме с однократным преобразованием. При нажатии на кнопку PB1 вместо оцифрованного кода должен отображаться 0x00.

3.На вход микроконтроллера AN0 поступает аналоговый уровень напряжения, создаваемый инструментом Analog Level. Написать программу, с помощью которой микроконтроллер оцифровывает поступающий сигнал и выдаёт на линейку из восьми светодиодов. АЦП должен работать в 8-разрядном режиме с однократным преобразованием. Если кнопка PB1 не нажата, то выводить на светодиоды код

0xFF.

4.На вход микроконтроллера AN0 поступает аналоговый уровень напряжения, создаваемый инструментом Analog Level. Написать программу, с помощью которой микроконтроллер оцифровывает поступающий сигнал и выдаёт на виртуальный прибор Digital Reader. АЦП должен работать в 8-разрядном режиме с однократным преобразованием. Нажатием на кнопку PB2 должно запускаться новое преобразование.

Задачи средней сложности для самостоятельной работы

1.На входы AN0 и AN5 микроконтроллера поступают два аналоговых уровня напряжения, создаваемые инструментом Analog Level. Написать программу, с помощью которой производится оцифровка поступающих сигналов. Полученные

184

коды показать с помощью виртуального прибора Digital Reader. Выбор отображаемого канала должен осуществляться с помощью двух кнопок: если была нажата и отпущена PB1, то выводится код первого сигнала, если PB2, – то второго. АЦП работает в 8-разрядном режиме с однократным преобразованием.

2.На входы AN1 и AN3 микроконтроллера поступают два аналоговых уровня напряжения, создаваемые инструментом Analog Level. Написать программу, с помощью которой производится оцифровка, а затем вычисление разности поступающих сигналов. Если уровень первого выше уровня второго, то отобразить на сколько в двоичном виде на приборе Digital Reader, иначе выводить ноль. АЦП работает в 10-разрядном непрерывном режиме.

3.На входы AN6 и AN7 микроконтроллера поступают два аналоговых уровня напряжения, создаваемые инструментом Analog Level. Реализовать цифровой компаратор. Выходом должна являться ножка 5 порта B, подключить её к инструменту Scope. АЦП работает в 8-разрядном режиме с однократным преобразованием.

4.На входы AN2 и AN4 микроконтроллера поступают два аналоговых уровня напряжения, создаваемые инструментом Analog Level. Написать программу, с помощью которой производится оцифровка, а затем операция логического “ИЛИ” между двумя сигналами. Полученный результат вывести на линейку светодиодов. АЦП работает в 10-разрядном непрерывном режиме.

5.На вход AN1 микроконтроллера поступает аналоговый сигнал, создаваемый функциональным генератором из набора инструментов ELVISmx, ножка AN5 же принимает некоторый уровень напряжения от прибора Analog Level. Реализовать программный триггер Шмитта. Его выходом должна являться ножка 1 порта B, подключить её к инструменту Scope. АЦП работает в 8-разрядном непрерывном режиме.

Сложные задачи для самостоятельной работы

1.На вход AN7 микроконтроллера поступает аналоговый сигнал, создаваемый функциональным генератором из набора инструментов ELVISmx. Измерить период этого сигнала и отобразить его на панели виртуального прибора T out.

2.На вход AN5 микроконтроллера поступает аналоговый сигнал, создаваемый функциональным генератором из набора инструментов ELVISmx. Измерить минимальное мгновенное значение этого сигнала и отобразить его на панели виртуального прибора Voltage out.

3.На вход AN3 микроконтроллера поступает аналоговый сигнал, создаваемый функциональным генератором из набора инструментов ELVISmx. Измерить максимальное мгновенное значение этого сигнала и отобразить его на панели виртуального прибора Voltage out.

4.На вход AN1 микроконтроллера поступает аналоговый сигнал, создаваемый функциональным генератором из набора инструментов ELVISmx. Измерить среднее значение этого сигнала и отобразить его на панели виртуального прибора Voltage out.

185

Лабораторная работа №5

Последовательный синхронный интерфейс SPI

Содержание

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

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

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

Практическая часть

Пример 5.1. Написать программу, с помощью которой микроконтроллер постоянно выдаёт код 0x32 через встроенный модуль SPI. Каждую отправку осуществлять с задержкой в 250 мкс. Частоту передачи по последовательному интерфейсу сделать равной 62.5 кГц. Фиксация данных должна происходить по чётным фронтам тактового сигнала с нулевым активным уровнем. Выведите сигналы MOSI и SCK на осциллограф Scope, объясните полученные результаты.

#include <hidef.h> #include "derivative.h"

#define delay(us);

for(delay=us/2;delay!=0;delay--) asm NOP;

 

//Макроопределение кода создания программной

 

//задержки. Микросекунды переводятся в машинные

 

//циклы.

 

unsigned int delay;

//Переменная для создания задержки.

void main() {

 

 

PERM |= 0x3C;

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

DDRM |= 0x3C;

//ножках 2, 3, 4 и 5 порта M.

//Установка линий порта M на вывод.

SPIBR = 0x04;

//Установка частоты обмена fBUS/(2·16) = 62.5 кГц.

SPICR1 = 0x5C;

//Включение модуля SPI, режим master (МК –

 

//ведущий), нулевой активный уровень тактового

EnableInterrupts;

//сигнала, отработка по чётным фронтам (2, 4, …).

//Разрешение прерываний.

for(;;) {

 

 

asm LDAA SPISR;

//Чтение регистра SPISR. Этой операцией сбрасывается

SPI = 0x32;

//флаг SPTEF.

 

//Высылаем нужные данные.

while(SPISR_SPTEF == 0);

//Ждём, когда установится флаг

 

 

186

delay(250);

//опустошения регистра передачи.

//Задержка ~250 мкс.

}

}

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

 

 

 

 

BNC-разъём

MCU_PORT

 

 

платформы

(J6 или J7)

 

 

Elvis II

MOSI0

 

 

 

CH0

 

 

SCK0

 

 

 

CH1

 

 

 

Рис. 7.12. Необходимые соединения контактов на стенде

Результат исполнения программы приведён на рисунке ниже.

Рис. 7.13. Временные диаграммы высылки кода по синхронному последовательному интерфейсу

Задачи начального уровня для самостоятельной работы

1.Написать программу, с помощью которой микроконтроллер постоянно выдаёт код 0x51 через встроенный модуль SPI. Каждую отправку осуществлять с задержкой в 300 мкс. Частоту передачи по последовательному интерфейсу сделать равной 50 кГц. Фиксация данных должна происходить по чётным фронтам тактового сигнала с нулевым активным уровнем. Выведите сигналы MOSI и SCK на осциллограф Scope, объясните полученные результаты.

2.Написать программу, с помощью которой микроконтроллер постоянно выдаёт код 0xCD через встроенный модуль SPI. Каждую отправку осуществлять с задержкой в 400 мкс. Частоту передачи по последовательному интерфейсу сделать равной 41.66 кГц. Фиксация данных должна происходить по чётным фронтам тактового сигнала

187

с единичным активным уровнем. Выведите сигналы MOSI и SCK на осциллограф Scope, объясните полученные результаты.

3.Написать программу, с помощью которой микроконтроллер постоянно выдаёт код 0x4E через встроенный модуль SPI. Каждую отправку осуществлять с задержкой в 250 мкс. Частоту передачи по последовательному интерфейсу сделать равной 62.5 кГц. Фиксация данных должна происходить по нечётным фронтам тактового сигнала с нулевым активным уровнем. Выведите сигналы MOSI и SCK на осциллограф Scope, объясните полученные результаты.

4.Написать программу, с помощью которой микроконтроллер постоянно выдаёт код 0xA9 через встроенный модуль SPI. Каждую отправку осуществлять с задержкой в 450 мкс. Частоту передачи по последовательному интерфейсу сделать равной 31.25 кГц. Фиксация данных должна происходить по нечётным фронтам тактового сигнала с единичным активным уровнем. Выведите сигналы MOSI и SCK на осциллограф Scope, объясните полученные результаты.

Задачи средней сложности для самостоятельной работы

1.Написать программу, с помощью которой микроконтроллер постоянно выдаёт код 0xB2 через встроенный модуль SPI. Каждую отправку осуществлять с некоторой задержкой, формируемой с помощью подсистемы таймера. Частоту передачи по последовательному интерфейсу сделать равной 50 кГц. Фиксация данных должна происходить по чётным фронтам тактового сигнала с единичным активным уровнем. Выведите сигналы MOSI и SCK на осциллограф Scope, объясните полученные результаты.

2.Написать программу, с помощью которой микроконтроллер постоянно выдаёт код 0x7321 через встроенный модуль SPI. Каждую отправку пакета из 2 байт осуществлять с некоторой задержкой и младшим битом вперёд. Частоту передачи по последовательному интерфейсу сделать равной 41.66 кГц. Фиксация данных должна происходить по нечётным фронтам тактового сигнала с нулевым активным уровнем. Выведите сигналы MOSI и SCK на осциллограф Scope, объясните полученные результаты.

3.Написать программу, с помощью которой микроконтроллер постоянно выдаёт код 0x831D через встроенный модуль SPI. Каждую отправку пакета из 2 байт осуществлять с некоторой задержкой. Частоту передачи по последовательному интерфейсу сделать равной 62.5 кГц. Фиксация данных должна происходить по нечётным фронтам тактового сигнала с единичным активным уровнем. Выведите сигналы MOSI и SCK на осциллограф Scope, объясните полученные результаты.

4.Написать программу, с помощью которой микроконтроллер постоянно выдаёт код 0x65F3 через встроенный модуль SPI. Каждую отправку пакета из 2 байт осуществлять с некоторой задержкой и младшим битом вперёд. Частоту передачи по последовательному интерфейсу сделать равной 50 кГц. Фиксация данных должна происходить по чётным фронтам тактового сигнала с нулевым активным уровнем. Выведите сигналы MOSI и SCK на осциллограф Scope, объясните полученные результаты.

5.Написать программу, с помощью которой микроконтроллер постоянно выдаёт код 0xC5 через встроенный модуль SPI. Каждую отправку осуществлять старшим битом вперёд и с некоторой задержкой, формируемой с помощью подсистемы таймера. Частоту передачи по последовательному интерфейсу сделать равной 50 кГц. Выведите сигналы MOSI и SCK на осциллограф Scope, объясните полученные результаты.

6.Написать программу, с помощью которой микроконтроллер постоянно выдаёт код 0x9A через встроенный модуль SPI. После каждой высылки создать некоторую задержку, формируемую с использованием прерывания по завершению отправки. Частоту передачи по последовательному интерфейсу сделать равной 62.5 кГц.

188

Выведите сигналы MOSI и SCK на осциллограф Scope, объясните полученные результаты.

Сложные задачи для самостоятельной работы

1.Написать программу, с помощью которой микроконтроллер принимает код на порте A, создаваемый виртуальным инструментом Digital Reader и отправляет через встроенный модуль SPI. Каждую отправку осуществлять с некоторой задержкой, задавая интервал времени с помощью подсистемы таймера, и старшим битом вперёд. Частоту передачи по последовательному интерфейсу сделать равной 50 кГц. Выведите сигналы MOSI и SCK на осциллограф Scope, объясните полученные результаты.

2.Написать программу, с помощью которой микроконтроллер измеряет период сигнала, создаваемого виртуальным инструментом Two Channel Generator, и отправляет полученное 1- или 2-байтное значение через встроенный модуль SPI. Каждую высылку осуществлять с некоторой задержкой. Частоту передачи по последовательному интерфейсу сделать равной 31.25 кГц. Выведите сигналы MOSI и SCK на осциллограф Scope, объясните полученные результаты.

3.На вход AN5 микроконтроллера поступает аналоговый уровень напряжения, создаваемый инструментом Analog Level. Оцифруйте сигнал в 10-разрядном режиме и вышлите полученный код по интерфейсу SPI. Отправку осуществлять с некоторой периодичностью. Частоту передачи по последовательному интерфейсу сделать равной 61.5 кГц. Выведите сигналы MOSI и SCK на осциллограф Scope, объясните полученные результаты.

4.Написать программу, с помощью которой микроконтроллер постоянно выдаёт код 0x12C0EF через встроенный модуль SPI. Каждую отправку пакета из 3 байт осуществлять с некоторой задержкой, формируемой с помощью подсистемы таймера. Частоту передачи по последовательному интерфейсу сделать равной 41.66 кГц. Фиксация данных должна происходить по чётным фронтам тактового сигнала с единичным активным уровнем. Выведите сигналы MOSI и SCK на осциллограф Scope, объясните полученные результаты.

189

Лабораторная работа №6

Последовательный асинхронный интерфейс SCI

Содержание

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

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

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

Практическая часть

Пример 6.1. Написать программу, с помощью которой микроконтроллер постоянно выдаёт код 0x6D через встроенный модуль SCI. Каждую отправку осуществлять с задержкой в 250 мкс. Частоту передачи по последовательному интерфейсу установить равной 62.5 кГц, формат кадра – 8 бит. Выведите сигналы TxD и RxD на осциллограф Scope, объясните полученные результаты.

#include <hidef.h> #include "derivative.h"

#define delay(us);

for(delay=us/2;delay!=0;delay--) asm NOP;

 

//Макроопределение кода создания программной

 

//задержки. Микросекунды переводятся в машинные

 

//циклы.

 

unsigned int delay;

//Переменная для создания задержки.

void main() {

 

 

PERS |= 0x03;

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

DDRS |= 0x03;

//ножках 0 и 1 порта S.

//Установка линий 0 и 1 порта S на вывод.

SCIBD = 0x02;

//Установка частоты обмена fSCI = fBUS/(16·2) = 62.5 кГц.

SCICR2 = 0x08;

//Включение модуля SCI, только передача информации.

EnableInterrupts;

//Разрешение прерываний.

for(;;) {

 

 

asm LDAA SCISR1;

//Чтение регистра SPISR. Это операцией сбрасывается

SCIDRL = 0x6D;

//флаг TDRE.

 

//Высылаем нужные данные.

while(SCISR1_TDRE == 0);

//Ждём, когда установится флаг

delay(250);

 

//опустошения регистра передачи.

 

//Задержка ~250 мкс.

 

 

190