Академический Документы
Профессиональный Документы
Культура Документы
ВЫПОЛНЕНИЕ АРИФМЕТИЧЕСКИХ
И ЛОГИЧЕСКИХ ОПЕРАЦИЙ
Цель: познакомиться с архитектурой микроконтроллера и основными понятиями,
изучить ассемблер для микроконтроллеров семейства AVR.
Общие сведения
Концепция RISC разработана Джоном Коком (John Cocke) из IBM Research, название
придумано Дэвидом Паттерсоном (David Patterson). Довольно известная реализация
данной архитектуры — процессоры MIPS-серии.
MIPS (англ. Million Instruction Per Second) – величина, которая показывает, сколько
миллионов инструкций в секунду выполняет процессор в некотором синтетическом тесте.
Возможности микроконтроллера:
• высокоэффективный, малопотребляющий 8-битный микроконтроллер AVR;
• современная RISC архитектура:
90 мощных инструкций (большинство выполняется за 1 цикл);
32 × 8-битных регистра общего назначения;
• надежная память программ и данных:
1К перепрограммируемой памяти программ (выдерживает 1 000 циклов
стирания/записи);
64 байта EEPROM (выдерживает 100 000 циклов стирания/записи);
защита программы зашитой в микроконтроллер;
• встроенная периферия:
прерывание и запуск после ожидания при изменении состояния вывода;
два 8-битных таймера/счетчика с раздельными делителями;
8-битный высокоскоростной (150 кГц) ШИМ;
4-канальный 10-битный АЦП (один дифференциальный вход с
опциональным коэффициентом умножения 20x);
аналоговый компаратор;
программируемый сторожевой таймер (с отдельным генератором);
• специальные возможности:
внутрисистемное программирование через SPI порт;
улучшенная схема сброса по включению питания;
программируемая схема обнаружения пропадания питания;
внутренний калиброванный подстраиваемый осциллятор (1,6 МГц);
внутренний генератор частоты для таймера/счетчика (25,6 МГц);
внутренние и внешние источники прерывания;
холостой режим и режим пониженного потребления;
• потребление на частоте 1,6 МГц, 3В, 25°С:
активный режим: 3 мА;
холостой режим: 1 мА;
режим пониженного потребления: < 1 μА;
• напряжение питания:
2,7 В … 5,5 В.
Память программ
Виды прерываний:
• аппаратные – события от периферийных устройств (например, нажатия
клавиш клавиатуры, движение мыши, сигнал от таймера, сетевой карты или
дискового накопителя) – внешние прерывания, или события в
микропроцессоре – (например, деление на ноль) – внутренние прерывания;
• программные – инициируются самой программой.
№ Адрес Источник
Условия возникновения прерывания
вектора в памяти прерывания
1 $000 RESET Внешний сброс, сброс при включении питания,
сброс при «проседании» напряжения питания и
сброс по сторожевому таймеру
2 $001 INT0 Внешний запрос на прерывание 0
3 $002 I/O Pins Изменение напряжения на выводах
микроконтроллера
4 $003 TIMER1, COMPA Таймер/счетчик1 (при совпадении)
5 $004 TIMER1, OVF Таймер/счетчик1 (при переполнении)
6 $005 TIMER0, OVF Таймер/счетчик0 (при переполнении)
7 $006 EE_RDY EEPROM готово
8 $007 ANA_COMP Аналоговый компаратор
9 $008 ADC АЦП преобразование закончено
По адресу $000 памяти программ находится вектор сброса. После инициализации (сброса)
микроконтроллера выполнение программы начинается с этого адреса (по этому адресу
рекомендуется размещать команду относительного перехода к инициализационной части
программы).
Память данных
Арифметико-логическое устройство (АЛУ) (англ. arithmetic and logic unit, ALU) – блок
процессора, который служит для выполнения арифметических и логических
преобразований над операндами.
Регистр состояния
SREG (Status REGister) – регистр состояния. Этот регистр является набором флагов,
показывающих текущее состояние микроконтроллера. Эти флаги автоматически
устанавливаются в «1» или «0» в соответствии с результатом выполнения команд. Все
разряды этого регистра доступны для чтения и записи (после сброса микроконтроллера
все разряды устанавливаются в «0»). Общий вид этого регистра представлен на
следующем рисунке.
Символ
Разряд
Описание
EEPROM
Машинный код, машинный язык (англ. machine code, machine language) – система
кодов (команд), непосредственно понятных процессору, т.е. таких, которые могут быть
выполнены им непосредственно, без перевода.
Файл листинга полезно использовать, когда вы хотите точно видеть, что генерирует
Ассемблер при ассемблировании каждой инструкции или директивы. Основу этого файла
составляет исходный файл, в который включен большой объем сопровождающей
информации о результатах ассемблирования. Ассемблер выводит для каждой инструкции
полученный машинный код, а также смещение в текущем сегменте (на каждой строке с
машинным кодом). Кроме того, Ассемблер выводит в таблицах информацию о метках и
сегментах, используемых в программе.
Директивы ассемблера
Пример
.dseg
var1: .byte 1 ; резервирует 1 байт для var1
table: .byte tab_size ; резервирует tab_size байт
.cseg
ldi r30,low(var1) ; Загружает младший байт регистра Z
ldi r31,high(var1) ; Загружает старший байт регистра Z
ld r1,Z ; Загружает VAR1 в регистр 1
Программный сегмент
Директива Описание
.CSEG Определяет начало программного сегмента. Исходный файл может состоять
из нескольких программных сегментов, которые объединяются в один
программный сегмент при компиляции. Программный сегмент является
сегментом по умолчанию.
Пример
Пример
.cseg
ldi temp, 0xf0 ; Загрузить 0xf0 в регистр temp (R16)
in ior, 0x3f ; Прочитать SREG в регистр ior (R0)
eor temp, ior ; Регистры temp и ior складываются
; по исключающему или
Пример
.cseg
push r30 ; Эта инструкция вызовет предупреждение
; поскольку AT90S1200 её не имеет
Сегмент данных
Директива Описание
.DSEG Директива DSEG определяет начало сегмента данных. Исходный файл
может состоять из нескольких сегментов данных, которые объединяются в
один сегмент при компиляции. Сегмент данных обычно состоит только из
директив BYTE и меток. Директива ORG может быть использована для
размещения переменных в необходимом месте ОЗУ.
Пример
.dseg ; Начало сегмента данных
var1: .byte 1 ; зарезервировать 1 байт для var1
table: .byte tab_size ; зарезервировать tab_size байт.
.cseg
ldi r30,low(var1) ; Загрузить младший байт регистра Z
ldi r31,high(var1) ; Загрузить старший байт регистра Z
ld r1,Z ; Загрузить var1 в регистр r1
Пример
Пример
Сегмент EEPROM
Директива Описание
.ESEG Директива ESEG определяет начало сегмента EEPROM. Исходный файл
может состоять из нескольких сегментов EEPROM, которые объединяются
в один сегмент при компиляции. Сегмент EEPROM обычно состоит только
из директив DB, DW и меток. Директива ORG может быть использована для
размещения переменных в необходимом месте EEPROM.
Пример
.eseg
eevar1: .dw 0xffff ; проинициализировать 1 слово в EEPROM
Выйти из файла
Директива Описание
.EXIT Встретив директиву INCLUDE компилятор открывает указанный в ней
файл, компилирует его пока файл не закончится или не встретится
директива EXIT, после этого продолжает компиляцию начального файла со
строки следующей за директивой INCLUDE. Вложенный файл может также
содержать директивы INCLUDE.
Пример
Пример
Пример
Пример
Пример
.cseg
.org 0x10 ; Установить программный счётчик равным 0x10
mov r0,r1 ; Данная команда будет размещена
; по адресу 0x10
Пример
В данный момент не реализовано, так как бы мне этого хотелось, поэтому читаем
Справка по Ассемблеру для AVR.pdf (прилагается).
Заметки к лабораторной работе
О выполнении арифметических операций…
Сложение слов
Байт – 8 бит.
7 6 5 4 3 2 1 0
Слово – 16 бит.
Вариант 1.
48 452
Вариант 2.
Вариант 3 (утопический!).
Т.е. после выполнения следующих инструкций в R16 будет содержаться младший байт
слова, а в R17 – старший.
Складываем слова
Умножение
Т.е.
4 × 20 =
=20 + 20 + 20 + 20 =
=4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4=
= 80
Операция сложения будет выполнятся до тех пор, пока регистр R16 не станет равным
нулю.
Умножение/Деление на 2n
Операция умножения на 2n может быть выполнена при помощи сдвига регистра влево
(←), а операция деления – вправо (→), n раз.
Рассмотрим пример…
54 × 4 = 216
Для работы с словами разбитыми на байты используем инструкции сдвига через флаг
переноса (см. текст программы и Справочник по инструкциям).
.org 0
;
; Таблица векторов прерываний
rjmp Reset ; Вектор прерывания по сбросу
; Расположен по адресу $000
; Содержит команду относительного перехода
; на инициирующую часть программы
;
; Таймер/счетчик1 (при переполнении)
T1_OVF: nop ; Подпрограмма обработки прерывания
; при переполнении счетчика1
;
reti ; Возврат из прерывания
;
; АЦП преобразование закончено
ADC_Ready: ; Подпрограмма обработки прерывания
nop ; при окончании аналого-цифрового преобразования
;
reti ; Возврат из прерывания
Приложение 2
Задания для программирования
Вариант 1
Вариант 2
62345 / 16 + 104 + 2
Вариант 3
3056 × 4 − 456 − 5
Вариант 4
45 2 + 40000 − 1