Разработка и отладка программы на языке ассемблера

 

Первым делом необходимо разработать секцию инициализации, которая обязательно должна начинаться с нулевого адреса. В секции инициализации предусмотрим следующие макросы:

InitSteck – инициализация стека, запись вершины стека

InitInt – инициализация прерываний, разрешение всех прерываний и прерываний от таймера счетчика, в частности.

InitTimer – инициализация таймера, выбор первого таймера/счетчика, выбор первого режима работы, запрет внешнего управления. Выбираем функцию таймера.

InitCoeff – инициализация коэффициентов, запись констант значений коэффициентов в память (при этом коэффициенты располагаются в памяти последовательно)

InitPSW – инициализация PSW основной программы и программы вычисления отсчетов. В память программы записываются соответствующие значения PSW.

ClearXn – инициализация отсчетов, очистка памяти выделенной под отсчеты.

ReloadTimer – инициализация таймера, остановка таймера, загрузка значений младшего и старшего байтов интервала дискредитации.

После инициализации идет основная программа.

MainProgramm – бесконечный цикл основной программы. Выход по прерыванию от TC0.

Дальше идет секция исполнения, в которой происходит обработка входных данных и вывод их на выходной порт.

RunACP - макрос запуска внешнего устройства. По линии P3.0 на соответствующий контакт устройства подается импульс нулевого уровня.   

ReloadTimer – то же что и в секции инициализации

SavePSW – сохранение PSW основной программы и загрузка PSW рабочей программы.

CheckACP – проверка готовности данных от внешнего устройства. Если по линии P3.2 установлен 0, то данные готовы.

InputData – Ввод входных данных. Т.к. выводы внешнего входного устройство имеют третье состояние, то для того что бы данные попали на порт МК, необходимо по линии P3.1 сформировать импульс низкого уровня.

PrepareData – макрос, необходимый для упрощения разностного уравнения. Здесь происходит суммирование отсчетов стоящих у симметричных коэффициентов и запись суммы последовательно в память.

ComputeSample – макрос вычисления отсчета. Содержит в себе макрос очистки двухбайтовой суммы и макрос суммирования с ее накоплением.

ShiftL – сдвиг результата на 1 разряд влево.

OutputData – макрос вывода данных. Здесь результат переводится из дополнительного кода в прямой и затем старший байт отправляется на выходной порт. Формируется импульс по линии P1.0, для фиксации выходного отсчета на ЦАП.

PrepareCycl – последовательный сдвиг отсчетов в памяти.

ReloadPSW – запись PSW рабочий программы и восстановление PSW основной.

RETI – возвращение в основную программу.


Текст программы

 

*********************************************************************************

*                            Цифровой фильтр высокой частоты                                            *

*     Курсовой проект по дисциплине "Цифровые устройства и микропроцессоры"        *

*                            Код           F0b12_70                                                                    *

*     Выполнил студент группы 410   Косс Андрей Владимирович                                      *

*                                                                                                                                             *

*********************************************************************************

       SPACES ON;Разрешить пробелы между операндами

       FILLCHAR 00h   ;Заполнить промежутки между секциями символами 00

 

************ ОПРЕДЕЛЕНИЕ КОНСТАНТ ************

Time0L:     EQU 70h;Младший байт числа -400 в ДК

Time0H:     EQU FEh;Старший байт числа -400 в ДК

Order: EQU 07h;Число циклов суммирования (общее число слагаемых)

MODE1:     EQU 01h;установка TC0 в режим 1, таймер, НЕ разрешено внешн. упр

Datab1:      EQU 06h;значение коэффициента b1                                        

Datab2:      EQU 03h;значение коэффициента b2

Datab3:      EQU 91h;значение коэффициента b3

Datab4:      EQU 0Eh;значение коэффициента b3

Datab5:      EQU 16h;значение коэффициента b3

Datab6:      EQU CBh;значение коэффициента b3

Datab7:      EQU E5h;значение коэффициента b3

MRBank:    EQU 01h;регистровый банк основной прграммы

RRBank:    EQU 18h;регистровый банк прграммы вычисления отсчёта

Maska1:     EQU 7Fh;маска для получения беззнаковых чисел

Maska2:     EQU 00h;маска для очистки двухбайтового сумматора

Maska3:     EQU 00h;маска для очистки ячеек хранения отсчёта          

Shift: EQU 01h;количество разрядов на которое необходимо сдвинуть результат вычисления

************ ОПРЕДЕЛЕНИЕ НЕПЕРЕМЕЩАЕМЫХ РЕГИСТРОВ ************

IE:  REG A8h;Присвоить имя IE регистру разрешения прерываний (ячейка A8h)

TCON: REG 88h;Присвоить имя TCON регистру управления таймерами/счетчиками

TMOD:       REG 89h;Присвоить имя TMOD регистру режима таймеров/счетчиков

