TXD=0;
TXD=1;
/*----------------- Обнуление данных --------------------------------------*/
Clear();
/*------------------------ Вывод на ЦАП -----------------------------------*/
Machtab(StecVprd);
VivodCapSl();
/*--------- Подготовка вывода 206 слова -----------------------------------*/
SlRab=0;
Adress=0x61;
Priznak_Usvic();/* признак от УСВИЦ-250 */
Priznak_Work(0,1);/* признак нет вычисленных данных */
CalcChetSl();/* Подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVmd_1=SlRab_1;
SlVmd_2=SlRab_2;
SlVmd_3=SlRab_3;
SlVmd_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск таймера */
/*--------- Подготовка вывода 207 слова -----------------------------------*/
SlRab=0;
Adress=0xe1;
Priznak_Usvic();/* признак от УСВИЦ-250 */
Priznak_Work(0,1);/* признак нет вычисленных данных */
CalcChetSl();/* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVpr_1=SlRab_1;
SlVpr_2=SlRab_2;
SlVpr_3=SlRab_3;
SlVpr_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск таймера */
/*--------- Заполнение начальными данными Vpr и Vmd -----------------------*/
a=3;
do {
/* vvodvmd(); */
ImVxodMd(); /* имитация входа Vmd */
Perevod_Md(); /* перевод из грея в двоичную */
StecVmdd=Vmdd; /* Сохранение Vmd.*/
/* vvodvpr();*/
ImVxodPr(); /* имитация входа Vpr */
Perevod_Pr(); /* перевод из грея в двоичную */
StecVprd=Vprd; /*Сохранение Vpr */
a--; }
while (a>0);
Nach: {
/*-------- Сброс сторожевого таймера --------------------------------------*/
TXD=0;
TXD=1;
/*-------------------- Обновление данных Vpr и Vmd -----------------------*/
/* vvodvmd();*/
ImVxodMd(); /* имитация входа Vmd */
Perevod_Md(); /* перевод из грея в двоичную */
StecVmdd=Vmdd; /*Сохранение Vм.д.*/
/* vvodvpr();*/
ImVxodPr(); /* имитация входа Vpr */
Perevod_Pr(); /* перевод из грея в двоичную */
StecVprd=Vprd; /*Сохранение Vпр.д.*/
/*----------------- Цикл проверки на отказ Vmd ----------------------------*/
Cikl_Otkaz_Vmd();
/*----------------- Цикл проверки на отказ Vpr ----------------------------*/
Cikl_Otkaz_Vpr();
/*----------------- Тест на наличие РК "ТК" -------------------------------*/
{
if(INT0==1) Test_Kontrol();
}
while(INT0==1)
/*----------------- Тест на наличие Vmd >= Vpr ----------------------------*/
if(Vprd>=Vmdd) { RXD=0; PK_Vpr=1; }
else { RXD=1; PK_Vpr=0; }
/*----------------- Маштабирование Vprd -----------------------------------*/
Machtab(StecVprd);
VivodCapSl();
/*------------- копируем в поле 271 функциональный тест ------------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlDs_1=SlRab_1;
SlDs_2=SlRab_2;
SlDs_3=SlRab_3;
SlDs_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск таймера */
/*------------- копируем в поле 206 функциональный тест ------------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVpr_1=SlRab_1;
SlVpr_2=SlRab_2;
SlVpr_3=SlRab_3;
SlVpr_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск таймера */
/*------------- копируем в поле 207 функциональный тест ------------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVmd_1=SlRab_1;
SlVmd_2=SlRab_2;
SlVmd_3=SlRab_3;
SlVmd_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск таймера */
/*----------------- Тест Контроль программы -------------------------------*/
TestControlPO();
/*-------- Формирование дискретного 271 слова ----------------------------*/
SlRab=0;
Adress=0x9d;/* адрес слова 271 */
Priznak_Test();/* растановка признаков тестирования в слове */
Priznak_Usvic();/* признак от УСВИЦ-250 */
CalcChetSl();/* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlDs_1=SlRab_1;
SlDs_2=SlRab_2;
SlDs_3=SlRab_3;
SlDs_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск таймера */
/*------ Формирование 206 слова в соответствии с РТМ, изм,3 для Vpr ------*/
SlRab=0;
FormPTM(StecVprd);
Adress=0x61;/* адрес слова 206 */
Priznak_Usvic();/* признак от УСВИЦ-250 */
Priznak_Work(1,1);/* признак нормальной работы */
If_Speed(Vprd);/* проверка на < 50км */
if ((Vpr_Ok==1)||(PO_Ok==1)) Priznak_Work(0,0);/* отказ */
CalcChetSl();/* подсчет четности */
/*------------- Копирование параметров в область вывода -------------------*/
asm(" clr TCON.4 ");/* остановка таймера */
SlVpr_1=SlRab_1;
SlVpr_2=SlRab_2;
SlVpr_3=SlRab_3;
SlVpr_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск таймера */
/*----- Формирование 207 слова в соответствии с РТМ, изм,3 для Vmd -------*/
SlRab=0;
FormPTM(StecVmdd);
Adress=0xe1;/* адрес слова 207 */
Priznak_Usvic();/* признак от УСВИЦ-250 */
Priznak_Work(1,1);/* признак нормальной работы */
If_Speed(Vmdd); /* проверка на < 50км */
if ((Vmd_Ok==1)||(PO_Ok==1)) Priznak_Work(0,0);/* отказ */
CalcChetSl();/* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVmd_1=SlRab_1;
SlVmd_2=SlRab_2;
SlVmd_3=SlRab_3;
SlVmd_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск таймера */
SlRab=0;
/*-------------------- G O T O -> N A C H ---------------------------*/
}
goto Nach;
}
Процедура установки приоритетов прерываний.
void Zapusk(void){
/*------------- Запуск таймера --------------------------*/
asm(" mov TCON,#1 ");
asm(" anl IP,#0 ");
asm(" orl IP,#2 ");
asm(" mov TMOD,#01 ");
asm(" mov a,#0eah "); /* число для загрузки таймера */
asm(" mov TH0,a "); /* 65536-20*36-685+67, где старшая часть */
asm(" mov a,#0d3h "); /* равна eah, а младшая - d3h */
asm(" mov TL0,a ");
asm(" setb TCON.4 ");
asm(" anl IE,#0 ");
asm(" orl IE,#82h ");
}
Назначение: запуск таймера с установки приоритетов прерываний.
Вход: нет.
Выход: установленный счетчик таймера.
Процедура обнуления переменных.
void Clear(void){
StecVmdd=StecVprd=0;
Vprd=Vmdd=Vprg=Vmdg=0;
SlRab=SlVmd=SlVpr=SlDs=CapSlowo=0;
SlRab=0;
}
Назначение: обнуление областей переменных в начале работы программы от мусора при включения питания.
Вход: нет.
Выход: нет.
Процедура считывания с кодов грея с максимальной допустимой маски.
_vvodvmd:
push 0e0h
push 1
push 2
push 3
clr tcon.4
orl p0,#1 ;запрещение работы D1
anl p0,#1 ;запрещение работы D1
orl p1,#14h ;запрещение D2 и разрешение D4
anl p1,#14h ;запрещение D2 и разрешение D4
;считываем для Vmd
call Read_P_1_5
mov bitvmd0,c
inc p1
inc p1
call Read_P_1_5
mov bitvmd1,c
inc p1
inc p1
call Read_P_1_5
mov bitvmd2,c
inc p1
inc p1
call Read_P_1_5
mov bitvmd3,c
и т.д.
Назначение: считывание кодов с максимальной маски
Вход: нет.
Выход: заполнены биты максимальной маски.
Процедура считывания с кодов грея с приборной маски.
_vvodvpr:
push 0e0h
push 1
push 2
push 3
clr tcon.4
orl p0,#1 ;запрещение работы D1
anl p0,#1 ;запрещение работы D1
orl p1,#1 ;запрещение D4 и разрешение D2
anl p1,#1 ;запрещение D4 и разрешение D2
;считываем для Vpr
call Read_P_1_5
mov bitvpr0,c
inc p1
inc p1
call Read_P_1_5
mov bitvpr1,c
inc p1
inc p1
call Read_P_1_5
mov bitvpr2,c
inc p1
inc p1
call Read_P_1_5
mov bitvpr3,c
inc p1
inc p1
call Read_P_1_5
mov bitvpr4,c
и т.д.
Назначение: считывание кодов с приборной маски
Вход: нет.
Выход: заполнены биты приборной маски.
Процедура вывода в магистраль 32х-разрядного слова с частотой 12.5 КГц.
Vivod206:
PUSH 0D0H
PUSH 0E0H
PUSH 0
PUSH 1
PUSH 2
PUSH 3
CLR PSW.3
CLR PSW.4
ORL P0,#0C0H
MOV R3,#4
MOV R0,#Sl206
Bait206:
MOV A,@R0
MOV R2,#7
Bit206:
RRC A
ORL P0,#0ffh
MOV Bit6V,C
MOV Bit7V,C
CPL Bit7V
MOV R1,#15
Pauza206_0: DJNZ R1,Pauza206_0
NOP
NOP
MOV P0,BaitV
MOV R1,#18
Pauza206_1: DJNZ R1,Pauza206_1
DJNZ R2,Bit206
RRC A
ORL P0,#0ffh
MOV Bit6V,C
MOV Bit7V,C
CPL Bit7V
MOV R1,#16
Pauza206_2: DJNZ R1,Pauza206_2
MOV P0,BaitV
MOV R1,#15
Pauza206_3: DJNZ R1,Pauza206_3
INC R0
DJNZ R3,Bait206
NOP
NOP
NOP
ORL P0,#0C0H
POP 3
POP 2
POP 1
POP 0
POP 0E0H
POP 0D0H
RET
Назначение: выдача побитно в магистраль 32х-разрядного слова с частотой 12.5 КГц.
Вход: номер выводимого слова (номера 0 соответствует выводимому слову 206, и соответственно 2=207,3=271).
Выход: нет.
Процедура аналогового вывода приборной скорости на ЦАП.
_VivodCapSl:
push 0e0h
push 1
push 2
push 3
clr tcon.4
mov a,CapSlowo0
mov p0,a
mov a,CapSlowo1
mov p2,a
setbp0.3
nop ;задержка чтобы ЦАП успел принять данные
nop
nop
nop
nop
clr p0.3
setb tcon.4
pop 3
pop 2
pop 1
pop 0e0h
ret
Назначение: аналоговый вывод на ЦАП приборной скорости .
Вход: приборная скорость.
Выход: на шине данных ЦАП высота с приведенным коэффициентом.
Процедура установки признака от УСВИЦ-250.
void Priznak_Usvic(viod){
SlRab_bit8=0;/* Признак */
SlRab_bit9=1;/* от УСВИЦ-250 */
}
Назначение: в биты 8, 9 выходного слова ставится 0 и 1 соответственно для обозначения, что слово исходит от УСВИЦ-250.
Вход: нет.
Выход: SlRab_bit8=0; SlRab_bit9=1;
Процедура установки признаков работоспособности УСВИЦ-250.
void Priznak_Work(bit unsigned char a, bit unsigned char b){
SlRab_bit30=a;
SlRab_bit29=b;
}
Назначение: в 30 и 29 биты ставятся признаки работоспособность УСВИЦ-250.
Вход: bit unsigned char a, bit unsigned char b.
Выход: SlRab_bit30=a; SlRab_bit29=b;
void Test_Kontrol(void){
int V=0;
vvodvmd();
Perevod_Md(); /* перевод из грея в двоичную */
vvodvpr();
Perevod_Pr(); /* перевод из грея в двоичную */
/*----------------- Сохраняем тестовое значение ---------------------------*/
V=Vprd;
/*----------------- Прабавляем тестовое значение --------------------------*/
Vprd+=166*4;
/*----------------- Тест на наличие Vmd >= Vpr ----------------------------*/
if(Vprd>=Vmdd) { RXD=0; PK_Vpr=1; }
else { RXD=1; PK_Vpr=0; }
/*----------------- Отнимаем тестовое значение ----------------------------*/
Vprd-=166*4;
/*----------------- Востанавливаем тестовое значение ----------------------*/
Vprd=V;
/*----------------- Маштабирование Vprd -----------------------------------*/
Machtab(StecVprd);
VivodCapSl();
/*------------- копируем в поле 271 функциональный тест ------------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlDs_1=SlRab_1;
SlDs_2=SlRab_2;
SlDs_3=SlRab_3;
SlDs_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск таймера */
/*------------- копируем в поле 206 функциональный тест ------------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVpr_1=SlRab_1;
SlVpr_2=SlRab_2;
SlVpr_3=SlRab_3;
SlVpr_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск таймера */
/*------------- копируем в поле 207 функциональный тест ------------------*/
SlRab=0;
Priznak_Work(1,0);/* признак функциональный тест */
CalcChetSl(); /* подсчет четности */
asm(" clr TCON.4 ");/* остановка таймера */
SlVmd_1=SlRab_1;
SlVmd_2=SlRab_2;
SlVmd_3=SlRab_3;
SlVmd_4=SlRab_4;
asm(" setb TCON.4 ");/* запуск таймера */