int V=0;
/* vvodvmd(); */
ImVxodMd(); /* имитация входа Vmd */
Perevod_Md(); /* перевод из грея в двоичную */
/* vvodvpr();*/
ImVxodPr(); /* имитация входа Vmd */
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 ");/* запуск таймера */
/*----------------- Тест Контроль программы ------------------------------*/
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;
/*-------- Сброс сторожевого таймера -------------------------------------*/
TXD=0;
TXD=1;
}
/*------------------------------------------------------------------------*/
/* Процедура очистки переменных */
/*------------------------------------------------------------------------*/
void Clear(void){
StecVmdd=StecVprd=0;
Vprd=Vmdd=Vprg=Vmdg=0;
SlRab=SlVmd=SlVpr=SlDs=CapSlowo=0;
SlRab=0;
}
/*************************************************************************/
/* Н А Ч А Л О П Р О Г Р А М М Ы /
/*************************************************************************/
void main(void)
{
/*---------- Запуск таймера на вывод -------------------------------------*/
set_vector(TIMER0,Timer);
Zapusk();
/*-------- Сброс сторожевого таймера -------------------------------------*/
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;
}
Приложение 2. Программы вывода слов в магистраль.
defseg c_text,class=code
seg c_text
int38T equ 65535-80*36-80*32-67+33+54
BaitV equ 2ah ; адрес выводного байта 28
Bit6V equ 51h ; Bit6V прямой вывод бита 80
Bit7V equ 52h ; Bit7V инверсной вывод бита 81
Sl206 equ 10h ; адрес слова 206
Sl207 equ 3ch ; адрес слова 207
Sl271 equ 38h ; адрес слова 271
NomParam equ 1bh ; Номер выводимого параметра 0=Sl206
global _Timer,_Vivod206,_Vivod207;,_Vivod271
_Timer:
PUSH PSW ; время от начала прерывания ___11
CLR TCON.4 ; Останов таймеpа 1
CLR TCON.5 ; Сбpос флага пеpеполнения 1
PUSH 0E0h ; 2
MOV A,#low(int38T) ; Выбоp младшего байта INT_38T 1
MOV TL0,A ; запись в TL0 1
MOV A,#high(int38T) ; Выбоp стаpшего байта INT_38T 1
MOV TH0,A ; запись в TH0 1
SETB TCON.4 ; Запуск таймеpа Т0 1 ___20
MOV BaitV,#0ffh ; 2
MOV A,NomParam ; 1
;--------------------------------------------------------------------- 23
CJNE A,#0,GoPp ; 2
NOP ; 1
NOP ; 1
CALL _Vivod206 ; 2___33
INC NomParam ; 1
JMP GoEnd ; 2
GoPp: CJNE A,#1,GoSl ; 2
CALL _Vivod207 ; 2
INC NomParam ; 1
JMP GoEnd ; 2
GoSl: CALL _Vivod271 ; 2
MOV NomParam,#0 ; 2
NOP ; 1
GoEnd: MOV BaitV,#0h ; 2
POP 0E0h ; 2
POP PSW ; 2
RETI ; 2
;************************************************************************
_Vivod206:
PUSH 0D0H ; 2 mkc
PUSH 0E0H ; 2 mkc
PUSH 0 ; 2 mkc
PUSH 1 ; 2 mkc
PUSH 2 ; 2 mkc
PUSH 3 ; 2 mkc
CLR PSW.3 ; 1 mkc
CLR PSW.4 ; 1 mkc
ORL P0,#0C0H ; 2 mkc
MOV R3,#4 ; 1 mkс Количество пеpесылаемых байт #4
MOV R0,#Sl206 ; 1 mkс
;-------------------------------------------------------------------- 18
Bait206:
MOV A,@R0 ; 1 mkc
MOV R2,#7 ; 1 mkс
Bit206:
RRC A ; 1 mkс
ORL P0,#0ffh ; 2 mkc
;-------------------------------------------------------------------- 0
MOV Bit6V,C ; 2 mkc
MOV Bit7V,C ; 2 mkс
CPL Bit7V ; 1 mkс
MOV R1,#15 ; 1 mkс
Pauza206_0: DJNZ R1,Pauza206_0 ; 2*15=30 mkc 36
NOP ; 1 mkc
NOP ; 1 mkc
MOV P0,BaitV ; 2 mkс 40 63
;-------------------------------------------------------------------- 40
;-------------------------------------------------------------------- 0
MOV R1,#18 ; 1 mkс
Pauza206_1: DJNZ R1,Pauza206_1 ; 2*17=34 mkc
DJNZ R2,Bit206 ; 2 mkс 37
RRC A ; 1 mkс
ORL P0,#0ffh ; 2 mkc
;-------------------------------------------------------------------- 40
;-------------------------------------------------------------------- 0
MOV Bit6V,C ; 2 mkс
MOV Bit7V,C ; 2 mkс
CPL Bit7V ; 1 mkс
MOV R1,#16 ; 1 mkс 6
Pauza206_2: DJNZ R1,Pauza206_2 ; 2*16=32 mkc 38
MOV P0,BaitV ; 2 mkс
;-------------------------------------------------------------------- 40
;-------------------------------------------------------------------- 0
MOV R1,#15 ; 1 mkс 00
Pauza206_3: DJNZ R1,Pauza206_3 ; 2*15=30 mkc 31
INC R0 ; 2 mkc 33
DJNZ R3,Bait206 ; 2 mkс 35
;-------------------------------------------------------------------- 35
NOP ; 1 mkс
NOP ; 1 mkс
NOP ; 1 mkс