InPort: REG P0  ;Присвоить имя InPort порту P0

OutPort:      REG P1  ;Присвоить имя OutPort порту P1

SP:  REG 81h;Присвоить имя SP указателю стека (ячейка 81h)

PSW: REG D0h;Присвить имя PSW регистру слова состояния МК

 

************  ОПРЕДЕЛЕНИЕ НЕПЕРЕМЕЩАЕМЫХ БИТ ************

ET0: REG IE.1;Присвоить имя ET0 биту 1 регистра IE

EA: REG IE.7;Присвоить имя EA биту 7 регистра IE

ITO: REG TCON.0    ;Присвоить имя IT0 биту 0 регистра TCON

IEO: REG TCON.1    ;Присвоить имя IE0 биту 1 регистра TCON

TR0: REG TCON.4    ;Присвоить имя TR0 биту 4 регистра TCON

RD: REG P3.1;Присвоить имя RD биту 0 порта P3

B0: REG P3.0;Присвоить имя B0 биту 1 порта P3

CheckBit:   REG P3.2;Присвоить имя CheckBit биту 2 порта P3

WR: REG P1.0;Присвоить имя WR биту 0 порта Р1

SignA: REG E0h.7;Присвоить имя SignA (знак регистра А) старшему биту аккумулятора

SignB: REG F0h.7;Присвоить имя SignB (знак регистра B) старшему биту регистра В      

 

************ ОПРЕДЕЛЕНИЕ ПЕРЕМЕЩАЕМЫХ РЕГИСТРОВ ************

                   RSECT;Секция байт, располагается в DSEG        

 

b1:  DS  1                           ;Коэффициенты числителя

b2:  DS  1                           ;

b3:  DS  1                           ;

b4:  DS  1                           ;

b5:  DS  1                           ;

b6:  DS  1                           ;

b7:  DS  1                           ;

       DS  09h                       ;

Xn1: DS 1                           ;Текущие отсчеты

Xn2: DS  1                           ;

Xn3: DS 1                           ;

Xn4: DS 1                           ;

Xn5: DS 1                           ;

Xn6: DS 1                           ;

Xn7: DS 1                           ;

Xn8: DS 1                           ;

Xn9: DS 1                           ;

Xn10: DS 1                           ;

Xn11: DS 1                           ;

Xn12: DS 1                           ;

Xn13: DS 1                           ;

       ds   01h                       ;

X1: DS 1                           ;Отсчеты соответствующие упрощенному уравнению

X2: DS 1                           ;

X3: DS 1                           ;

X4: DS 1                           ;

X5: DS 1                           ;

X6: DS 1                           ;

X7: DS 1                           ;

       DS  09h                       ;

Yn1 DS  1                           ;Выходной отсчет

MainPSW:  DS  1                ; Регистр для записи PSW основной программы

RunPSW:    DS  1                ; Регистр для записи PSW программы вычисления отчёта

VarA: DS  1                           ;Байт для промежуточного хранения аккумулятора

SumH: DS  1                           ;Старший байт суммы

SumL: DS  1                           ;Младший байт суммы

AddrSP:      DS  1                ;Начало стека

 

************ ОПРЕДЕЛЕНИЕ ПЕРЕМЕЩАЕМЫХ БИТ ************

 

SignM: DS  1                           ;Регистр для хранения знака произведения

 

************************* МАКРОСЫ *************************

;---------------------------------------------------------------------------------------------------------------;Определение знака произведения

;Определяет знак произведения двух множителей, представленных в прямом

;коде и расположенных в регистрах А и В. SignM = SignA XOR SignB

;Автор: библиотека

;---------------------------------------------------------------------------------------------------------------SignMUL:       MACRO                     

       MOV C, SignA

       ANL C, /SignB

       MOV SignM, C

       MOV C, SignB

       ANL C, /SignA        

       ORL C, SignM

       MOV SignM, C

       ENDM

;---------------------------------------------------------------------------------------------------------------;Преобразование произведения в дополнительный код

;[B,A](БезЗн)=>

;Автор: библиотека

;---------------------------------------------------------------------------------------------------------------PK_DK_MUL:        MACRO

       JNB SignM, M1#

       CPL A

       ADD A, #01h

       MOV VarA, A

       MOV A, B

       CPL A

       ADDC A, #00h          

       MOV B, A    

       MOV A, VarA

M1#: ENDM

;---------------------------------------------------------------------------------------------------------------;Накапливающий сумматор двухбайтовых чисел [B,A]+[SumH,SumL]=>[SumH,SumL]

;Автор: библиотека

;---------------------------------------------------------------------------------------------------------------Sum2Byte:       MACRO

       ADD A, SumL

       MOV SumL, A

       MOV A, B

       ADDC A, SumH

       MOV SumH, A

       ENDM

