ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 05.06.2020
Просмотров: 90
Скачиваний: 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 ПЗ |
Ëèñò |
|
|
|
|
|
|
|
Èзм |
Ëèñò |
¹ äîêóì. |
Ïîäïèñü |
Äàòà |