Лабораторная работа №1. Основы работы с CodeVision и Proteus для микроконтроллеров AVR
Покупка
Основная коллекция
Издательство:
НИЦ ИНФРА-М
Автор:
Борисевич Алексей Валерьевич
Год издания: 2014
Кол-во страниц: 11
Дополнительно
Тематика:
ББК:
УДК:
ОКСО:
- ВО - Бакалавриат
- 02.03.01: Математика и компьютерные науки
- ВО - Магистратура
- 02.04.01: Математика и компьютерные науки
- Аспирантура
- 02.06.01: Компьютерные и информационные науки
- Адъюнктура
- 02.07.01: Компьютерные и информационные науки
ГРНТИ:
Скопировать запись
Фрагмент текстового слоя документа размещен для индексирующих роботов.
Для полноценной работы с документом, пожалуйста, перейдите в
ридер.
Лабораторная работа №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. Сделать так, чтобы сначала поочередной зажигались четные светодиоды, а потом нечетные. Заменить все нечетные светодиоды на светодиоды зеленого цвета.