Файл: 3 Алгоритмы и листинги.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 05.06.2020

Просмотров: 87

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


3 Алгоритмы и листинги


3.1 Алгоритм программы Stend.a: система управления оборотами двигателя и температуры (СУ ОДиТ)




































tзад < tОУ

tзад = tОУ





tзад > tОУ



да

да












да




3.2 Листинг программы Stend.a: СУ ОДиТ


3.2.1 Инициализация служебных регистров. В данном фрагменте производится инициализация регистра модуля SPTI, модуля LCD, а также модуля клавиатуры.

.OPTION TARGET = "CPU32"

;***************************** Task1 SI(SPTI)*******************************

SIMCR equ $FFFA00 ;Адрес регистра SIMCR

SYPCR equ $FFFA21 ;Адрес регистра SYPCR

PICR equ $FFFA22 ;Адрес регистра PICR

PITR equ $FFFA24 ;Адрес регистра PITR

SYPCR equ $FFFA21 ;Адрес регистра SYPCR

TPUMCR equ $FFFE00 ;Адрес регистра TPUMCR

TICR equ $FFFE08 ;Адрес регистра TICR

CIER equ $FFFE0A ;Адрес регистра CIER

CFSR3 equ $FFFE12 ;Адрес регистра CFSR3

HSRR1 equ $FFFE1A ;Адрес регистра HSRR1

CPR1 equ $FFFE1E ;Адрес регистра CPR1

CISR equ $FFFE20 ;Адрес регистра CISR

C0PAR0 equ $FFFF00 ;Адрес 0-го параметра 0-го канала

C0PAR2 equ $FFFF04 ;Адрес 2-го параметра 0-го канала

C0PAR3 equ $FFFF06 ;Адрес 3-го параметра 0-го канала

C1PAR0 equ $FFFF10 ;Адрес 0-го параметра 1-го канала

C1PAR2 equ $FFFF14 ;Адрес 2-го параметра 1-го канала

C1PAR3 equ $FFFF16 ;Адрес 3-го параметра 1-го канала


A6_T equ $007000

D7_T equ $007004

D6_T equ $007008

STAT equ $00700C

NUMB equ $00700E

DISP equ $007012

DISPF equ $007016


CSOR10 equ $FFFA76 ;Адрес регистра CSOR10

CSBAR10 equ $FFFA74 ;Адрес регистра CSBAR10

LED equ $006000 ;Адрес LED-индикаторов


;**************************** Task2 LCD*************************************

CSBAR7 equ $FFFA68 ;Адрес регистра CSBAR7

CSOR7 equ $FFFA6A ;Адрес регистра CSOR7

CSBAR8 equ $FFFA6C ;Адрес регистра CSBAR8

CSOR8 equ $FFFA6E ;Адрес регистра CSOR8

IR equ $004000 ;Адрес регистра IR (LCD)

DR equ $005000 ;Адрес регистра DR (LCD)


DIG1 equ $007026

DIG2 equ $007027

DIG3 equ $007028

DIG4 equ $007029

PD2 equ $00702A

PD3 equ $00702B


;**************************** Task3 Keyboard*******************************

PORTE0 equ $FFFA11 ;Адрес регистра PORTE0

DDRE equ $FFFA15 ;Адрес регистра DDRE

PEPAR equ $FFFA17 ;Адрес регистра PEPAR

KEY equ $007020


3.2.2 Начальная установка служебных регистров.

SECTION prog_code

move #0005,D0

movec D0,SFC ;Инициализация регистра SFC

movec D0,DFC ;Инициализация регистра DFC

move #$00CF,SIMCR

move.b #$0040,SYPCR ;Запрещение WatchDog

move #$0060,CSBAR10 ;Задание начального адреса ; и размера блока для CS10

move #$5030,CSOR10 ;Настройка CS10

move.b #$04,PEPAR ;Определение функций пинов порта E

move.l #Int,$000078 ;Запись адреса обработчика

; прерывания для вектора IRQ6

andi #$F0FF,SR ;Установка маски прерывания

ori #$0500,SR ; для IRQ6


;*********************************OS*************************************************

move #$0060,CSBAR10

move #$5030,CSOR10

