михайлов_дз2 (Пример второго готового ДЗ)
Описание файла
Файл "михайлов_дз2" внутри архива находится в папке "Пример второго готового ДЗ". PDF-файл из архива "Пример второго готового ДЗ", который расположен в категории "". Всё это находится в предмете "элементы электронной и микропроцессорной техники" из 8 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "элементы электронной и микропроцессорной техники" в общих файлах.
Просмотр PDF-файла онлайн
Текст из PDF
Московский Государственный Технический Университет имени Н.Э. БауманаДомашнее заданиепо предмету«Управление в технических системах»Выполнил: Данилов М.А.Группа: РК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 регистра напрямую подключены к арифметико-логическому устройству (АЛУ).Благодаря этому, одна инструкция может осуществлять доступ к двум разным регистрам итакая инструкция может быть выполнена за один цикл синхронизации.