михайлов_дз2 (1044810)
Текст из файла
Московский Государственный Технический Университет имени Н.Э. БауманаДомашнее заданиепо предмету«Управление в технических системах»Выполнил: Данилов М.А.Группа: РК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 = 30CLR ZH; ZH = 0DEC ZL; Уменьшаем адрес текущего очищаемого регистраSTZ, ZH ; Записываем в регистр с адресом Z значение 0BRNE PC-2 ; Переход на инструкцию DEC ZL будет происходить; до тех пор, пока в ZL не окажется 0; инициализация указателя стека (SP); необходима, т.к.
будут использоваться вызовы подпрограммLDI R16,Low(RAMEND)OUT SPL,R16LDI R16,High(RAMEND)OUT SPH,R16CLR R16; инициализация 10-битного АЦП2CBI 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 - сигнал берется с пина ADC1STS 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 и DACLSTS DACON, TMP_L ; пишем иниц.
информацию в управл. регистр ЦАПRJMP Main ; переход в основную программу; --------------------------------------------; Подпрограммы для работы с 16-битными числами; --------------------------------------------SUB_XN_TMP:; вычитание двух 16-битных чисел: XN из TMP; XN_H:XN_L = XN_H:XN_L - TML_H:TMP_LSUB 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_L3ADD XN_L, TMP_L ; складываем младшие биты; без учета переносаADC XN_H, TMP_H ; складываем старшие биты; с учетом переносаCLC; очищаем бит переносаRET; возврат в основную программуLSR_TMP:; сдвиг TMP вправо на один разряд; TMP_H:TMP_L = TMP_H:TMP_L >> 1LSR TMP_H; сдвиг старшего байта вправо;(не циклический); TMP_H = TMP_H >> 1ROR 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_HMOV TMP_L, XN1_L ; TMP = X[N-1]RCALL LSR_TMP ; TMP = X[N-1] / 2MOV XN_H, TMP_HMOV XN_L, TMP_L ; X[N] = X[N-1] / 2RCALLRCALLRCALLRCALLLSR_TMP ; TMP = X[N-1] / 4LSR_TMP ; TMP = X[N-1] / 8LSR_TMP ; TMP = X[N-1] / 16SUB_XN_TMP; X[N] = X[N-1]/2 - X[N-1]/16RCALL LSR_TMP ; TMP = X[N-1] / 32RCALL LSR_TMP ; TMP = X[N-1] / 644RCALL ADD_XN_TMP ; X[N] = X[N-1]/2 - X[N-1]/16 + X[N-1]/64RCALL LSR_TMP ; TMP = X[N-1] / 128RCALL ADD_XN_TMP; X[N-1] = X[N-1]/2 - X[N-1]/16 + X[N-1]/64 +;+ X[N-1]/128RCALL LSR_TMP ; TMP = X[N-1] / 256RCALL 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_HMOV TMP_L, XN2_L ; TMP = X[N-2]RCALL LSR_TMP ; TMP = X[N-2] / 2RCALL ADD_XN_TMP ; X[N] = 0.457*X[N-1] + X[N-2] / 2RCALLRCALLRCALLRCALLRCALLLSR_TMP ; TMP = X[N-2] / 4LSR_TMP ; TMP = X[N-2] / 8LSR_TMP ; TMP = X[N-2] / 16LSR_TMP ; TMP = X[N-2] / 32ADD_XN_TMP; X[N] = 0.457*X[N-1] + X[N-2] / 2 + X[N-2]/32RCALL LSR_TMP ; TMP = X[N-2] / 64RCALL SUB_XN_TMP; X[N] = 0.457*X[N-1] + X[N-2] / 2 +; + X[N-2]/32 - X[N-2]/64RCALL LSR_TMP ; TMP = X[N-2] / 128RCALL 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]/128RCALL LSR_TMP ; TMP = X[N-2] / 256RCALL 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]/256RCALL LSR_TMP ; TMP = X[N-2] / 512RCALL 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_HMOV TMP_L, GN1_L ; TMP = G[N-1]RCALL ADD_XN_TMP ; X[N] += G[N-1]RCALL LSR_TMP ; TMP = X[N-2] / 2RCALL ADD_XN_TMP ; X[N] += G[N-1]/25RCALL LSR_TMP ; TMP = X[N-2] / 4RCALL LSR_TMP ; TMP = X[N-2] / 8RCALL SUB_XN_TMP; X[N] -= G[N-1]/8RCALL LSR_TMP ; TMP = X[N-2] / 16RCALL LSR_TMP ; TMP = X[N-2] / 32RCALL 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_HMOV TMP_L, GN2_L ; TMP = G[N-2]RCALL SUB_XN_TMP ; X[N] -= G[N-2]RCALL LSR_TMP ; TMP = X[N-2] / 2RCALL SUB_XN_TMP ; X[N] -= G[N-2]/2RCALL LSR_TMP ; TMP = X[N-2] / 4RCALL LSR_TMP ; TMP = X[N-2] / 8RCALL ADD_XN_TMP; X[N] += G[N-2]/8RCALL LSR_TMP ; TMP = X[N-2] / 16RCALL LSR_TMP ; TMP = X[N-2] / 32RCALL SUB_XN_TMP ; X[N] -= G[N-2]/32RCALL LSR_TMP ; TMP = X[N-2] / 64RCALL 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_HMOV XN2_L, XN1_L ; X[N-2] = X[N-1]MOV XN1_H, XN_HMOV XN1_L, XN_L ; X[N-1] = X[N]MOV GN2_H, GN1_HMOV GN2_L, GN1_L ; G[N-2] = G[N-1]MOV GN1_H, GN_HMOV GN1_L, GN_L ; G[N-1] = G[N]RJMP Main6Описание ATMega16M1ATmega16M1 - экономичный 8-битный КМОП микроконтроллер, выполненный на основерасширенной версии RISC-архитектуры AVR.
За счет выполнения большинства инструкцийза один цикл синхронизации ATmega16M1 достигает производительности близкой к 1MIPS/МГц, что позволит разработчику оптимизировать соотношение потребляемоймощности и быстродействия обработки.Ядро AVR сочетает обширный набор инструкций с 32 рабочими регистрами общего назначения. Все 32 регистра напрямую подключены к арифметико-логическому устройству (АЛУ).Благодаря этому, одна инструкция может осуществлять доступ к двум разным регистрам итакая инструкция может быть выполнена за один цикл синхронизации.
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.