Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РГР.doc
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
1 Мб
Скачать
☆

Организация памяти

В соответствии с гарвардской архитектурой память 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.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]