move.l #$002002,DISP

move.l #$00D000,DISPF

move.l DISPF,A0

move.l #$0,NUMB

move.b #$0,STAT

move.l #Task1,(A0)+

move.l #$00008000,(A0)+

move.l #Task2,(A0)+

move.l #$00009000,(A0)+

move.l #Task3,(A0)+

move.l #$0000A000,(A0)+

move.l #IntPIT,$0003FC

move #$005F,PITR

move #$07FF,PICR


BegPIT:

move #$FFFF,LED

bra BegPIT


IntPIT:

move #$00FF,PICR

move #$0000,PITR

move.l A6,A6_T

move.l D7,D7_T

move.l D6,D6_T

move.l NUMB,D7

move.l #$40,D6

mulu.l D6,D7

add.l DISP,D7

move.l D7,A6

move.l A0,(A6)+

move.l A1,(A6)+

move.l A2,(A6)+

move.l A3,(A6)+

move.l A4,(A6)+

move.l A5,(A6)+

move.l A6_T,(A6)+

move.l A7,(A6)+

move.l D0,(A6)+

move.l D1,(A6)+

move.l D2,(A6)+

move.l D3,(A6)+

move.l D4,(A6)+

move.l D5,(A6)+

move.l D6_T,(A6)+

move.l D7_T,(A6)+

cmp.b #$5,STAT

beq NotFirst

cmp.b #$1,STAT

blt JTT

addi.l #$1,NUMB

JTT:

move.l NUMB,D7

move.l #$8,D6

mulu.l D6,D7

add.l DISPF,D7

move.l D7,A6


addi.l #$4,D7

move.l D7,A5

addi.b #$1,STAT

move.l (A5),SP

move #$000F,PITR

move #$07FF,PICR

move.l (A6),A6

jmp (A6)


NotFirst:

cmpi.l #$4,NUMB

bne Load

move.l #$0,NUMB

bra Cycle

Load:

addi.l #$1,NUMB

Cycle:

move.l NUMB,D7

mulu.l D6,D7

add.l DISP,D7

move.l D7,A6

move.l (A6)+,A0

move.l (A6)+,A1

move.l (A6)+,A2

move.l (A6)+,A3

move.l (A6)+,A4

move.l (A6)+,A5

move.l (A6)+,A6_T

move.l (A6)+,A7


move.l (A6)+,D0

move.l (A6)+,D1

move.l (A6)+,D2

move.l (A6)+,D3

move.l (A6)+,D4

move.l (A6)+,D5

move.l (A6)+,D6

move.l (A6)+,D7

move.l A6_T,A6

move #$005F,PITR

move #$07FF,PICR

rte


3.2.3 Ввод с клавиатуры стенда значения регулируемой температуры. В данном фрагменте производится запись значения регулируемой температуры в ячейку памяти KEY. Также предусмотрена возможность удаления неверно введенного значения.

;*******************************LCD**************************************

Task1:

move #$FFFF,LED

move #$0040,CSBAR7 ;Задание начального адреса и размера

; блока памяти для CS7

move #$7830,CSOR7 ;Настройка CS7

move #$0041,CSBAR8 ;Задание начального адреса и размера

; блока памяти для CS8

move #$7830,CSOR8 ;Настройка CS8


Init:;*********************Инициализация LCD*********************************

bsr Tormozzz ;Последовательность действий,

move #$0030,IR ; выполненная

bsr Tormozzz ; согласно

move #$0030,IR ; рекомендациям

bsr Tormozzz ; фирмы-изготовителя 

move #$0030,IR ; LCD


bsr TestBF ;Проверка флага занятости LCD

move #$0038,IR ;8 бит шина данных, индикация 2-х строк

bsr TestBF ;Проверка флага занятости LCD

move #$000C,IR ;Отображение включено, курсор

; в виде подчерка

bsr TestBF ;Проверка флага занятости LCD

move #$0006,IR ;Режим увеличения счетчика

bsr TestBF ;Проверка флага занятости LCD

move #$0002,IR ;Счетчик на начало первой строки

bsr TestBF ;Проверка флага занятости LCD

move #$0001,IR ;Очистка экрана

