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

Министерство образования и науки Украины Государственное высшее учебное заведение «Приазовский государственный технический университет» Кафедра автоматизации и компьютерных технологий

Сокол С.П.

ОБРАБОТКА ВНЕШНИХ ПРЕРЫВАНИЙ

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

по курсу «Микропроцессорная техника» для студентов направления 6.050202 «Автоматизация и

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

Мариуполь 2014

УДК 658.5

Обработка внешних прерываний : Методические указания к выполнению лабораторной работы по курсу «Микропроцессорная техника» для студентов направления подготовки 6.050202 «Автоматизация и компьютерноинтегрированные технологии» дневной и заочной форм обучения. / сост. С.П. Сокол. – Мариуполь: ГВУЗ «ПГТУ», 2014.- 13 с.

Сформулированы цель и задачи лабораторной работы. Изложены необходимые теоретические сведения для

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

Составитель: С.П. Сокол ст. преподаватель

Рецензент: А.А. Койфман, ст. преподаватель

Утверждено на заседании кафедры АиКТ

Протокол № ___ от ____ 2014 г.

Утверждено методической комиссией факультета информационных технологий,

протокол № 3 от 05 февраля 2014 г.

©ГВУЗ «ПГТУ», 2014

2

 

СОДЕРЖАНИЕ

 

ВВЕДЕНИЕ....................................................................................

4

1

ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ ПОЛОЖЕНИЯ ....................

5

2

ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУ............................

9

3

ТРЕБОВАНИЯ К ОФОРМЛЕНИЮ ОТЧЕТА.........................

12

4

ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ.......................................

12

5

СПИСОК РЕКОМЕНДОВАННЫХ ИСТОЧНИКОВ..............

13

3

ВВЕДЕНИЕ

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

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

Задачи лабораторной работы:

-ознакомление механизмом прерываний

-получение навыков конфигурирования регистров управления внешними прерываниями;

-получение общих сведений о программировании внешних прерываний при помощи программной среды IAR Embedded Workbench.

Лабораторная работа является четвертой в курсе «Микропроцессорная техника» и содержит информацию о программировании обработки внешних прерываний микроконтроллеров MSP430 на языке С.

На выполнение данной работы отводится 4 академических

часа.

Для выполнения лабораторной работы студентам требуется наличие компьютера с установленной программой IAR Embedded Workbench for MSP430, которую можно найти в интернете на официальном сайте, либо на сервере кафедры.

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

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

Максимальное количество баллов, которое студент может получить за выполнение данной лабораторной работы – 10.

4

1 ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ ПОЛОЖЕНИЯ

Как следует из названия, «прерывание» – это механизм, позволяющий прервать ход выполнения программы для реагирования на какое-либо событие. Прерывания бывают внешние, то есть инициированные пользователем либо внешним устройством (по изменению состояния выводов, при поступлении данных по цифровому интерфейсу), и внутренние, возникающие вследствие наступления тех или иных событий внутри контроллера (переполнение таймера, окончание цикла расчета АЦП и др.).

Количество источников прерываний зависит от набора периферийных модулей контроллера.

Как было описано в методических указаниях ко второй лабораторной работе, для работы с каждым портом вводавывода в микроконтроллере определено от шести до девяти регистров. При этом было рассмотрено четыре из них: PxIN, PxOUT, PxDIR и PxREN. Для настройки прерываний потребуется еще три регистра.

В микроконтроллерах подсемейства MSP430х2xxx источником прерывания по изменению состояния выводов могут выступать только порты Р1 и Р2. Поскольку в установленном на отладочной плате контроллере MSP430G2001 имеются только эти порты, то данное ограничение является несущественным, но при использовании микроконтроллеров с большим числом выводов следует о нем помнить.

Для разрешения прерывания по изменению состояния выводов используется регистр PxIE, где х = 1 или 2. Если какойто бит этого регистра равен единице, то соответствующий ему вывод порта Р1 или Р2 может выступать источником прерывания, если же он равен нулю, то при изменении состояния вывода прерывание не генерируется.

Регистр PxIES определяет условие, при котором может возникать прерывание. Если соответствующий какому-либо выводу бит этого регистра равен нулю, то прерывание может генерироваться только при изменении состояния вывода от нуля

5

к единице (по фронту импульса), а если единице – то при изменении от единицы к нулю (по спаду импульса).

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