;---------------------------------------------------------------------------------------------------------------;Умножение C накоплением двух чивел, адреса которых находятся в регистрах R0 и R1

;текущего регистрового банка

;Автор:библиотека

;---------------------------------------------------------------------------------------------------------------MAC:        MACRO

       MOV A, @R0

       MOV B, @R1

       SignMUL

       ANL A,#Maska1

       ANL B,#Maska1

       MUL AB

       PK_DK_MUL

       Sum2Byte

       ENDM

;---------------------------------------------------------------------------------------------------------------;Очистка 2-байтового накопительного сумматора

;Автор: библиотека

;---------------------------------------------------------------------------------------------------------------ClearSum2Byte:       MACRO

       MOV SumH, #Maska2

       MOV SumL, #Maska2

       ENDM

;---------------------------------------------------------------------------------------------------------------;Вычисление отсчетов упрощенного уравнения

;Автор: Косс А.В.

;---------------------------------------------------------------------------------------------------------------PrepareData:       MACRO

       MOv A, Xn1

       ADD A, Xn13

       MOV X1, A

       MOv A, Xn2

       ADD A, Xn12

       MOV X2, A

       MOv A, Xn3

       ADD A, Xn11

       MOV X3, A

       MOv A, Xn4

       ADD A, Xn10

       MOV X4, A

       MOv A, Xn5

       ADD A, Xn9

       MOV X5, A

       MOv A, Xn6

       ADD A, Xn8

       MOV X6, A

       MOV X7, Xn7

       ENDM

;---------------------------------------------------------------------------------------------------------------;Вычисление отсчета

;Автор: библиотека

;---------------------------------------------------------------------------------------------------------------ComputeSample:            MACRO

       ClearSum2Byte

       MOV R0, #b1

       MOV R1, #X1

       MOV R4, #Order

M2# MAC

       INC R0

       INC R1

       DJNZ R4, M2#

       ENDM

;---------------------------------------------------------------------------------------------------------------;Подготовка цикла

;Автор: библиотека

;---------------------------------------------------------------------------------------------------------------PrepareCycl:       MACRO

           

       MOV Yn1, SumH

       MOV Xn13, Xn12

       MOV Xn12, Xn11

       MOV Xn11, Xn10

       MOV Xn10, Xn9

       MOV Xn9, Xn8

       MOV Xn8, Xn7

       MOV Xn7, Xn6

       MOV Xn6, Xn5

       MOV Xn5, Xn4       

       MOV Xn4, Xn3

       MOV Xn3, Xn2

       MOV Xn2, Xn1

       MOV Xn1, InPort

       ENDM

;---------------------------------------------------------------------------------------------------------------;Инициализация прерываний

;EA=1 - разрешить все прерывания

;ET0=1 - разрешить прерываний TC0

;Автор: Косс А.В.

;---------------------------------------------------------------------------------------------------------------InitInt: MACRO

       SETB EA                             

       SETB ET0                

       ENDM

;---------------------------------------------------------------------------------------------------------------;Перезагрузка таймера

;Автор: Косс А.В.

;---------------------------------------------------------------------------------------------------------------ReloadTimer:       MACRO

       CLR TR0

       MOV TL0, #Time0L

       MOV TH0, #Time0H

       SETB TR0

       ENDM

;---------------------------------------------------------------------------------------------------------------;Инициализация таймера

;Автор: Косс А.В.

;---------------------------------------------------------------------------------------------------------------InitTimer:       MACRO

       ANL TMOD,#F0h

       ORL TMOD,#MODE1

       ENDM

;---------------------------------------------------------------------------------------------------------------;Инициализация стека;установка вершины стека

;Автор: библиотека

;---------------------------------------------------------------------------------------------------------------

InitSteck:    MACRO

       MOV SP, #AddrSP   

       DEC SP

       ENDM

;---------------------------------------------------------------------------------------------------------------;Инициализация PSW

;Автор: Косс А.В.

;---------------------------------------------------------------------------------------------------------------InitPSW:       MACRO

       MOV MainPSW,#MRBank

       MOV RunPSW,#RRBank

       ENDM

 

;---------------------------------------------------------------------------------------------------------------;Инициализация коэффициентов

;Автор: Косс А.В.

;---------------------------------------------------------------------------------------------------------------InitCoeff:       MACRO                   

       MOV b1, #Datab1

   MOV b2, #Datab2

   MOV  b3, #Datab3

   MOV  b4, #Datab4

   MOV  b5, #Datab5

   MOV  b6, #Datab6

   MOV  b7, #Datab7

       ENDM

;---------------------------------------------------------------------------------------------------------------;Инициализация отсчётов

;Автор: библиотека  

