михайлов_дз2 (1044808)
Текст из файла
Московский Государственный Технический Университет имени Н.Э. Баумана
Домашнее задание
по предмету
«Управление в технических системах»
Выполнил: Данилов М.А.
Группа: РК10-81
Проверил: Михайлов Б.Б.
Москва, 2011
.include "m16M1def.inc" ; Используем ATMega16M1
; Скомпилированный в AVR Studio 4 код занимает
; 220 байт памяти из 16384 байт доступных
; X[N] = 0.457*X[N-1] + 0.523*X[N-2] + 1.404*G[N-1] – 1.39*G[N-2]
; псевдонимы регистров:
.def tmp_H = R14 ; старший байт для промежуточных данных
.def tmp_L = R15 ; младший байт для промежуточных данных
.def XN_H = R16 ; старший байт X[N]
.def XN_L = R17 ; младший байт X[N]
.def XN1_H = R18 ; старший байт X[N-1]
.def XN1_L = R19 ; младший байт X[N-1]
.def XN2_H = R20 ; старший байт X[N-2]
.def XN2_L = R21 ; младший байт X[N-2]
.def GN_H = R22 ; старший байт G[N]
.def GN_L = R23 ; младший байт G[N]
.def GN1_H = R24 ; старший байт G[N-1]
.def GN1_L = R25 ; младший байт G[N-1]
.def GN2_H = R26 ; старший байт G[N-2]
.def GN2_L = R27 ; младший байт G[N-2]
; RAM =====================================================
.DSEG ; Сегмент ОЗУ
; FLASH ===================================================
.CSEG ; Кодовый сегмент
;очистка всех регистров при инициализации
LDI ZL, 30 ; ZL = 30
CLR ZH ; ZH = 0
DEC ZL ; Уменьшаем адрес текущего очищаемого регистра
ST Z, ZH ; Записываем в регистр с адресом Z значение 0
BRNE PC-2 ; Переход на инструкцию DEC ZL будет происходить
; до тех пор, пока в ZL не окажется 0
; инициализация указателя стека (SP)
; необходима, т.к. будут использоваться вызовы подпрограмм
LDI R16,Low(RAMEND)
OUT SPL,R16
LDI R16,High(RAMEND)
OUT SPH,R16
CLR R16
; инициализация 10-битного АЦП
CBI DDRD,4 ; пин 4 порта D (ADC1) включен на вход
LDI TMP_L, (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADPS0)|(1<<ADPS1)|(1<<ADPS2)
; ADEN = 1 - бит включения АЦП
; ADSC = 1 - бит запускает первое преобразование АЦП
; ADATE = 1 - непрерывные последовательные преобразования
; ADPS[0..2] = 111 - выставление частоты работы АЦП
; при 111, коэффициент предделителя = 128
; контроллер работает на частоте 16 МГц
; АЦП будет работать на частоте 16384/128 = 128 кГц
STS ADCSRA, TMP_L ; пишем иниц. информацию в управл. регистр АЦП
LDI TMP_L, (1<<REFS0)
; REFS1 = 0
; REFS0 = 1 - внешнее питание (пин AVCC)
; ADLAR = 0 - выравнивание данных справа (занимается весь
; регистр ADCL и 2 бита в ADHL
; MUX[4..0] = 0001 - сигнал берется с пина ADC1
STS ADMUX, TMP_L ; пишем иниц. информацию в управл. регистр АЦП
LDI TMP_L, 0
; ADTS[3..0] = 0000 - режим непрерывного преобразования
STS ADCSRB, TMP_L ; пишем иниц. информацию в управл. регистр АЦП
; инициализация 10-битного ЦАП
SBI DDRC, 7 ; пин 7 порта С (D2A) включен на выход
LDI TMP_L, (1<<DAOE)|(1<<DAEN)
; DAOE=1 - разрешить вывод с ЦАП на пин D2A
; DAEN=1 - включить ЦАП
; DALA=0 - правое выравнивание (в DACL 8 младших бит,
; в DACH 2 старших)
; DAATE=0 - считывать на вход новые данные когда произошла
; запись в регистры DACH и DACL
STS DACON, TMP_L ; пишем иниц. информацию в управл. регистр ЦАП
RJMP Main ; переход в основную программу
; ---------------------------------------------
; Подпрограммы для работы с 16-битными числами
; ---------------------------------------------
SUB_XN_TMP:
; вычитание двух 16-битных чисел: XN из TMP
; XN_H:XN_L = XN_H:XN_L - TML_H:TMP_L
SUB XN_L, TMP_L ; вычитаем младшие биты
; без учета переноса
SBC XN_H, TMP_H ; вычитаем старшие биты
; с учетом переноса
CLC ; очищаем бит переноса
RET ; возврат в основную программу
ADD_XN_TMP:
; сложение двух 16-битных чисел: XN и TMP
; XN_H:XN_L = XN_H:XN_L + TML_H:TMP_L
ADD XN_L, TMP_L ; складываем младшие биты
; без учета переноса
ADC XN_H, TMP_H ; складываем старшие биты
; с учетом переноса
CLC ; очищаем бит переноса
RET ; возврат в основную программу
LSR_TMP:
; сдвиг TMP вправо на один разряд
; TMP_H:TMP_L = TMP_H:TMP_L >> 1
LSR TMP_H ; сдвиг старшего байта вправо
;(не циклический)
; TMP_H = TMP_H >> 1
ROR TMP_L ; сдвиг старшего байта вправо (циклический)
; бит Carry (от сдвига старшего байта) ; попадает на место старшего бита младшего ; байта
; TMP_L = ( TMP_L >> 1 ) | (Carry << 7)
CLC ; очищаем бит переноса
RET ; возврат в основную программу
; ----------------------------------------------
; Основная программа
; ----------------------------------------------
Main:
; Считывание G[N] с 10-битного АЦП
LDS GN_L, ADCL ; младшие 8 бит с АЦП
LDS GN_H, ADCH ; старшие 8 (только 2 мл. содержат данные) бит с АЦП
; Вычисление X[N]
; X[N] = 0.457*X[N-1] + 0.523*X[N-2] + 1.404*G[N-1] – 1.39*G[N-2]
; ---------------------------------------------------------
; 0.457*X[N-1] = (1/2 - 1/16 + 1/64 + 1/128 - 1/256)*X[N-1]
; ---------------------------------------------------------
MOV TMP_H, XN1_H
MOV TMP_L, XN1_L ; TMP = X[N-1]
RCALL LSR_TMP ; TMP = X[N-1] / 2
MOV XN_H, TMP_H
MOV XN_L, TMP_L ; X[N] = X[N-1] / 2
RCALL LSR_TMP ; TMP = X[N-1] / 4
RCALL LSR_TMP ; TMP = X[N-1] / 8
RCALL LSR_TMP ; TMP = X[N-1] / 16
RCALL SUB_XN_TMP; X[N] = X[N-1]/2 - X[N-1]/16
RCALL LSR_TMP ; TMP = X[N-1] / 32
RCALL LSR_TMP ; TMP = X[N-1] / 64
RCALL ADD_XN_TMP ; X[N] = X[N-1]/2 - X[N-1]/16 + X[N-1]/64
RCALL LSR_TMP ; TMP = X[N-1] / 128
RCALL ADD_XN_TMP ; X[N-1] = X[N-1]/2 - X[N-1]/16 + X[N-1]/64 +
;+ X[N-1]/128
RCALL LSR_TMP ; TMP = X[N-1] / 256
RCALL SUB_XN_TMP ; X[N] = X[N-1]/2 - X[N-1]/16 + X[N-1]/64 +
; + X[N-1]/128 - X[N-1]/256
; X[N] = .457 * X[N-1]
; ----------------------------------------------------------
; 0.523*X[N-2] = (1/2+1/32-1/64+1/128+1/256-1/512)*X[N-2]
; ----------------------------------------------------------
MOV TMP_H, XN2_H
MOV TMP_L, XN2_L ; TMP = X[N-2]
RCALL LSR_TMP ; TMP = X[N-2] / 2
RCALL ADD_XN_TMP ; X[N] = 0.457*X[N-1] + X[N-2] / 2
RCALL LSR_TMP ; TMP = X[N-2] / 4
RCALL LSR_TMP ; TMP = X[N-2] / 8
RCALL LSR_TMP ; TMP = X[N-2] / 16
RCALL LSR_TMP ; TMP = X[N-2] / 32
RCALL ADD_XN_TMP; X[N] = 0.457*X[N-1] + X[N-2] / 2 + X[N-2]/32
RCALL LSR_TMP ; TMP = X[N-2] / 64
RCALL SUB_XN_TMP ; X[N] = 0.457*X[N-1] + X[N-2] / 2 +
; + X[N-2]/32 - X[N-2]/64
RCALL LSR_TMP ; TMP = X[N-2] / 128
RCALL ADD_XN_TMP ;X[N] = 0.457*X[N-1] + X[N-2] / 2 +
; + X[N-2]/32 - X[N-2]/64 + X[N-2]/128
RCALL LSR_TMP ; TMP = X[N-2] / 256
RCALL ADD_XN_TMP ; X[N] = 0.457*X[N-1] + X[N-2] / 2
;+ X[N-2]/32 - X[N-2]/64 + X[N-2]/128 + X[N-2]/256
RCALL LSR_TMP ; TMP = X[N-2] / 512
RCALL SUB_XN_TMP ; X[N] = 0.457*X[N-1] + X[N-2] / 2 + X[N-2]/32 ; -X[N-2]/64 + X[N-2]/128 + X[N-2]/256 - X[N-2]/512
; X[N] = 0.457*X[N-1] + 0.523*X[N-2]
;-------------------------------------------------------------
; 1.404*G[N-1] = (1+1/2-1/8+1/32)*G[N-1]
;-------------------------------------------------------------
MOV TMP_H, GN1_H
MOV TMP_L, GN1_L ; TMP = G[N-1]
RCALL ADD_XN_TMP ; X[N] += G[N-1]
RCALL LSR_TMP ; TMP = X[N-2] / 2
RCALL ADD_XN_TMP ; X[N] += G[N-1]/2
RCALL LSR_TMP ; TMP = X[N-2] / 4
RCALL LSR_TMP ; TMP = X[N-2] / 8
RCALL SUB_XN_TMP; X[N] -= G[N-1]/8
RCALL LSR_TMP ; TMP = X[N-2] / 16
RCALL LSR_TMP ; TMP = X[N-2] / 32
RCALL ADD_XN_TMP ; X[N] += G[N-1]/32
; X[N] = 0.457*X[N-1] + 0.523*X[N-2] + 1.404*G[N-1]
;-------------------------------------------------------------
; -1.39*G[N-2] = (-1-1/2+1/8-1/32+1/64)*G[N-2]
;-------------------------------------------------------------
MOV TMP_H, GN2_H
MOV TMP_L, GN2_L ; TMP = G[N-2]
RCALL SUB_XN_TMP ; X[N] -= G[N-2]
RCALL LSR_TMP ; TMP = X[N-2] / 2
RCALL SUB_XN_TMP ; X[N] -= G[N-2]/2
RCALL LSR_TMP ; TMP = X[N-2] / 4
RCALL LSR_TMP ; TMP = X[N-2] / 8
RCALL ADD_XN_TMP; X[N] += G[N-2]/8
RCALL LSR_TMP ; TMP = X[N-2] / 16
RCALL LSR_TMP ; TMP = X[N-2] / 32
RCALL SUB_XN_TMP ; X[N] -= G[N-2]/32
RCALL LSR_TMP ; TMP = X[N-2] / 64
RCALL ADD_XN_TMP; X[N] += G[N-2]/64
; X[N] = 0.457*X[N-1] + 0.523*X[N-2] + 1.404*G[N-1] - 1.39*G[N-2]
; Отправка X[N] на 10-битный ЦАП
STS DACL,XN_L ; младший разряд
STS DACH,XN_H ; старший разряд
; Рекуррентный сдвиг параметров уравнения
MOV XN2_H, XN1_H
MOV XN2_L, XN1_L ; X[N-2] = X[N-1]
MOV XN1_H, XN_H
MOV XN1_L, XN_L ; X[N-1] = X[N]
MOV GN2_H, GN1_H
MOV GN2_L, GN1_L ; G[N-2] = G[N-1]
MOV GN1_H, GN_H
MOV GN1_L, GN_L ; G[N-1] = G[N]
RJMP Main
Описание ATMega16M1
ATmega16M1 - экономичный 8-битный КМОП микроконтроллер, выполненный на основе расширенной версии RISC-архитектуры AVR. За счет выполнения большинства инструкций за один цикл синхронизации ATmega16M1 достигает производительности близкой к 1 MIPS/МГц, что позволит разработчику оптимизировать соотношение потребляемой мощности и быстродействия обработки.
Ядро AVR сочетает обширный набор инструкций с 32 рабочими регистрами общего назначения. Все 32 регистра напрямую подключены к арифметико-логическому устройству (АЛУ). Благодаря этому, одна инструкция может осуществлять доступ к двум разным регистрам и такая инструкция может быть выполнена за один цикл синхронизации. В результате, такая архитектура характеризуется более высокой плотностью кода и производительностью, которая на порядок превосходит обычные CISC микроконтроллеры.
Функциональная схема ATMega16M1
Отличительные особенности:
-
Высокоэффективные и экономичные 8-битные микроконтроллеры AVR
-
Прогрессивная RISC-архитектура
-
Эффективный набор инструкций: 131 инструкция, большинство которых выполняется за один цикл синхронизации
-
32 8-битных рабочих регистра общего назначения
-
Полностью статическая работа
-
Производительность до 1 MIPS/МГц
-
Встроенное 2-тактное умножающее устройство
-
Встроенные запоминающие устройства
-
16 кбайт внутрисистемно-программируемой Flash-памяти программ
-
0.5 кбайт внутрисистемно-программируемого EEPROM
-
1 кбайт SRAM
-
Опциональный сектор загрузочного кода с отдельными защитными Lock-битами
-
Внутрисистемное программирование под управлением встроенной загрузочной программы
-
Поддержка исполнения кода программы во время программирования
-
Программируемая защита Flash-памяти и EEPROM
Встроенный отладочный интерфейс (debugWIRE)
Интерфейс CAN 2.0A/B с 6 объектами сообщений (сертифицирован по ISO 16845)
Контроллеры LIN 2.1 и 1.3 или 8-битный UART
Один 12-битный высокобыстродействующий контроллер силового каскада (PSC)
Особенности встроенных модулей ввода-вывода
-
Один 8-битный таймер-счетчик общего назначения с отдельным предделителем, режимами сравнения и захвата
-
Один 16-битный таймер-счетчик общего назначения с отдельным предделителем, режимами сравнения и захвата
-
Один ведущий/подчиненный последовательный интерфейс SPI
-
10-битный АЦП
-
до 11 несимметричных каналов и до 3 полностью дифференциальных каналов
-
программируемое усиление в дифференциальных каналах (5x, 10x, 20x, 40x)
-
встроенный ИОН
-
10-битный ЦАП
Четыре аналоговых компаратора с регулируемым порогом срабатывания
Генерация прерывания и возобновление активной работы по обнаружению изменения состояния выводов
Программируемый сторожевой таймер с отдельным встроенным генератором
Встроенный датчик температуры
Специальные возможности микроконтроллера
-
Экономичные режимы работы: IDLE, NOISE REDUCTION и POWER-DOWN
-
Сброс при подаче питания и программируемый супервизор питания
-
Внутрисистемное программирование через порт SPI
-
Высокоточный кварцевый генератор для синхронизации модуля CAN (16 МГц)
-
Встроенный калиброванный RC-генератор (8 МГц)
-
Встроенный блок PLL (ФАПЧ) для высокочастотной ШИМ и синхронизации ЦПУ
Рабочее напряжение: 2.7…5.5В
Градации по быстродействию:
-
0…8МГц/2.7…4.5В
-
0…16МГц/4.5…5.5В
АЦП
АTMega16M1 имеет встроенный 10-битный АЦП последовательного приближения
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.