В качестве примера выполним ту же задачу, что и в лабораторной работе №2, но с использованием прерываний. При подаче питания включается светодиод LED1, а LED2 погашен. При нажатии и удержании кнопки S2 светодиод LED1 гаснет, а LED2 включается. При отпускании кнопки S2 все возвращается в исходное состояние.

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

#include <msp430.h> //1.Подключение заголовочного файла микроконтроллеров MSP430

//2.

#pragma vector=PORT1_VECTOR//3.Вектор прерывания по изменению состояния выводов порта Р1

__interrupt void Port1_ISR (void)//4.Функция, вызываемая при

прерывании

//5.

{

while (~P1IN&BIT3)

//6.Пока кнопка S2 нажата,

{//7.

P1OUT

|= BIT6;

//8.включить светодиод LED2

P1OUT

&=~BIT0;

//9.и выключить LED1

}//10.После отпускания кнопки S2

P1OUT |= BIT0;

//11.включить светодиод LED1

P1OUT &=~BIT6;

//12.и выключить LED2

P1IFG &= ~BIT3;

//13.Сброс флага прерывания по

изменению состояния вывода Р1.3

}

//14.

int main(void)

//15.

//16.Главная функция программы

{

//17.

WDTCTL =WDTPW|WDTHOLD;//18.Остановка сторожевого таймера

P1DIR = BIT0|BIT6;

//19.Перевод линий Р1.0 и Р1.6 на

выход

//20.Включение подтягивающего

P1REN = BIT3;

резистора на линии Р1.3

6

P1OUT =

BIT3;

//21.Подключение вывода Р1.3 к плюсцу

питания через подтягивающий резистор

P1IES = BIT3;

//22.Конфигурация прерывания по спаду

импульса на линии Р1.3

P1IE = BIT3;

//23.Разрешение прерывания по изменению

состояния вывода Р1.3 __bis_SR_register(SCG1|SCG0|CPUOFF|OSCOFF|GIE);//24.

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

while (1); //25.Бесконечный цикл

}//26.

Структура этой программы отличается от рассмотренных ранее. Разберем ее более подробно.

Главная функция программы main располагается с 16 по 26 строки. Рассмотрим сначала ее. Строки с 18 по 21 были описаны

впредыдущих методических указаниях. В строке 22 задается фронт, по которому будет происходить внешнее прерывание. Поскольку нажатие на кнопку соответствует изменению напряжения на входе микроконтроллера с высокого на низкий уровень, то бит 3 регистра P1IES необходимо установить в «1», что и происходит в строке 22. В строке 23 разрешается прерывание по изменению состояния вывода P1.3, к которому подключена кнопка S2. В строке 24 отключаются все источники тактирования (SCG1, SCG0, OSCOFF), останавливается ЦПУ (CPUOFF) и разрешается механизм работы прерываний (GIE). Бит GIE необходимо устанавливать всегда при работе с прерываниями, поскольку по умолчанию механизм прерываний

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

Встроках 3-14 описывается подпрограмма обработки прерывания по изменению состояния вывода P1.3.

Встроке 3 директивой компилятора pragma задается вектор прерывания, которое должно быть обработано. Структура этой строки всегда одинакова. Сначала указывается директива #pragma vector, а затем после знака «=» указывается название обрабатываемого прерывания, в данном случае PORT1_VECTOR. Названия эти определены в заголовочном

7

файле каждого контроллера, вызвать который можно путем клика правой кнопкой мыши на любом из названий регистров микроконтроллера и выбора в появившемся контекстном меню пункта «Go to definition of <имя регистра>».

Встроке 4 объявляется функция void Port1_ISR (void) с префиксом __interrupt, который дает компилятору знать, что эта функция является обработчиком прерывания. Название ее может быть произвольным, но передаваемых в функцию параметров быть не должно, обязательно указывать «void». То же касается и возвращаемого функцией значения.

Строки 3 и 4 обязательно должны следовать одна за другой подряд без всяких разрывов.

Способ реализации поставленной задачи без прерываний (как в лабораторной работе №2) и с прерываниями несколько различен. Это связано с тем, что без использования прерываний процессор постоянно опрашивает состояние кнопки, и в любой момент может отреагировать не только на изменение ее состояния, но и на ее длительное удержание в каком-то состоянии.

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