;---------------------------------------------------------------------------------------------------------------ClearXn:       MACRO

   MOV  Xn1, #Maska3

   MOV Xn2, #Maska3

   MOV  Xn3, #Maska3

   MOV  Xn4, #Maska3          

   MOV  Xn5, #Maska3

   MOV  Xn6, #Maska3

   MOV  Xn7, #Maska3

   MOV  Xn8, #Maska3

   MOV  Xn9, #Maska3

   MOV  Xn10, #Maska3

   MOV  Xn11, #Maska3

   MOV  Xn12, #Maska3

   MOV  Xn13, #Maska3

       ENDM

;---------------------------------------------------------------------------------------------------------------;Основная программа

;Автор: библиотека  

;---------------------------------------------------------------------------------------------------------------MainProgramm:       MACRO

M3#: SJMP M3#

       ENDM

;---------------------------------------------------------------------------------------------------------------;Преобразование данных из дополнительного в прямой код

; InByte(ДК)=> OutByte(ПК)

;Автор: библиотека

;---------------------------------------------------------------------------------------------------------------DK_PK:       MACRO                 InByte, OutByte

       MOV A, InByte

       JNB SignA, M4#

       XRL A, #7Fh

       INC A

M4#: MOV OutByte, A

       ENDM

;---------------------------------------------------------------------------------------------------------------;Сохранение PSW основной программы и загрузка PSW программы вычисления отчета

;Автор: Косс А.В.

;---------------------------------------------------------------------------------------------------------------SavePSW: MACRO

       MOV MainPSW,PSW

       MOV PSW,RunPSW

       ENDM

;---------------------------------------------------------------------------------------------------------------;Восстановление PSW основной программы

;Автор: Косс А.В.

;---------------------------------------------------------------------------------------------------------------ReloadPSW: MACRO

       MOV RunPSW,PSW

       MOV PSW,MainPSW

       ENDM

;---------------------------------------------------------------------------------------------------------------;Запуск входного внешнего устройства

;Автор: Косс А.В.

;---------------------------------------------------------------------------------------------------------------

RunACP:    MACRO

       CLR B0

       SETB B0

       ENDM

;---------------------------------------------------------------------------------------------------------------;Проверка готовности данных входного внешнего устройства

;Автор: Косс А.В.

;---------------------------------------------------------------------------------------------------------------CheckACP: MACRO

M6#:    JB CheckBit,M6#

       ENDM

;---------------------------------------------------------------------------------------------------------------;Сдвиг результата вычисления на 1 разряд в лево

;Автор: Косс А.В.

;---------------------------------------------------------------------------------------------------------------

ShiftL: MACRO

       MOV R7, #Shift

M1#: CLR C

       MOV A, SumL

       RLC A

       MOV SumL, A

       MOV A, SumH

       RLC A

       MOV SumH, A

       DJNZ R7, M1#

       ENDM

;---------------------------------------------------------------------------------------------------------------;Ввод данных из P0 в Xn1

;Автор: Косс А.В.

;---------------------------------------------------------------------------------------------------------------InputData:       MACRO

       SETB RD

       DK_PK InPort, Xn1

       CLR RD

       ENDM

;---------------------------------------------------------------------------------------------------------------;Перевод двухбайтового числа (результат вычисления отсчёта) из дополнительного в прямой код

;Автор: Косс А.В.

;---------------------------------------------------------------------------------------------------------------

DK_PK_Rez: MACRO

       MOV A,SumH

       JNB SignA,M1#

       MOV A,SumL

       CLR C

       SUBB A,#01h

       CPL A

       MOV SumL,A

       MOV A,SumH

       SUBB A,#00h

       XRL A,#7fh

M1#: MOV SumH,A

       ENDM

;---------------------------------------------------------------------------------------------------------------

;Вывод данных

;Автор: Косс А.В.

;---------------------------------------------------------------------------------------------------------------

OutputData: MACRO

       DK_PK_Rez

       MOV OutPort, SumH

       SETB WR

       CLR WR

       ENDM

 

************************ ПРОГРАММА ************************

                  .CODE;Секция кода, располагается в СSEG

      ;Таблица векторов прерываний

;Прерывание RESET - стартовый адрес при сбросе микроконтроллера

       ORG 0h

       LJMP Init ;инициализация программы

 

;Прерывание TIMER0 - Прерывание таймера/счетчика 0

       ORG 000Bh

       LJMP Run

 

*****************************************************************

;Программа инициализации

InitSect:      SECTION  ;Секция инициализации

Init: InitSteck

       InitInt

       InitTimer

       InitCoeff

       InitPSW

       ClearXn

       ReloadTimer

       MainProgramm

 

*****************************************************************

RunSect:     SECTION  ;Секция исполнения

Run: RunACP

       ReloadTimer

       SavePSW

       CheckACP

       InputData

       PrepareData

       ComputeSample

       ShiftL

       OutputData

       PrepareCycl

       ReloadPSW

       RETI





Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: