Проектирование систем на базе микроконтроллера AVR

Автор работы: Пользователь скрыл имя, 06 Декабря 2012 в 11:54, курсовая работа

Описание работы

В современной электронике микропроцессором называют специальную
микросхему, которая предназначена для выполнения некоего набора сложных функций по управлению тем либо иным электронным устройством.
Микропроцессор – это сердце любого компьютера. Но не только. Те же
технологии, которые применяются в компьютерах, с успехом применяются
и в более простых электронных устройствах.

Содержание работы

Введение 3
Структура микроконтроллера 4
Простейшая программа. 7
Прерывания 8
Подключение дисплея (asm) 12
Программа для работы с дисплеем через COM-порт. 15
Литература 18

Файлы: 1 файл

курсовая.docx

— 868.32 Кб (Скачать файл)

БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ  УНИВЕРСИТЕТ

МЕХАНИКО-МАТЕМАТИЧЕСКИЙ ФАКУЛЬТЕТ

 

 

 

 

 

 

 

 

 

Курсовая работа

на тему:

Проектирование систем на базе микроконтроллера 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