Вмомент нажатия на кнопку S2 инициируется прерывание по изменению состояния вывода. При этом автоматически вызывается функция Port1_ISR и начинает выполняться код этой функции. По завершению работы этой функции процессор снова автоматически переходит в спящий режим. Следовательно, внутри этой функции необходимо описать и действия, выполняемые при нажатии кнопки, и действия, выполняемые при ее отпускании.

Встроке 6 объявлено начала цикла, который выполняется, пока кнопка нажата. Внутри этого цикла включается светодиод LED2 (строка 8) и выключается светодиод LED1 (строка 9). При отпускании кнопки происходит прекращение работы этого цикла, и выполняются следующие строки. Включается

8

светодиод LED1 и выключается LED2 (строки 11 и 12 соответственно). Затем происходит сброс флага прерывания (строка 13). Его необходимо осуществлять всегда по завершении подпрограммы обработки прерывания во избежание зацикливания контроллера внутри этой подпрограммы.

2 ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУ

Студентам, претендующим на оценки «хорошо» и «отлично», выбрать из таблицы 2.1 задание в соответствии с номером по журналу группы и выполнить его с использованием программной среды IAR Embedded Workbench и отладочной платы MSP-EXP430G2 LaunchPad.

Студентам, претендующим на оценку «удовлетворительно», выбрать задание из таблицы 2.2 также в соответствии с номером по журналу группы.

Для выполнения заданий необходимо соответствующим образом сконфигурировать все необходимые регистры. Обработку нажатия кнопки S2 осуществлять при помощи соответствующего прерывания.

 

Таблица 2.1 – Задание на лабораторную работу на оценки

 

«хорошо» и «отлично»

Задание

1.Установить частоту работы ЦПУ равной 125 кГц. Отключить все неиспользуемые источники тактирования и ЦПУ. Организовать генератор случайных чисел следующим образом. При запуске контроллера считать количество проходов цикла программы. При нажатии на кнопку S2 проверять получившееся число. Если оно четное, то включить светодиод LED2, а если нечетное – LED1. При отпускании кнопку оба светодиода погасить, а счетную переменную обнулить. Процесс повторять циклически.

2.Установить частоту работы ЦПУ равной 1,5 кГц. Отключить все неиспользуемые источники тактирования, ЦПУ оставить включенным. При запуске контроллера ожидать нажатия

9

кнопки S2. При ее нажатии выдать серию из пяти световых импульсов при помощи светодиода LED2 следующей длительности: 0,25 с – 0,5 с – 1 с – 0,5 с – 0,25 с. Пауза между всеми импульсами постоянна и равна 0,5 с. После выдачи серии импульсов вновь ожидать нажатия кнопки S2.

3.Установить частоту работы ЦПУ равной 12 кГц. Отключить все неиспользуемые источники тактирования и ЦПУ. Считать количество нажатий кнопки S2 и индицировать его при помощи светодиодов LED1 (младший разряд) и LED2 (старший разряд) в двоичной системе отсчета в диапазоне от 0 (оба светодиода погашены) до 3 (оба светодиода включены).

4.Установить частоту работы ЦПУ равной 138 кГц. Отключить все неиспользуемые источники тактирования, ЦПУ оставить включенным. При запуске контроллера ожидать нажатия кнопки S2. При ее нажатии считать длительность удержания кнопки в нажатом состоянии. При отпускании кнопки включить светодиод LED2 на время, равное времени нажатия кнопки S2, после чего погасить светодиод и вновь ожидать нажатия кнопки S2.

5.Установить частоту работы ЦПУ равной 550 кГц. Отключить все неиспользуемые источники тактирования и ЦПУ. При нажатии на кнопку S2 в течение 1 секунды, переключить светодиод LED1 в противоположное состояние. Если длительность нажатия меньше 1 секунды, ничего не осуществлять.

6.Установить частоту работы ЦПУ равной 1 МГц. Отключить все неиспользуемые источники тактирования и ЦПУ. При нажатии на кнопку S2 осуществлять мигание светодиодом LED1 с частотой 4 Гц все время, пока кнопка нажата. При отпускании кнопки светодиод погасить.

7.Установить частоту работы ЦПУ равной 275 кГц. Отключить все неиспользуемые источники тактирования, ЦПУ оставить включенным. При запуске контроллера осуществлять мигание светодиодом LED1 с частотой 1 Гц. При нажатии на кнопку S2 эту частоту изменять циклически следующим образом: 2 – 4 – 8 – 1 Гц. Одному нажатию кнопки соответствует одно

10