- •6.050702 «Електромеханвка»,
- •Создание нового проекта
- •Организация памяти
- •Сведения о портах ввода/вывода
- •Команды языка Assembler, необходимые для выполнения заданий
- •Контрольные вопросы
- •Описание stk500
- •Порядок выполнения работы
- •Индивидуальные задания
- •Контрольные вопросы
- •Организация памяти мк AtMega16
- •Введение
- •Команды работы с памятью
- •Индивидуальные задания
- •Контрольные вопросы:
- •Система прерываний AtMega16. Таймер/счетчик
- •Введение
- •Индивидуальные задания
- •Индивидуальные задания
- •Контрольные вопросы
- •Управление скоростью «бега» огонька по светодиодной панели микроконтроллера AtMega16
- •Порядок выполнения работы
- •Варианты заданий для студентов
- •Контрольные вопросы
- •Основы работы в среде разработки CodeVisionAvr. Широтно-импульсная модуляция (шим) микроконтроллера AtMega16
- •Введение
- •Среда разработки CodeVisionAvr. Пример генерации начального кода программы
- •Пример программы с комментариями
- •Индивидуальные задания
- •Usart: универсальный синхронный и асинхронный последовательный приемопередатчик микроконтроллера AtMega16
- •1. Введение
- •Генерация внутренней синхронизации – генератор скорости связи
- •Работа с удвоением скорости связи (u2x)
- •Режим синхронной связи
- •Форматы посылки
- •1.1.5 Бит паритета
- •1.1.6. Инициализация усапп
- •1.1.9. Передача данных
- •1.1.10. Передача посылок с 5…8 битами данных
- •1.2. Конфигурирование Atmega16
- •1.2.1. Конфигурирование порта d
- •1.2.2. Описание регистров усапп
- •1.3. Генерация начального кода программы в среде разработки CodeVisionAvr
- •1.4. Работа с терминалом
- •1.5. Описание и листинг программы
- •Контрольные вопросы:
Организация памяти
В соответствии с гарвардской архитектурой память AVR-микроконтроллера разделена на две области: память данных и память программ. Кроме того, ATmega128 содержит память на EEPROM (ЭСППЗУ) для энергонезависимого хранения данных. Все три области памяти являются линейными и равномерными.
Внутрисистемно программируемая флеш-память программ ATmega16 содержит 16 Кбайт внутренней перепрограммируемой флеш-памяти для хранения программы. Поскольку все AVR-инструкции являются 16- или 32-разрядными, то флеш-память организована как 8 Кбайт Х 16. Для программной защиты флэш-память программ разделена на два сектора: сектор программы начальной загрузки и сектор прикладной программы.
Флеш-память характеризуется износостойкостью не менее 100000 циклов запись/стирание. Программный счетчик РС у ATmega16 является 13-разрядным, поэтому позволяет адресоваться к 8 Кбайт памяти программ.
Таблицы констант могут располагаться в пределах всего пространства памяти программ (см. описание инструкции чтения из памяти программ).
Рис. 3. Распределение памяти в AtMega 16
Первые 1120 ячеек памяти данных относятся к файлу регистров, памяти ввода/вывода и встроенному статическому ОЗУ. В первых 96 ячейках расположен файл регистров (32 ячейки) и стандартная память ввода-вывода (64 ячейки). Следующие 1024 ячейки – внутреннее статическое ОЗУ данных (рис. 3).
32 рабочих регистров общего назначения, 64 регистра ввода-вывода и 1024 байт внутреннего статического ОЗУ данных в ATmega16 доступны с помощью всех этих режимов адресации.
Сведения о портах ввода/вывода
В микроконтроллерах AVR, как правило, используются двунаправленные порты ввода/вывода, которые также могут осуществлять дополнительные функции (служить входами АЦП, контактами UART, выходами PWM и т. д.). По умолчанию порты работают в режиме ввода/вывода данных.
Для работы с портом существует три регистра (на каждый порт). Регистры PORTx (PORTA, PORTB и т. д.) служат для вывода данных. В случае записи в такой регистр 8-битного значения на выводах порта появятся соответствующие сигналы. Например, если выполнить пересылку в регистр PORTB двоичного числа 0b00000001, на выводе 0 микросхемы AtMega16 появится логическая единица (~4.5BV). На выводах 1–7 будет значение логического нуля (~0.5V). В случае использования платы STK500, если выводы PORTB соединены со светодиодами, зажгутся светодиоды 1–7, светодиод 0 будет погашен. Это произойдет по той причине, что низкий уровень сигнала в схеме подключения светодиода зажигает его, а высокий – гасит.
Пример программы:
.include "m16def.inc" ; включаем файл описания регистров микро-контроллера
ldi r16, 0b00000001 ; загружаем в регистр 16 значение 0х01
out PORTB, r16 ; записываем в порт значение из регистра 16
Данная программа является не совсем правильной, т. к. помимо чтения/записи регистра необходимо производить настройку направления данных. Это делается с помощью регистров DDRx (DDRA, DDRB, DDRC и т. д.). DDR – сокращение от Data Direction Register. Рассмотрим подключение порта ввода/вывода (рис. 4).
Очевидно, что контакт 1 (PortB 0) должен работать на вывод информации, а контакт 2 (PortB 1) – на прием. Для задания такого режима работы в регистре DDRB необходимо установить нулевой бит в 1, что соответствует режиму вывода информации, а первый бит – в 0, что соответствует режиму приема информации. Лишь после этого запись в регистр PortB будет менять сигналы на контактах, которым назначена функция вывода информации, и считать показания сигнала на 2 контакте микросхемы (PortB 1).
Рис. 4. Подключение порта ввода/вывода
Правильный пример программы для вывода информации:
.include "m16def.inc" ; включаем файл описания регистров микроконтроллера
ldi r16, 0b11111111 ; загружаем в регистр 16 значение 0хFF
out DDRB, r16 ; настраиваем PortB на вывод по всем контактам
ldi r16, 0b00000001 ;загружаем в регистр 16 значение
out PORTB, r16 ;записываем в порт значение из регистра 16
Для чтения состояния сигнала на контактах порта используется команда IN с регистром PINx (PINA, PINB,…).
Индивидуальные задания. Выполняются в режиме симуляции!
Панель кнопок подключена к порту D, панель светодиодов – к порту B.
Вариант |
Текст задания |
1 |
Определить две переменные. Занести в одну десятеричное число 5, в другую шестнадцатеричное число AA, отобразить сумму чисел на панели светодиодов в двоичном виде после нажатия кнопки SW0. |
2 |
Занести в заранее определенную переменную шестнадцатеричное число 0xAC, отобразить результат вычитания из него десятеричной константы 8 на панели светодиодов в двоичном виде после нажатия кнопки SW1. |
3 |
Занести в заранее определенную переменную двоичное число, при нажатии кнопки SW2 побитно инвертировать его и выводить на панель светодиодов в двоичном виде. |
4 |
Определить две переменные. Занести в одну десятеричное число 15, в другую шестнадцатеричное число AA, отобразить результат операции AND между числами на панели светодиодов в двоичном вид после нажатия кнопки SW3. |
5 |
Определить две переменные. Занести в одну десятеричное число 15, в другую шестнадцатеричное число AA, отобразить результат операции OR между числами на панели светодиодов в двоичном виде после нажатия кнопки SW4. |
6 |
Определить две переменные. Занести в одну шестнадцатеричное число B, в другую шестнадцатеричное число A, отобразить результат перемножения чисел на панели светодиодов в двоичном виде после нажатия кнопки SW5. |
7 |
Разработать программу, реализующую «бегущий огонек» на светодиодах: перемещение «огонька» вправо при нажатии кнопки SW6. |
8 |
Разработать программу, реализующую «бегущий огонек» на светодиодах: перемещение «огонька» влево при нажатии кнопки SW7. |
9 |
Разработать программу, выводящую поразрядное логическое NOT состояния сигналов, подающихся на порт D. |
10 |
Разработать программу, вызывающую поочередно подпрограммы: подпрограмма 1 выводит все 1 в PortB, подпрограмма 2 выводит поочередно 0 и 1 в PortB, подпрограмма 3 выводит все 0 в PortB. Смена подпрограмм: по нажатию клавиши SW0. |
