Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Лабораторная работа №1. Основы работы с CodeVision и Proteus для микроконтроллеров AVR

Покупка
Основная коллекция
Артикул: 620028.01.99
Борисевич, А. В. Лабораторная работа №1. Основы работы с CodeVision и Proteus для микроконтроллеров AVR [Электронный ресурс] / А. В. Борисевич. - Москва : Инфра-М, 2014. - 11 с. - Текст : электронный. - URL: https://znanium.com/catalog/product/470086 (дата обращения: 19.04.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Лабораторная работа №1.
Основы работы с CodeVision и Proteus для микроконтроллеров AVR.

Ход работы
1. Изучить теоретические сведения к лабораторной работе.
2. Выполнить практическую часть лабораторной работы.
3. Модифицировать программу в соответствии со своим вариантом.
4. Подготовить отчет по работе.
5. Ответить на контрольные вопросы.

Теория
Микроконтроллер (МК) – это компьютер, выполненный в виде одной 
микросхемы. Микроконтроллеры чаще всего используются для реализации 
алгоритмов управления и контроля в различных областях: автоматизация, 
бытовая техника, медицинская электроника и т.д. Еще одно встречающееся 
(архаичное) название микроконтроллеров – Микро-ЭВМ. Микроконтроллеров 
существует огромное множество, для самых разных применений. Мы 
ограничимся микроконтроллерами семейства AVR производства фирмы Atmel 
как наиболее простой для освоения тип микроконтроллеров и вместе с тем 
достаточно часто применяемый на  практике.

В AVR микроконтроллерах использована Гарвардская архитектура, что 
означает, что в этой архитектуре разделены отдельно не только виды памяти 
(адресное пространство памяти программ и памяти данных), но и шины 
доступа к данным видам памяти. Каждая из областей памяти данных 
(оперативная память и EEPROM) также расположена в своем адресном 
пространстве. Такая архитектура открывает процессору быстрый доступ к 
памяти программ и памяти данных, в одно и то же время. Это увеличивает 
производительность по сравнению с MCU CISC архитектуры, в которой 
центральный процессор использует те же шины доступа к памяти программ и 
памяти данных.

Память программ в микроконтроллерах AVR предназначена для хранения 
программы, которая содержит команды управления процессором.  Такой тип 
памяти имеет 16-ти битную организацию. Все процессоры AVR обладают 
Flash-памятью программ, размер которой может быть  - от 1 до 256 КБайт. 
Flash ROM память перепрограммируемая - допускает многократное стирание и 
запись информации.
Память данных в микроконтроллерах AVR реализована следующим образом: 
память регистров, оперативная память ОЗУ или RAM и энергонезависимая 
память (ЭСППЗУ или EEPROM).
Основной набор присутствующий почти во всех AVR, а также в других 
современных контроллерах.


Порты ввода вывода — то без чего невозможно взаимодействие контроллера 
с внешним миром. Каждый порт состоит из 8-и ножек (контактов), которые 
могут быть логическими выходами (программно установлены в логическое 
1 или 0), а также логическими входами. Почти все выводы 
микроконтроллера могут работать в режиме портов ввода-вывода. Типичные 
применения портов ввода-вывода: индикация (светодиоды и т.д.) и кнопки.


UART/USART приемопередатчик — последовательный порт. Работает по 
тому же асинхронному протоколу что и архаичные Dial-Up модемы и COMпорт компьютера. Простой и надежный способ обмена данными.


Таймеры/счетчики — задача таймеров отсчитывать события. Например, 
можно отсчитать 100 тактов процессора — после чего сгенерировать 

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


АЦП — аналоговый вход. Позволяет взять и замерить аналоговый сигнал. 
АЦП это своеобразный вольтметр.


I2C(TWI) интерфейс — последовательная шина IIC. Через нее 
осуществляется связь с другими устройствами. На IIC можно организовать 
своеобразную локальную сеть из микроконтроллеров в пределах одного 
устройства.


SPI — еще один последовательный протокол, похожа на IIC, но не позволяет 
организовывать сети. Работает только в режиме Мастер-Ведомый. Зато 
ОЧЕНЬ быстрая.


Аналоговый Компаратор — еще один аналоговый интерфейс. Но, в отличии 
от АЦП, он не замеряет, а сравнивает два аналоговых сигнала, выдавая 
результат А>B или A<B в двоичном виде.


JTAG/DebugWire — средство отладки, позволяет загружать и отлаживать 
программы в микроконтроллере с помощью специального адаптера.


PWM — ШИМ генератор. Вообще это не отдельный блок, а дополнительная 
функция таймера, но тоже полезная. С помощью ШИМ генератора легко 
задать аналоговый сигнал. Например, менять яркость свечения светодиода 
или скорость вращения двигателя. 

Программное обращение к периферии микроконтроллеров всегда производится 
в виде записи и чтения специальной области оперативной памяти –
пространства ввода-вывода.

