Автор работы: Пользователь скрыл имя, 06 Декабря 2012 в 11:54, курсовая работа
В современной электронике микропроцессором называют специальную
микросхему, которая предназначена для выполнения некоего набора сложных функций по управлению тем либо иным электронным устройством.
Микропроцессор – это сердце любого компьютера. Но не только. Те же
технологии, которые применяются в компьютерах, с успехом применяются
и в более простых электронных устройствах.
Введение 3
Структура микроконтроллера 4
Простейшая программа. 7
Прерывания 8
Подключение дисплея (asm) 12
Программа для работы с дисплеем через COM-порт. 15
Литература 18
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
МЕХАНИКО-МАТЕМАТИЧЕСКИЙ ФАКУЛЬТЕТ
Курсовая работа
на тему:
Проектирование систем на базе микроконтроллера AVR
Выполнил: студент
3 курса ММФ
Кенть Павел Геннадьевич
Руководитель:
Бухтояров Сергей Евгеньевич
Минск, 2012
Оглавление
Введение 3
Структура микроконтроллера 4
Простейшая программа. 7
Прерывания 8
Подключение дисплея (asm) 12
Программа для работы с дисплеем через COM-порт. 15
Литература 18
В современной электронике
микропроцессором называют специальную
микросхему, которая предназначена для
выполнения некоего набора сложных функций
по управлению тем либо иным электронным
устройством.
Микропроцессор – это сердце любого компьютера.
Но не только. Те же
технологии, которые применяются в компьютерах,
с успехом применяются
и в более простых электронных устройствах.
Теперь же интеграция пошла до фантастических пределов. Одна микросхема содержит не только сам процессор, но и сопутствующие ему элементы. Такая микросхема называется микроконтроллером.
Микроконтроллер (англ. Micro Controller Unit, MCU) — микросхема, предназначенная для управления электронными устройствами. Типичный микроконтроллер сочетает на одном кристалле функции процессора и периферийных устройств, содержит ОЗУ или ПЗУ. По сути, это однокристальный компьютер, способный выполнять простые задачи.
Для изучения мною были выбрана серия AVR т.к. это очень простые и удобные в использовании микроконтроллеры. Чтобы задействовать какое-нибудь периферийное устройства, понадобятся всего пара строчек кода, что позволяет разработчику сосредоточить свое внимание над самой задачей. Также, одно из преимуществ данных микроконтроллеров (а может быть и главное) является большое количество сред для разработки/отладки приложении, сформировавшиеся сообщества, огромное количество библиотек/проектов/примеров.
В своей работе я приведу примеры программ, написанных на двух языках программирования: Assembler и C. Все программы на ассемблере будут написаны в среде AVRStudio, а программа на C будет написана в среде mikroC PRO for AVR. Для проверки правильности работы программ будет использоваться программа моделирования Proteus.
Перед тем, как начать писать программы, нужно понять, из чего же состоит микроконтроллер. На рисунке 1.1 представлена структурная схема типичного современного микроконтроллера.
Из рисунка видно, что
микроконтроллер может
дополнительных узлов, так как большое
число периферийных схем
уже имеется непосредственно на кристалле
микроконтроллера. Это
позволяет уменьшить, размеры конструкции
и снизить потребление
энергии от источника питания.
Давайте рассмотрим типичные схемы, присутствующие в микроконтроллерах.
1. Центральное процессорное устройство (ЦПУ) — сердце микроконтроллера. Оно принимает из памяти программ коды команд, декодирует их и выполняет. ЦПУ состоит из регистров, арифметико-логического устройства (АЛУ) и цепей управления.
2. Память программ. Здесь хранятся коды команд, последовательность которых формирует программу для микроконтроллера.
3. Оперативная память данных. Здесь хранятся переменные программ. У большинства микроконтроллеров здесь расположен также стек.
4. Тактовый генератор. Этот генератор определяет скорость работы микроконтроллера.
5. Цепь сброса. Эта цепь служит для правильного запуска микроконтроллера.
6. Последовательный порт — очень полезный элемент микроконтроллера. Он позволяет обмениваться данными с внешними устройствами при малом количестве проводов.
7. Цифровые линии ввода/вывода. По сравнению с последовательным портом, с помощью этих линий возможно управлять одновременно несколькими линиями (или проверять несколько линий).
8. Таймер. Используется для отсчета временных интервалов.
9. Сторожевой таймер. Это специальный таймер, предназначенный для предотвращения сбоев программы. Он работает следующим образом: после запуска он начинает отсчет заданного временного интервала. Если программа не перезапустит его до истечения этого интервала времени, сторожевой таймер перезапустит микроконтроллер. Таким образом, программа должна давать сторожевому таймеру сигнал — все в порядке. Если она этого не сделала, значит, по какой-либо причине произошел сбой.[2]
Семейство микроконтроллеров AVR довольно обширно. Оно делится на три группы: Classic, Tiny и Mega. Вообще говоря, для решения задачи может быть использован практически любой микроконтроллер этого семейства. Система команд для всех микроконтроллеров одинаковая, отличие составляет лишь усложнение или упрощение внутренней архитектуры и увеличение или уменьшение аппаратных ресурсов. Мной был выбран представитель группы Mega8-битный микроконтроллер ATMega8, так как он занимает среднее положение между сложностью внутренней архитектуры и наличием аппаратных ресурсов.
Основные параметры ATMega8:
Flash (Кбайт) |
EEPROM (байт) |
SRAM (байт) |
Линий ввода-вывода |
Fmax (МГц) |
Vcc (В) |
8 |
512 |
1024 |
23 |
16 |
2.7-5.5 |
Flash: объем внутренней памяти микроконтроллера, используемой в качестве памяти программ (память программ – пространство, которое содержит машинный код выполняемый микроконтроллером и полученный в результате трансляции специальной программной среды).
EEPROM: объем внутренней энергонезависимой памяти данных (память данных – пространство используемое микроконтроллером для временного хранения полученных в результате работы вычислений и прочих данных которые будут использованы в дальнейшем).
SRAM: объем внутренней энергозависимой памяти данных.
Линии ввода-вывода: фактически количество ножек микроконтроллера, с помощью которых он взаимодействует с внешним миром.
Fmax – максимальное значение рабочей тактовой частоты микроконтроллера, чем она выше, тем соответственно он работает быстрее.
Vcc – питание необходимое для работы микроконтроллера, чем меньше значение питания тем меньше энергопотребление, тем эффективнее использование микроконтроллера.
Микроконтроллеры серии AVR имеют так называемую Гарвардскую архитектуру, основной особенностью которой является наличие раздельной шины данных и шины команд.[3]
Рассмотрим очень простой пример: написать программу, которая при первом нажатии на кнопку зажигает светодиод, а при повторном нажатии тушит его.
Удобнее всего светодиод
подключить к одному из портов, а
кнопку — к другому. В этом случае
управляющая программа должна будет
настроить порт,
к которому подключен светодиод, на вывод,
а порт, к которому подключена
кнопка, на ввод. Других специальных требований
к микроконтроллеру не требуется.
.include "m8def.inc" ;Подключение микроконтроллера ATMega8
.list
.cseg ; Выбор сегмента программного кода
.org 0 ; Устанеовка текущего адреса на ноль
.def temp = r16 ; Переименуем регистры для упрощения дальнейшего использования
.def rab = r17
ldi rab, 0
;-------------------------- Инициализация портов Вода-Вывода
out DDRD, temp ; Записываем ноль в DDRD (порт PD на ввод)
ldi temp, 0xFF ; Записываем число FF в регистр temp
out DDRB, temp ; Записываем это число в DDRB (порт PB на вывод)
out PORTD, temp ; Записываем то же число в PORTB (потушить светодиод)
out PORTB, temp ; Записываем его же в PORTD (включаем внутр. резисторы)
;-----------------------------
wait_off: in temp, PIND
sbrs temp, 0
rjmp wait_off
wait_on: in temp, PIND
sbrc temp, 0
rjmp wait_on
sbrc rab, 3
rjmp vikl
vkl: ldi rab,0b01010101
out PORTB, rab
ldi rab, 0xFF
rjmp wait_off
vikl: ldi temp, 0xFF
out PORTB, temp
ldi rab, 0
rjmp wait_off
Принцип работы очень простой. В начале программы настраиваем порты ввода-вывода и переходим к основному циклу. Далее проверяем значение на PD0 (ножка 2) для определения, нажата ли кнопка. Значение rab показывает, что нужно делать со светодиодом (зажигать или тушить), и соответственно, подавать нужные значения на порт В. Метки wait_off и wait_on нужны для того, чтобы при удерживании кнопки в нажатом состоянии светодиод не моргал.
Не будет преувеличением
утверждать, что основное занятие
почти любого
современного вычислительного устройства,
от простенького контроллера
стиральной машины до "навороченного"
ноутбука — ожидание и обработка
неких событий. Это могут быть сигналы
от других устройств, посылаемые
в автоматическом режиме, а также действия
пользователя. Как можно обнаружить и
обработать такие события?
Наиболее универсальный
способ, который применяется в
системах всех
уровней, — организация основной программы
в виде бесконечного цикла.
Внутри этого цикла тем или иным способом
отслеживается возникновение
неких событий — такой цикл, например,
представляет собой почти любая
Windows-программа (как и Windows в целом). В основе
такого способа лежит
один и тот же принцип: при наступлении
события устанавливается определенное
значение некоей переменной, часто именуемой
флагом; в простейшем
случае это может быть один бит в специально
отведенном регистре или в
ячейке памяти (или даже непосредственно
состояние вывода МК). Основная
программа в цикле проверяет значение
всех необходимых флагов, и при изменении
какого-то из них переходит к соответствующей
процедуре обработки события.
Внешних прерываний у большинства
МК AVR два или три. Естественно, они могут
возникать независимо друг от друга. Внешнее
прерывание — событие, которое наступает
при наличии сигнала на одном из входов,
специально пред-
назначенных для этого (например, INTO и
INT1).
Выделяют три вида событий,
вызывающих такое прерывание, и их
можно
различать, программно: это может быть
низкий уровень напряжения, а также
положительный или отрицательный фронт
на соответствующем выводе. Любопытно,
что прерывания по всем этим событиям
выполняются, даже если
соответствующий вывод порта сконфигурирован
на выход (это, в частности,
позволяет вызывать такие прерывания
программно).
Кратко рассмотрим особенности
этих режимов. Прерывание по низкому
уровню (режим установлен по умолчанию,
для его инициализации достаточно разрешить
соответствующее прерывание) возникает всякий раз, когда
на
соответствующем входе присутствует низкий
уровень. "Всякий раз" — это
значит, что действительно всякий, т. е.
если отрицательный импульс длится
какое-то время, то прерывание, закончившись
(т. е. когда выполнится соответствующий
обработчик), повторится снова и снова,
почти не давая основ-
ной программе работать. Поэтому обычная
схема использования этого режима — сразу
же по возникновении в начале обработчика
его запретить (процедура обработки при
этом, раз уж началась, выполнится до конца)
и разрешить
опять только тогда, когда внешнее воздействие
должно уже закончиться (на-
пример, если это нажатие кнопки, то его
следует опять разрешить по таймеру
через одну-две секунды). Выход из обработки
прерывания выполняется с помощью команды reti.
Ниже представлена программа, которая при нажатии одной из кнопок либо включает светодиод с семисегментным индикатором, либо выключает их. Обработка производиться с помощью прерываний.
Программа работает аналогично предыдущей, отличие лишь в том, что основной часть программы – бесконечный пустой цикл, а остальное – обработка прерываний. Также следует добавить, что за разрешение или запрет прерываний int0, int1 отвечают два старших бита регистра GICR.[5],[1]
include "m8def.inc"
.list
.def temp = r16
.def rab = r17; Определение главного рабочего регистра
.cseg ; Выбор сегмента программного кода
.org 0 ; Устанеовка текущего адреса на ноль
;далее идет таблица прерываний, в которой мы указываем, что делать при выполнении того или ;иного прерывания. Подробнее с таблицей прерываний можно ознакомиться в datasheet ;микроконтроллера
rjmp reset ; Переход на начало программы
rjmp prer ;прерывание int0
rjmp prer ;прерывание int1
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reset:
ldi temp,low(RAMEND)
out SPL,temp
ldi temp, high(RAMEND)
out SPH,temp
;-------------------------- Инициализация портов ВВ
Информация о работе Проектирование систем на базе микроконтроллера AVR