bsr TestBF ;Проверка флага занятости LCD


;*****************************Keyboard***********************************

move.b #$D0,DDRE ;Настройка пинов порта E на I/O

move.b #$04,PEPAR ;Определение функций пинов порта E


Line1:

move.b #$C0,PORTE0 ;Вывод "0" на линию PE4

move.b PORTE0,D5 ;Чтение из порта E в регистр D5

Key1:

btst #$00,D5 ;Проверка "0" на

bne Key2 ; линии PE0

move.b #$00,D7 ;Запись номера нажатой клавиши в D7

move.b #$30,D6 ;Ввод символа

bra Simbol ;Запись символа в память

Key2:

btst #$01,D5 ;Проверка "0" на

bne Key3 ; линии PE1

move.b #$01,D7 ;Запись номера нажатой клавиши в D7

move.b #$31,D6 ;Ввод символа

bra Simbol ;Запись символа в память

Key3:

btst #$03,D5 ;Проверка "0" на

bne Key4 ; линии PE3

move.b #$02,D7 ;Запись номера нажатой клавиши в D7

move.b #$32,D6 ;Ввод символа

bra Simbol ;Запись символа в память

Key4:

btst #$05,D5 ;Проверка "0" на

bne Line2 ; линии PE5

move.b #$03,D7 ;Запись номера нажатой клавиши в D7

move.b #$33,D6 ;Ввод символа

bra Simbol ;Запись символа в память


Line2:

move.b #$90,PORTE0 ;Вывод "0" на линию PE6

move.b PORTE0,D5 ;Чтение из порта E в регистр D5

Key5:

btst #$00,D5 ;Проверка "0" на

bne Key6 ; линии PE0

move.b #$04,D7 ;Запись номера нажатой клавиши в D7

move.b #$34,D6 ;Ввод символа

bra Simbol ;Запись символа в память

Key6:

btst #$01,D5 ;Проверка "0" на

bne Key7 ; линии PE1

move.b #$05,D7 ;Запись номера нажатой клавиши в D7

move.b #$35,D6 ;Ввод символа

bra Simbol ;Запись символа в память

Key7:

btst #$03,D5 ;Проверка "0" на

bne Key8 ; линии PE3

move.b #$06,D7 ;Запись номера нажатой клавиши в D7

move.b #$36,D6 ;Ввод символа

bra Simbol ;Запись символа в память


Key8:

btst #$05,D5 ;Проверка "0" на

bne Line3 ; линии PE5

move.b #$07,D7 ;Запись номера нажатой клавиши в D7

move.b #$37,D6 ;Ввод символа

bra Simbol ;Запись символа в память


Line3:

move.b #$50,PORTE0 ;Вывод "0" на линию PE7

move.b PORTE0,D5 ;Чтение из порта E в регистр D5

Key9:

btst #$00,D5 ;Проверка "0" на

bne Key10 ; линии PE0

move.b #$08,D7 ;Запись номера нажатой клавиши в D7

move.b #$38,D6 ;Ввод символа

bra Simbol ;Запись символа в память

Key10:

btst #$01,D5 ;Проверка "0" на

bne Key11 ; линии PE1

move.b #$09,D7 ;Запись номера нажатой клавиши в D7

move.b #$39,D6 ;Ввод символа

bra Simbol ;Запись символа в память

Key11:

btst #$03,D5 ;Проверка "0" на

bne Key12 ; линии PE3

bra Cooking

Key12:

btst #$05,D5 ;Проверка "0" на

bne Line1 ; линии PE5

clr KEY ;Обнуление ячейки памяти

clr D7 ;Обнуление регистра D7

bsr TestBF ;Проверка флага занятости LCD

move #$0080,IR ;Переход на начало

move.b #$00,D1 ; первой строки

bsr TestBF ;Проверка флага занятости LCD

bsr Tormozzz ;цикл задержки

move #$0001,IR ;Очистка экрана

bra Line1

Simbol:

move.b #$0A,D3 ;Правильный операнд ;-)

mulu KEY,D3 ;Увеличение старого содержимого в 10 раз

addx.b D3,D7 ;Добавление новой цифры к числу

move.b D7, KEY ;Сохраняем новое значение цифры

