Лабораторная работа №3
По дисциплине «Микропроцессорные системы»
Прерывания. Внешние прерывания как управление ходом работы устройства.
Цель работы: Освоить механизм работы внешних прерываний.
-составить программу чтения состояния кнопок C51, настроить прерывания по кнопке.
-составить алгоритм ветвления программы, используя прерывания.
Рис.1 входы внешних прерываний Atmega16A
Взаимодействие микроконтроллера с внешними устройствами
Взаимодействие происходит благодаря портам ввода/вывода (I/O- input/output).
Рис.2 общее представление управлением портов I/O
На плате C51 подключение кнопок соответствует следующей таблице
Кнопка | Порт процессора ATmega16 |
P32 (S2) | PD2 |
P33 (S3) | PD3 |
P34 (S4) | PD4 |
P35 (S5) | PD5 |
P36 (S6) | PD6 |
Таб.1 соответствие кнопок битам процессора
Каждый порт микроконтроллера в программном виде представляет из себя 3 регистра, которые отвечают за его работу. Так как применяемый в работе процессор 8 битный, то и его ножки сгруппированы по 8 бит в группе.
Каждая ножка процессора может быть как портом входа, так и портом выхода. За работу порта отвечают регистры:
DDRx
PINx
PORTx
DDR (Data direction register)
Каждый бит регистра DDRх отвечает за режим работы ножки контроллера.
Записав 0 в соответствующий бит, настраиваем ножку на вход.
Записав 1- устанавливаем на вывод.
Пример: DDRD|=1<<PD4; //настройка 4 бита порта D на выход
PIN (Port input)
Каждый бит регистра PIN показывает текущее состояние соответствующей ножки контроллера. Каждый порт работает только на чтение.
PORT
При настройке соответствующего пина на вывод, регистр PORTx управляет состоянием данного пина. Установив 1 на некотором бите регистра, подаётся логическая 1 на вывод контроллера. Около +5В.
Если установить 1 в порт, настроенный на чтение, то включается подтягивающий резистор (pull-up).
DDRB|=1<<PB3; //3 бит порта B настроен на вывод
PORTB|=1<<PB3;//отправить лог.1 на 3 бит порта B
В работе рассматривается механизм внешних прерываний.
Как отмечалось ранее, прерывание- сигнал, сообщающий о наступлении какого-либо события. При этом выполнение текущей последовательности команд прерывается и управление передается обработчику прерывания. Прерывания позволяют своевременно обрабатывать события периферийных устройств.
Прерывания внутренние - обработчики сигналов внутренней периферии (таймеры (см. лабораторная работа№1), UART, АЦП и пр.).
Прерывания внешние - реакция на логические уровни сигналов на ножках микроконтроллера.
Таб.2 векторы прерываний контроллера Atmega16A
За конфигурации внешних прерываний отвечает регистр GICR (General interrupt control register).
Биты INT1,INT0,INT2, при записи в них 1, разрешают соответствующие прерывания.
За условие срабатывания вызова прерывания на выбранных пинах отвечает регистр MCUCR (MCU Control Register).
За настройку возникновения сигнала int0 отвечают следующие биты:
ISC01 | ISC00 | Описание |
По низкому уровню на int0 | ||
Каждая смена уровня на int0 | ||
Задний фронт int0 | ||
Передний фронт int0 |
Таб.3 конфигурация прерывания int0
Аналогично настраивается режим прерывания int1:
ISC11 | ISC10 | Описание |
По низкому уровню на int1 | ||
Каждая смена уровня на int1 | ||
Задний фронт int1 | ||
Передний фронт int1 |
Таб.4 конфигурация прерывания int1
Прерывание int2 возможно настроить по переднему и заднему фронту. За эту настройку отвечает 6 бит регистра
MCUCSR (MCU Control and Status Register): 0-задний фронт, 1-передний фронт.
Пример включения всех прерываний и настройки срабатывания по передним фронтам:
GICR|=(1<<7)|(1<<6)|(1<<5); /*включить все прерывания*/
MCUCR|=0x0F;/*настройка int0 и int1 срабатывание по переднему фронту*/
MCUCSR|=(1<<6);/*настройка int2 срабатывание по переднему фронту*/
Выполнение работы.
Лабораторная работа №3опирается на успешно выполненные работы №1 и №2. Результат работы представляет собой программу, выводящую бегущий огонь на светодиодах в направлении, задаваемом при помощи механизма прерываний. ЖК экран отображает текст, соответствующий направлению движения.
1.1 Создать новый проект в среде WinAVR, подготовить Makefile.
1.2 Завести функции таймера (лабораторная работа№1), функции работы с ЖК экраном (лабораторная работа №2). Для работы с кнопками подготовить функции, описываемые в файле buttons.h; для хранения глобальных переменных завести файл global.h.
Модульный проект призывает разработчика программного обеспечения быть более организованным и аккуратным при многократном использовании переменных и других ресурсов.
Файл global.h – хранилище объявлений применяемых в проекте переменных
Файл timers.h – описание прерывания по таймеру (см. лабораторная работа№1), с добавленной case – структурой.
buttons.h – инициализация прерываний по кнопкам S2 и S3 платы C51.
Функция button_init() конфигурирует регистры, необходимые для включения и настройки пинов, отвечающих за внешние прерывания.
Основной файл main представлен ниже:
Обратить внимание на определение переменной mode из файла global.h!
1.3 Скомпилировать проект:Tools / [WinAVR] MakeAll
1.4 Подключить через ISP и запрограммировать плату C51: Tools / [WinAVR] Program
1.5 Исследовать ход работы программы и исправит ь возможные ошибки.
Самостоятельные задания
2.1 Разработать функцию, которая в момент включения платы С51 запускает «демо-режим» - выводит на ЖК сообщение с предложением о нажатии кнопок и зажигает на светодиодах платы самостоятельно разработанную студентом последовательность.
2.2 Разработать функцию нажатия свободных кнопок, изменяющую скорость бегущих огней.