Смекни!
smekni.com

Контроллеры (стр. 7 из 12)

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 ");/* запуск таймера */