Cooking:


TestBF:

move.b #$07,D2 ;Проверка

move IR,D3 ; флага

btst D2,D3 ; занятости LCD

bne TestBF

rts


Tormozzz:

move #$0FFF,D4 ;Инициализация счётчика

Loop: ;Цикл задержки

subq #1,D4

bne Loop

rts


3.2.4 Опрос состояния лабораторного стенда СУ ОДиТ.

Setup:

bsr Main

cmp.b #$01, STAT

beq Ch1

cmp.b #$02, STAT

beq Ch2

cmp.b #$03, STAT

beq Ch3

cmp.b #$04, STAT

beq Ch4

cmp.b #$05, STAT

beq IntRef

cmp.b #$06, STAT

beq Temp

bra Setup


Ch1:

move #$0001,CHANAL

move.b #$00, SP

bra OutCh

Ch2:

move #$0002,CHANAL

move.b #$00, SP

bra OutCh

Ch3:

move #$0003,CHANAL

move.b #$00, SP

bra OutCh

Ch4:

move #$0004,CHANAL

move.b #$00, SP

bra OutCh


IntRef:

move #$0007,CHANAL

move.b #$00, SP

bra OutIntRef


Temp:

move #$0000,CHANAL

move.b #$00, SP

bra OutTemp


OutCh:

move.l #$002002,DISP

move.l #$00D000,DISPF

move.l DISPF,A0

move.l #CHANAL,NUMB

move.b #$0,STAT

move.b CHANAL+1,D5

ori.b #$30,D5

move #$0030,CSBAR6 ;Определение начального адреса

; и размера блока памяти для CS6

move #$7830,CSOR6 ;Настройка CS6

move.b #$7B,PQSPAR ;Настройка

move.b #$7E,DDRQS ; пинов QSM

move #$0001,CHANAL


3.2.5 Модуль чтения/записи в СУ ОДиТ.

BeginADC:

move #$A804,SPCR0 ;Установка QSPI платы в Master, CPOL=0,

; CPHA=0

move.b #$02,CR0 ;8 бит в пакете, вырабатываются PCS1

move CHANAL,TR0 ;Настройка QSPI на 1-й канал

bsr RunSPI

move.b #$00,CONVST ;Сигнал начала преобразования

bsr TormozADC ;Задержка на время преобразования

;*********************Чтение из QSPI **************************************

move #$AB04,SPCR0 ;Установка QSPI платы в Master,CPOL=1,

; CPHA=1

move.b #$43,CR0 ;10 бит в пакете, вырабатывается PCS0,

;PCS1

bsr RunSPI

;***********************************************************************

move RR0,VALEU ;Запись результата в ячейку

; памяти VALEU

bra BeginADC

;***********************************************************************

RunSPI: ;Подпрограмма запуска QSPI

move #$0007,D2

ori #$8000,SPCR1 ;Запуск QSPI

NotSPIF:

move.b SPSR,D3 ;Проверка

btst D2,D3 ; завершения

beq NotSPIF ; передачи

rts

TormozADC: ;Подпрограмма задержки

move #$0014,D1 ;Инициализация счетчика


LoopADC: ;Начало цикла задержки

subq #1,D1 ;Уменьшение содержимого счетчика

bne LoopADC

rts


;****************************Transfer****************************************


BeginHBDC:

move.l #$00,D0

move.l #$00,D1

move.l #$00,D2

move.l #$00,D3

move.l #$00,D4

move.l #$00,D5


move.l #TETR0,D4

addi.b #$2,D4

move.l D4,A0

move.b #$06,D5


NewConv:

move.b #$00,(A0)+

subi.b #$1,D5

bne NewConv

move VALEU,D0

cmpi #$00,CHANAL

beq TermConv

move.l #$000000F4,D3

mulu.l D3,D0

bra BegConv


TermConv:

move.l #$04,D3

divu.l D3,D0

subi.l #$67,D0

BegConv:

cmpi.l #$000A,D0

blt EndTetr

sub.l #$000A,D0

addi.l #$1,D1

bra BegConv


EndTetr:

cmpi.l #$000A,D1

blt EndConv

move.l #$0,D4