Практическая часть. 
Цель: создать устройство, способное зажигать в определенном порядке (по 
очереди) , N-ное количество светодиодов (8 штук).

Выберем микроконтроллер:ATtiny2313, т.к. у него достаточное количество 
портов ввода-вывода, он не дорог и легкодоступен.

Схема электрическая устройства показана на рисунке ниже.

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

Определимся с алгоритмом. Нам нужно по очереди через определенный 
промежуток времени активировать один из выходов МК.

Включать/выключать можно разными способами:
- присваивать значения каждому выводу отдельно;
- записывать значения сразу всех выводов.

Значения (последовательность) можно получить:
- набрав все команды вручную;
- из массива;
- математическим методом.

Временной интервал можно задать:
- функциями delay (задержка);
- через таймер.

Чтобы создать заготовку программы воспользуемся генератором кода, 
встроенным в CVAVR. Для этого запускаем программу, нажимаем File -> New, 
в открывшемся окне выбираем ―Project‖ и жмем OK. На вопрос 
«Воспользоваться генератором кода?» отвечаем ―Yes‖.
Появилось окно генератора кода. В нем выбираем тип МК и его тактовую 
частоту, остальное оставляем как есть:

Далее переходим на вкладку ―Ports‖ и там в ―PortB‖ и выставляем следующее:

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

Жмем ―File -> Generate, Save and Exit‖, выбираем куда сохранить файлы 
проекта и видим окно с созданным генератором кодом.

Теперь давайте введем в программу наш код.
Простейший вариант реализации (хотя и самы не красивый с точки зрения 
программирования) – записываем значения каждого вывода, а задержки делаем 
через функцию delay.

delay_ms(x); - задержка на x миллисекунд

delay_us(x); - задержка на x микросекунд

PORTB - порт, с которым мы работаем.

PORTB.x - обращение к выводу x порта B

Находим в конце текста такие строки

Это бесконечный цикл (т.е.выполняется всѐ время, пока включено питание) 
нашей программы . Всѐ, что перед ним – команды предварительной настройки 
микроконтроллера. Строки, начинающиеся с ―//‖ – комментарии, их тоже 
полезно иногда читать.

Вводим вместо слов ―// Place your code here‖ следующие строки:

PORTB.0=1;
delay_ms(500);
PORTB.0=0;
PORTB.1=1;
delay_ms(500);
PORTB.1=0;
PORTB.2=1;
delay_ms(500);
PORTB.2=0;
PORTB.3=1;
delay_ms(500);
PORTB.3=0;
PORTB.4=1;
delay_ms(500);
PORTB.4=0;
PORTB.5=1;
delay_ms(500);
PORTB.5=0;
PORTB.6=1;
delay_ms(500);
PORTB.6=0;
PORTB.7=1;
delay_ms(500);
PORTB.7=0;
delay_ms(500);

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

Жмем кнопочку Make the project

(в панели инструментов).

Появились сообщения об ошибка. Компилятор не знает функции delay_ms(), 
поэтому надо указать ему файл, в котором эта функция описана.
Для этого в самом начале текста программы нужно вставить строку 
#include <delay.h>
(тут точка_с_запятой не нужна!)
Примерно вот так:

Снова жмем волшебную кнопочку для компиляции.
Проект создан.
Теперь в папке, в которую мы сохранили сам проект, появился файл 
название_проекта.hex – это и есть прошивка микроконтроллера! 

Далее необходимо осуществить моделирование написанной программы в 
системе Labcenter Electronics - Proteus VSM. 
Итак, запускаем ISIS (среда разработки принципиальных схем). В этом окне 
нажимам кнопочку ―P‖.

В строке ―Keywords‖ вводим ―attiny2313‖ и справа получаем:

Выбирать особо не из чего, поэтому щелкаем дважды по этой одинокой строке 
и видим слева в основном окне:

Это значит, что элемент добавлен.

Теперь введите в поле ―Keywords‖ слова ―LED-RED‖ и ―RES‖. Добавьте 
резистор и светодиод в проект и закройте окно выбора элементов.

Пробуем собрать схему (вывод RESET обязательно подключите к +5V, иначе 
ничего не заработает! и в жизни это тоже желательно!)

Вот небольшая подсказка:

А для редактирования свойств элементов достаточно щелкнуть по ним дважды.

Когда схема собрана, можно прошить наш виртуальный МК. Для этого 
щелкаем по нему дважды и видим окно:

В поле ―Program file‖ указываем наш файл прошивки, остальное не трогаем, 
пока. Жмем кнопку OK. И запускаем анимацию:

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

Варианты заданий
1. Сделать так, чтобы бегущий огонь сначала двигался в одном направлении, 
а потом – в обратном. Т.е. зажигались последовательно светодиоды от 1 до 8, 
а потом с 8 до 1 и так циклически.
2. Сделать так, чтобы сначала поочередной зажигались четные светодиоды, а 
потом нечетные. Заменить все нечетные светодиоды на светодиоды зеленого 
цвета.