move D2,D4

addi.l #TETR0,D4

move.l D4,A0

move.b D0,(A0)

move.l D1,D0

move.l #$00,D1

addi #$1,D2

bra BegConv


EndConv:

move.l #$0,D4

move D2,D4

addi.l #TETR0,D4

move.l D4,A0

move.b D0,(A0)+

move.b D1,(A0)

move.l #TETR0,D4

cmpi #$00,CHANAL

bne VoltConv

move.l D4,A0

move.b #$30,DIG4

ori.b #$30,(A0)

move.b (A0)+,DIG3

ori.b #$30,(A0)

move.b (A0)+,DIG2

ori.b #$30,(A0)

move.b (A0),DIG1

bra BeginHBDC


VoltConv:

addi.b #$2,D4

move.l D4,A0

ori.b #$30,(A0)

move.b (A0)+,DIG4

ori.b #$30,(A0)

move.b (A0)+,DIG3

ori.b #$30,(A0)

move.b (A0)+,DIG2

ori.b #$30,(A0)

move.b (A0),DIG1

bra BeginHBDC

Go:

bsr TestBF

move.b #$C0,IR

bsr TestBF

move.b DIG1,DR

bsr TestBF

move.b PD2,IR

bsr TestBF

move.b DIG2,DR

bsr TestBF

move.b PD3,IR

bsr TestBF

move.b DIG3,DR

bsr TestBF

move.b #$C4,IR

bsr TestBF

move.b DIG4,DR


3.2.6 Модуль управления оборотами двигателя.

cmp.b #$00,MOTOR

bne On

bsr TestBF

move.b #$DC,IR

bsr TestBF

move.b #$4F,DR ;O

bsr TestBF

move.b #$46,DR ;F

bsr TestBF

move.b #$46,DR ;F

bra BeginLCD


On:

bsr TestBF

move.b #$DC,IR

bsr TestBF

move.b #$4F,DR ;O

bsr TestBF

move.b #$4E,DR ;N

bsr TestBF

move.b #$20,DR ;

bra BeginLCD


;*****************************Motor**************************************

Task2:

move #$FFFF,LED

andi.w #$F0FF,SR ;Установка маски приоритетов

ori.w #$0500,SR ;прерывания в регистре SR

move #0005,D0

movec D0,SFC ;Инициализация регистра SFC

movec D0,DFC ;Инициализация регистра DFC

move.b #$0040,SYPCR ;Запрещение WatchDog

move #$0021,CSBAR10 ;Определение начального адреса

; и размера блока памяти для CS10

move #$5030,CSOR10 ;Настройка CS10


ori.w #$004E,TPUMCR ;Установка приоритета прерывания

;для TPU в регистре TPUMCR

move.w #$0640,TICR ;Установка номера прерывания и базового

;вектора прерываний для каналов TPU в

;регистре TICR в регистре CIER

move.w #$0000,CIER ;Установка запрета на прерывание

;от каналов TPU

move.w #$0099,CFSR3 ;Установка номера функции для

;каналов TPU 0 и 1

move.w #$0092,C0PAR0 ;Инициализация

move.w #$2000,C0PAR2 ;параметров

move.w #$2000,C0PAR3 ;канала 0

move.w #$0092,C1PAR0 ;Инициализация

move.w #$0000,C1PAR2 ;параметров

move.w #$0000,C1PAR3 ;канала 1

move.w #$000A,HSRR1 ;Установка запроса на обслуживание

move.b #$01,MOTOR

;каналов 0 и 1 центральным процессором

move.l #Int0,$100 ;Запись начальных адресов процедур

move.l #Int1,$104 ;обработки прерываний каналов 0 и 1

move.l #IRQ6,$000078

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

move.w #$00B,CPR1 ;Установка приоритетов обслуживания

;каналов в регистре CPR1


Wait: ;Цикл

move.w HSRR1,D0 ;ожидания

andi.l #$000F,D0 ;обслуживания

bne Wait ;каналов 0 и 1

bra BeginMOTOR ;центральным процессором

move.b #$C2,PD2

move.b #$C3,PD3


Int0: ;Подпрограмма

andi.w #$FFFE,CISR ;обработки прерывания

rte ;от канала 0

cmp.b #$03, D6_T

beq Ar2

move.b #$00, D6_T

bsr Left2

bra Return


Ar2:

cmp.b #$0C, D6_T

bne Return2

move.b #$00, D6_T

bsr Right2


Return2:

rts


Left2:

bsr TestBF

move.b #$1C, D6_T

rts


Right2:

bsr TestBF

move.b #$18, D6_T

rts


Int1: ;Подпрограмма

andi.w #$FFFD,CISR ;обработки прерывания

rte ;от канала 1

cmp.b #$00, D7_T

beq Ar3

move.b #$00, D7_T

bsr Left3

bra Return3


Ar3:

cmp.b #$0C, D7_T

bne Return

move.b #$00, D7_T

bsr Right3


Return3:

rts

Left3:

bsr TestBF

move.b #$F0, D7_T

rts

Right3:

bsr TestBF

move.b #$FF, D7_T

rts


IRQ6:

move.b #$55,LED

cmp.b #$00,MOTOR

bne MotOff

move.b #$01,MOTOR

move.b #$FF,LED

rte

MotOff:

move.b #$00,MOTOR


move.b #$FF,LED

rte

;***********************************************************************

BeginMOTOR:

cmp.b #$00,MOTOR

beq BeginMOTOR

move.w #$0000,C1PAR2

move.w #$0000,C1PAR3

move.w #$0000,C0PAR2

move.w #$2000,C0PAR3

move.w #$0080,D4


Accel1:

add.w #$10,C0PAR2

move.b D4,LED

ror.b #1,D4


bsr Delay_Accel

move.w C0PAR2,D1

cmp.w #$2000,D1

blt Accel1

move.w #$007F,D4


bsr Delay_Rot

move.l NUMB,D7

move.l #$2,D5

mulu.l D5,D7

add.l DISPF,D7

move.l D6,A5

addi.l #$8,D7

move.l D6,A4

addi.b #$0,STAT

move.l (A5),SP

move #$000F,PITR

move #$07FF,PICR

move.l (A6),A5


Forward:

sub.w #$10,C0PAR2

move.b D4,LED

ror.b #1,D4


bsr Delay_Accel

move.w C0PAR2,D1

cmp.w #$0000,D1

bgt Forward



move.b #$00,MOTOR

bsr Delay_Rot

move.b #$01,MOTOR



move.w #$0000,C0PAR2

move.w #$0000,C0PAR3

move.w #$0000,C1PAR2

move.w #$2000,C1PAR3

move.w #$0001,D4


Accel2:

add.w #$10,C1PAR2

move.b D4,LED

rol.b #1,D4


bsr Delay_Accel


move.w C1PAR2,D1

cmp.w #$2000,D1

blt Accel2

move.w #$FFFE,D4


bsr Delay_Rot

cmpi.l #$000A,D1

blt Accel2

move.l #$0,D4

move D2,D4


addi.l #MOTOR,D4

move.l D4,A0

move.b D0,(A0)

move.l D1,D0

move.l #$00,D1

addi #$1,D2

Revers:

sub.w #$10,C1PAR2

move.b D4,LED

rol.b #1,D4


bsr Delay_Accel

move.w C1PAR2,D1

cmp.w #$0000,D1

bgt Revers


move.b #$00,MOTOR

bsr Delay_Rot

move.b #$01,MOTOR

bra BeginMOTOR


Delay_Accel:

move.l #$01AF,D0

CL:

cmp.b #$00,MOTOR

bne NXT

move.w #$0000,C0PAR2

move.w #$0000,C1PAR2

move.l A7,D7

addi.l #$4,D7

move.l D7,A7

bra BeginMOTOR

NXT:

dbf D0,CL

rts


Delay_Rot:

move.l #$1FFFE,D0

CL1:

subq.l #$1,D0

bne CL1

rts


;***********************************************************************

SECTION init_code

DC.L $00002000 ; Init SP vector

DC.L $00000400 ; Init PC vector










УИТС.161ХХХ.054 ПЗ

Ëèñò






25

Èзм

Ëèñò

¹ äîêóì.

Ïîäïèñü

Äàòà