46071 (665366), страница 7
Текст из файла (страница 7)
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;
}
Назначение: Пилотом на земле включает тумблер тест контроля состояния прибора. Максимальная скорость индексом устанавливается на максимальную скорость (250) и к приборной скорости прибавляем тестовое значение скорости. При не совпадении скоростей выводим на индикацию световую и звуковую, сигнализируя о неисправности прибора. После чего проходит весь цикл программы функционирования прибора.
Вход: тестовое значение.
Выход: индикация.
Процедура подсчета и записи бита четности 32х-разрядного рабочего слова.
void CalcChetSl(void){
SlRab_bit31=1;
SlRab_bit31=SlRab_bit31SlRab_bit0SlRab_bit1SlRab_bit2;
SlRab_bit31=SlRab_bit31SlRab_bit3SlRab_bit4SlRab_bit5;
SlRab_bit31=SlRab_bit31SlRab_bit6SlRab_bit7SlRab_bit8;
SlRab_bit31=SlRab_bit31SlRab_bit9SlRab_bit10SlRab_bit11;
SlRab_bit31=SlRab_bit31SlRab_bit12SlRab_bit13SlRab_bit14;
SlRab_bit31=SlRab_bit31SlRab_bit15SlRab_bit16SlRab_bit17;
SlRab_bit31=SlRab_bit31SlRab_bit18SlRab_bit19SlRab_bit20;
SlRab_bit31=SlRab_bit31SlRab_bit21SlRab_bit22SlRab_bit23;
SlRab_bit31=SlRab_bit31SlRab_bit24SlRab_bit25SlRab_bit26;
SlRab_bit31=SlRab_bit31SlRab_bit27SlRab_bit28SlRab_bit29;
SlRab_bit31=SlRab_bit31SlRab_bit30;
}
Назначение: подсчет четности слова и выставления знака четности в 31 разряде подсчет четности производиться по модулю 2.
Вход: нет.
Выход: SlRab_bit31- знак четности.
Процедура перевода из кодов грея в двоичный код максимально допустимую скорость.
void Perevod_Md(void){
Vmdd=0;
Vmdd_bit9=Vmdg_bit9;
Vmdd_bit8=Vmdg_bit8Vmdd_bit9;
Vmdd_bit7=Vmdg_bit7Vmdd_bit8;
Vmdd_bit6=Vmdg_bit6Vmdd_bit7;
Vmdd_bit5=Vmdg_bit5Vmdd_bit6;
Vmdd_bit4=Vmdg_bit4Vmdd_bit5;
Vmdd_bit3=Vmdg_bit3Vmdd_bit4;
Vmdd_bit2=Vmdg_bit2Vmdd_bit3;
Vmdd_bit1=Vmdg_bit1Vmdd_bit2;
Vmdd_bit0=Vmdg_bit0Vmdd_bit1;
}
Назначение: перевод кодов грея в двоичный код.
Вход: Коды грея.
Выход: двоичный код.
Процедура перевода из кодов грея в двоичный код приборную скорость.
void Perevod_Pr(void){
Vprd=0;
Vprd_bit9=Vprg_bit9;
Vprd_bit8=Vprg_bit8Vprd_bit9;
Vprd_bit7=Vprg_bit7Vprd_bit8;
Vprd_bit6=Vprg_bit6Vprd_bit7;
Vprd_bit5=Vprg_bit5Vprd_bit6;
Vprd_bit4=Vprg_bit4Vprd_bit5;
Vprd_bit3=Vprg_bit3Vprd_bit4;
Vprd_bit2=Vprg_bit2Vprd_bit3;
Vprd_bit1=Vprg_bit1Vprd_bit2;
Vprd_bit0=Vprg_bit0Vprd_bit1;
}
Назначение: перевод кодов грея в двоичный код.
Вход: Коды грея.
Выход: двоичный код.
Процедура проверки на отказ маски максимальной скорости.
void Cikl_Otkaz_Vmd(void){
int c=3,St;
Vmd_Ok=0;
T1=0;
do
{
vvodvmd();
Perevod_Md();/* перевод из грея в двоичную */
St=StecVmdd;
if ((St+test_speed>Vmdd)&&(St-test_speed { StecVmdd=Vmdd; break; } if (c==0) { Vmd_Ok=1; T1=1; break; } c--; } while(c>(-1)); } Назначение: проверка маски максимальной скорости путем проверки предыдущих значений с полученными значениями и допуск не должен превышать тестовой единицы. Если превышение возникло, то проверка проходит еще 3 раза, но если после этого превышение не исчезло. Выдается световая сигнализация на борт панель пилоту и записывается в ячейку служебного слова (271). Вход: нет. Выход: нет. Процедура проверки на отказ маски приборной скорости. void Cikl_Otkaz_Vpr(void){ int b=3,St; Vpr_Ok=0; RXD=0; do { vvodvpr(); Perevod_Pr();/* перевод из грея в двоичную */ St=StecVprd; if ((St+test_speed>Vprd)&&(St-test_speed { StecVprd=Vprd; break; } if (b==0) { Vpr_Ok=1; RXD=1; break; } b--; } while(b>(-1)); } Назначение: проверка маски приборной скорости путем проверки предыдущих значений с полученными значениями и допуск не должен превышать тестовой единицы. Если превышение возникло, то проверка проходит еще 3 раза, но если после этого превышение не исчезло. Выдается световая сигнализация на борт панель пилоту и записывается в ячейку служебного слова (271). Вход: нет. Выход: нет. Процедура масштабирование для вывода на ЦАП. void Machtab(unsigned int V1){ double rab1; rab1=(double)V1; rab1*=0.63; CapSlowo=0; CapSlowo=(unsigned int)rab1; CapSlowo0<<=6; } Назначение: масштабирование необходимо потому, что по ТУ выдача аналогового сигнала должна соответветствовать всем единицам на входе ЦАП, на аналоговом выходе 0.63 В. Вход: приборная скорость. Выход: нет. Процедура формирование 32х-разрядного слова с соответствием с РТМ void FormPTM(unsigned int V1){ double rab2; SlRab=0; rab2=(double)V1; rab2/=0.11575; SlRab=(unsigned long)rab2; rab2-=(double)SlRab; SlRab<<=12; } Назначение: для формирование 32х-разрядного слова с соответствием с РТМ необходима данные поместить с 11 по 27 разряд с ценой младшего разряда. Вход: приборная скорость. Выход: данные помещены в слове на свое место. Процедура тест контроля программного обеспечения void TestControlPO(void){ int Vprd1=0,Vmdd1=0,Vprg1=0,Vmdg1=0; PO_Ok=Vmd_Ok=Vpr_Ok=0; Vprg1=Vprg; Vmdg1=Vmdg; Vprd1=Vprd; Vmdd1=Vmdd; Vmdg=Vprg=speed; Perevod_Md(); Perevod_Pr(); if (Vmdd!=200) { PO_Ok=1; Vmd_Ok=1; } if (Vprd!=200) { PO_Ok=1; Vpr_Ok=1; } /*----------------------------- 206 --------------------------------------*/ SlRab=0; FormPTM(Vprd); Adress=0x61; Priznak_Usvic(); Priznak_Work(1,0); CalcChetSl(); if(SlRab!=0) { PO_Ok=1; Vpr_Ok=1; } /*----------------------------- 207 --------------------------------------*/ SlRab=0; FormPTM(Vmdd); Adress=0xe1; Priznak_Usvic(); Priznak_Work(1,0); CalcChetSl(); if(SlRab!=0) { PO_Ok=1; Vmd_Ok=1; } SlRab=0; Vprg=Vprg1; Vmdg=Vmdg1; Vprd=Vprd1; Vmdd=Vmdd1; } Назначение: проверка программы. Это осуществляется путем записи тестовых значений в максимальную и приборную скорость кодов грея. После чего производится проверка на правильности перевода из кодов грея в двоичный код, формирования слова и расстановки признаков. Вход: тестовое значение кодов грея. Выход: нет. Процедура проверки скорости, на меньше 50км. void If_Speed(unsigned int V){ if(V<200) Priznak_Work(0,1); } Назначение: при полеченной скорости меньше чем 50 км необходимо по ТУ выдавать в выходном слове признак нет вычисленных данных. Вход: приборная скорость. Выход: расстановка признаков нет вычисленных данных. Описание аппаратных функций Основные функции системы Программа начинает выполнение при подачи питания на контроллер, независимо от других контроллеров. Программа сначало сбрасывает сторожевой таймер предназначенный от зацикливаниии программы, который необходимо сбрасывать в конце программы. После чего очищает все переменные и подготавливает слова с указанием в них о том, что нет вычисленных данных, т.к. процедура вывода слов работает независимо от основной программы по прерыванию от таймера. Далее программы заполняет ячейки скорости. для последующего использавании и проверки на выход из строя сведодиодов или фотодиодов. После чего выполняет ввод с масок данных, перевод их, проверку на отказ маскок предельной и максимальной скорости, проверка на наличии тест контроля, маштабирования л\для вывода на ЦАП, выполняем тест контроль программного обеспечения с занесением результатов в служебное слово и копирование полученных данных в слова. Технология инсталляции программы Данный программный продукт поставляется на предприятие-заказчик для конечного использования в борт компьютерах вертолетах или самолетах с максимальной скоростью не более 250км. При использовании данной версии программы, программа записывается во внутреннью память процессора, т.к. процессор имеет встроенную постоянную память. Инструкция пользователю Данная программа разрабатывалсь на ПЭВМ класса PENTIUM c процессором фирмы INTEL с тактовой частотой 100 МГц и с использование внутрисхемного эмулятора фирмы Phyton PICE-51. На этой же машине, но с эксперементальным образцом контроллера проводились испытания. Операционная система Windows'98. Оценка качества проекта Качество настоящего проекта будем оценивать по следующим критериям:- полезность (исходная и общая);- удобство эксплуатации;- эффективность;- модифицируемость;- машинонезависимость; -завершенность; - согласованность; - рациональность; - доступность; - коммуникативность; - информативность; - расширяемость. Попробуем проанализировать каждый из вышеперечисленных критериев, и дать по нему оценку контроллера. Полезность: Продукт проектирования обладает свойством ПОЛЕЗНОСТИ, если он отвечает поставленным целям. Это свойство имеет две стороны: 1) исходная полезность - насколько просто, надежно, эффективно можно использовать основной результат обработки; 2) общая полезность - возможность продолжать использование продукта проектирования при изменении условий его применения. Исходя из данного определения полезности можно сказать, что предлагаемый проект обладает исходной, но не общей полезностью, так как требования простоты, надежности и эффективности закладывались в его основу как одни из главных, но в случае изменения условий его применения эффективность его использования снизится. Удобство эксплуатации Продукт проектирования УДОБЕН в ЭКСПЛУАТАЦИИ, если рассматривается возможность его обновления в соответствии с новыми требованиями. На основе вышесказанного можно определить контроллер удобен в эксплуатации, покрайней мере, в течение 1 года после внедрения. Эффективность Проект проектирования обладает свойством эффективности, если он выполняет требуемые функции без лишних затрат ресурсов. Так как результат проектирования установлен и удовлетворительно функционирует на процессоре INTEL 8051 широко используемый в самолетостроении в наше время, то можно определить проект эффективным. Модифицируемость Продукт проектирования необладает свойством МОДИФИЦИРУЕМОСТИ, т.к. он имеет закрытую структуру, не позволяющую легко вносить требуемые изменения. Так как под модифицируемостью, видимо подразумевается степень открытости архитектуры, то проект не обладает этим свойством. Машинонезависимость Продукт проектирования обладает свойством МАШИНОНЕЗАВИСИМОСТИ, если входящие в него функциональные компоненты могут быть реализованы на иных технических средствах. Машинонезависимость проекта целиком и полностью зависит от машинонезависимости контроллера, версии которой работают на довольно многих типах процессоров. Таким образом, свойство машинонезависимости НЕПРИСУЩЕ. Завершенность Продукт проектирования обладает свойством ЗАВЕРШЕННОСТИ, если в нем присутствуют все необходимые компоненты, каждый из которых разработан всесторонне. Согласованность Продукт проектирования обладает свойством ВНУТРЕННЕЙ СОГЛАСОВАННОСТИ, если он всюду содержит единую нотацию, терминологию и символику. Он также обладает свойством ВНЕШНЕЙ СОГЛАСОВАННОСТИ, если можно проследить его соответствие конкретным требованиям. Рациональность Продукт проектирования обладает свойством РАЦИОНАЛЬНОСТИ, если он использует все возможности (языка программирования, численных методов, технических и других средств) для минимизации расхода ресурсов. На основе анализа исходных текстов можно сделать вывод о том что он не обладает указанным свойством. Доступность Продукт проектирования обладает свойством ДОСТУПНОСТИ, если он не допускает селективное использование его компонентов. На основании информации из раздела 2 можно сказать, что проект НЕ ДОСТУПЕН. Коммуникативность Продукт проектирования обладает свойством КОММУНИКАТИВНОСТИ, если он дает возможность легко описывать входные данные и выдает информацию, форма и содержание которой просты для понимания и несут полезные сведения. Расширяемость Продукт проектирования не обладает свойством РАСШИРЯЕМОСТИ, если он позволяет при необходимости увеличить объем обрабатываемых данных или расширить функции отдельных модулей. Выводы В данном разделе выпускной работы были проведены следующие работы: описание фнкций основных модулей программы; описана технология инсталяции программы; дана инструкция пользователю; проведена оценка качества проекта; Организационно-техническая часть Расчет затрат на разработку программы Затраты на разработку программного продукта рассчитываются по формуле: Zрпп = Zзп + Zзпд + Остр + Оам + Zээ + Rкосв , (1) где Zзп - затраты на заработную плату программисту, руб.; Zзпд - затраты на дополнительную заработную плату, руб.; Остр - отчисление на социальное страхование, руб.; Оам - амортизационные отчисления, руб.; Zээ - затраты на электроэнергию во время разработки программы, руб.; Rкосв - косвенные расходы, руб. Разработка программы производилась инженером-программистом, с заработанной платой 600 рублей в месяц. На разработку программы ушло 5 месяца, поэтому затраты на зарплату составляют: Zзп = 600 * 5 = 3000 (руб.) Дополнительная заработная плата составляет 30% от основной заработной платы, тогда затраты на дополнительную заработную плату: Zзпд = Zзп * 0.3 = 3000 * 0.3 = 900 (руб.) Отчисления на социальное страхование составляют 37% от общей заработной платы, то есть Остр = ( Zзп + Zзпд ) * 0.37 = ( 3000 + 900 ) * 0.37 = 1443 (руб.) Стоимость ПЭВМ, используемой для разработки программы составляет 15 500 руб. Срок службы персонального компьютера составляет 8 лет. Тогда на данный момент амортизационные отчисления за месяц составляют: Оам1 = 15500 / ( 8 * 12 ) = 161.45 (руб.) За 5 месяца: Оам = 161.45 * 5 = 807.25 (руб.) На отладку и тестирование программы с использованием ПЭВМ затрачено 120 рабочих дней, из них, в среднем каждый день по 5 часа. Стоимость электроэнергии 0.14 руб. за киловатт. Мощность, потребляемая ПЭВМ 300 Вт. Посчитаем затраты на электроэнергию во время разработки программы, руб.; Zээ = ( 120 * 5 ) * 0.14 * 0.300 = 25.2 (руб.) Косвенные расходы составляют 110% от основной заработанной платы программиста: Rкосв = 3000 * 1.1 = 3300 (руб.) Таким образом, подставляя вычисленные значения затрат в формулу (1), получим стоимость затрат на разработку программы: Zрпп = 3000 + 900 + 1443 + 807.25 + 25.2 +3300= 9475,45 (руб.) Расчет экономической эффективности от внедрения программного продукта Рассчитаем экономическую эффективность от внедрения разработанного программного продукта на примере сравнения годовых затрат на содержание отдела рефератированния (5 человек) и содержание ПЭВМ, обслуживающего персонала (1 человек) и консультанта по работе с технической информацией, заменяющих вышеназванный отдел. Экономическую эффективность рассчитаем по формуле: Eэ = Zдв - Zпв, (2) где Zдв - затраты до внедрения; Zпв - затраты после внедрения. Затраты до внедрения Затраты до внедрения программного продукта рассчитаем по формуле:Zдв = Zзп + Zзпд + Oстр, (3)гдеZзп - затраты на заработную плату работнику, руб.;Zзпд - затраты на дополнительную заработную плату, руб.; Остр - отчисление на социальное страхование, руб.; Средняя заработанная плата работников отдела технической информации составляет 800 руб., тогда: Zзп = 800 * 5*12 = 48 000 (руб.) Дополнительная заработная плата составляет 30% от основной заработной платы, тогда затраты на дополнительную заработную плату: Zзпд = Zзп * 0.3 = 48 000 * 0.3 = 14400 (руб.) Отчисления на социальное страхование составляют 37% от общей заработной платы, тогда: Oстр =(Zзп + Zзпд)* 0.37 , то есть Остр = (48000 + 14400) * 0.37 = 23088 (руб.), Таким образом, подставляя вычисленные значения затрат в формулу (3), получим стоимость затрат до внедрения программы: Zдв = 48 000 + 14400 + 23088 = 85488 (руб.). Затраты после внедрения Затраты после внедрения программного продукта рассчитаем по формуле: Zпв = Zзп + Zзпд + Oстр + Zээ + Oам + Sпо + Zвпп, (4) где Zзп - затраты на заработную плату программисту, руб.; Zзпд - затраты на дополнительную заработную плату, руб.; Остр - отчисление на социальное страхование, руб.; Zээ - затраты на электроэнергию для ПЭВМ, руб.;Оам - амортизационные отчисления, руб.; Zвпп - затраты на внедрение программного продукта, руб. Заработанная плата программисту равна 600 тыс. руб., тогда: Zзп = 600 * 12 + 400 * 12 = 12 000 (руб.). Дополнительная заработная плата составляет 30% от основной заработной платы, тогда затраты на дополнительную заработную плату: Zзпд = Zзп * 0.3 = 12 000 * 0.3 = 3600 (руб.). Отчисления на социальное страхование составляют 37% от общей заработной платы, тогда: Oстр = ( Zзп + Zзпд ) * 0.37 , то есть Oстр = (12000+3600)*0.37= 5772 (руб.). ПЭВМ на рабочем месте работает 8 часов в день. Количество рабочих дней в году 264. Стоимость электроэнергии 0.14 руб. за киловатт. Мощность, потребляемая ПЭВМ 300 Вт. Посчитаем годовые затраты на электроэнергию, потребляемую ПЭВМ, руб.; Zээ = (8 * 264) * 0.14 * 0.300 = 88 (руб.). Стоимость ПЭВМ, используемой при эксплуатации разработанной программы составляет 15 500 руб. Срок службы персонального компьютера составляет 8 лет. Тогда амортизационные отчисления за год составляют: Oам = 15 500 / 8 = 1937.5 (руб.). Стоимость программного обеспечения равняется себестоимости программного продукта, посчитанной в предыдущем пункте данной главы. Следовательно: Sпо = 9475.45(руб.). В затраты на внедрение программного продукта входят затраты на изготовление сопроводительной документации, на заработную плату службы сопровождения программного продукта, затраты на обучение пользователя работе с программой, на установку программного продукта, на адаптацию программного продукта к условиям пользователя и т.д. Так как размер данных затрат зависит от конкретных условий, то стоимость затрат на этапе внедрения можно оценить только качественно, и можно сказать что она будет соизмерима со стоимостью затрат на этапе разработки. Затраты на внедрение программного продукта составляют 110% от затрат на этапе разработки программного обеспечения: Zвпп = 9475.45 * 1.1 = 10423 (руб.) Таким образом, подставляя вычисленные значения затрат в формулу (4), получим стоимость затрат после внедрения программы: Zпв = 12000 + 3600 + 5772 + 88 + 1937.5 + 9475.45 + 10423 = 43295,95 (руб.) Подставляя рассчитанные затраты до и после внедрения программы в формулу (2), получим значение экономической эффективности от внедрения разработанного программного продукта: Eэ = Zдв - Zпв = 85488 - 43295,95 = 42192.05 (руб.) Выводы Полученные результаты говорят об эффективности внедрения разработанного программного продукта в процессы, требующие обработки большого объема принятия и выдача с всевозможных датчиков. Что существенно уменьшает затраты на разработку схем на вентильной логики. Приложение 1. Основная программа. #include #include #include /* 206 => 0x61 207 => 0xE1 271=>9D */ const int speed=172; /* это должно быть 200 */ const int test_speed=2; /* 0.5==2 */ static int a @ 0x18; /* static int flag @ 0x18;*/ /* static int flag1 @ 0x1a;*/ static bit unsigned char Usvic_Ok @ 0x50; static bit unsigned char PK_Vpr @ 0x51; static bit unsigned char Vpr_Ok @ 0x52; static bit unsigned char Vmd_Ok @ 0x53; static bit unsigned char PO_Ok @ 0x54; /*--- номер выводимого параметра 0=Sl206,1=Sl207,2=Sl271 -*/ static unsigned char NomParam @ 0x1c; static unsigned char BaitV @ 0x2a; /*------------Выходное слово SlVmd 206 ------------------*/ static unsigned long SlVmd @ 0x10; static unsigned char SlVmd_1 @ 0x10; static unsigned char SlVmd_2 @ 0x11; static unsigned char SlVmd_3 @ 0x12; static unsigned char SlVmd_4 @ 0x13; /*------------Выходное слово SlVpr 207 -------------------*/ static unsigned long SlVpr @ 0x3c; static unsigned char SlVpr_1 @ 0x3c; static unsigned char SlVpr_2 @ 0x3d; static unsigned char SlVpr_3 @ 0x3e; static unsigned char SlVpr_4 @ 0x3f; /*------------Выходное слово SlDs 271 --------------------*/ static unsigned long SlDs @ 0x38; static unsigned char SlDs_1 @ 0x38; static unsigned char SlDs_2 @ 0x39; static unsigned char SlDs_3 @ 0x3a; static unsigned char SlDs_4 @ 0x3b; /*------------Выходное слово для ЦАП CapSlowo -------------*/ static unsigned int CapSlowo @ 0x28; static unsigned char CapSlowo0 @ 0x28; static unsigned char CapSlowo1 @ 0x29; /*------- Рабочая область стеков ------------------*/ /* static unsigned long Stec @ 0x28;*/ static bit unsigned char Test_Pr @ 0x40; /*--------- Сохранение переведенных скоростей ----------------*/ static unsigned int StecVprd @ 0x30; static unsigned int StecVmdd @ 0x32; /*--------- Int вводимых скорости ----------------------------*/ static unsigned int Vprg @ 0x20; static unsigned int Vmdg @ 0x24; /*--------- Int переведенных скорости ------------------------*/ static unsigned int Vprd @ 0x22; static unsigned int Vmdd @ 0x26; /*------- Рабочее слово SlRab -------------------------*/ static unsigned long SlRab @ 0x2c; static unsigned char SlRab_4 @ 0x2c; static unsigned char SlRab_3 @ 0x2d; static unsigned char SlRab_2 @ 0x2e; static unsigned char SlRab_1 @ 0x2f; static unsigned char Adress @ 0x2f;/* адреса (206/207/271)*/ static bit unsigned char SlRab_bit31 @ 0x67; static bit unsigned char SlRab_bit30 @ 0x66; static bit unsigned char SlRab_bit29 @ 0x65; static bit unsigned char SlRab_bit28 @ 0x64; static bit unsigned char SlRab_bit27 @ 0x63; static bit unsigned char SlRab_bit26 @ 0x62; static bit unsigned char SlRab_bit25 @ 0x61; static bit unsigned char SlRab_bit24 @ 0x60; static bit unsigned char SlRab_bit23 @ 0x6f; static bit unsigned char SlRab_bit22 @ 0x6e; static bit unsigned char SlRab_bit21 @ 0x6d; static bit unsigned char SlRab_bit20 @ 0x6c; static bit unsigned char SlRab_bit19 @ 0x6b; static bit unsigned char SlRab_bit18 @ 0x6a; static bit unsigned char SlRab_bit17 @ 0x69; static bit unsigned char SlRab_bit16 @ 0x68; static bit unsigned char SlRab_bit15 @ 0x77; static bit unsigned char SlRab_bit14 @ 0x76; static bit unsigned char SlRab_bit13 @ 0x75; static bit unsigned char SlRab_bit12 @ 0x74; static bit unsigned char SlRab_bit11 @ 0x73; static bit unsigned char SlRab_bit10 @ 0x72; static bit unsigned char SlRab_bit9 @ 0x71; static bit unsigned char SlRab_bit8 @ 0x70; static bit unsigned char SlRab_bit7 @ 0x7f; static bit unsigned char SlRab_bit6 @ 0x7e; static bit unsigned char SlRab_bit5 @ 0x7d; static bit unsigned char SlRab_bit4 @ 0x7c; static bit unsigned char SlRab_bit3 @ 0x7b; static bit unsigned char SlRab_bit2 @ 0x7a; static bit unsigned char SlRab_bit1 @ 0x79; static bit unsigned char SlRab_bit0 @ 0x78; /*-- Входные битовые Скорость Vpr Grey -----------------------*/ static bit unsigned char Vprg_bit9 @ 0x01; static bit unsigned char Vprg_bit8 @ 0x00; static bit unsigned char Vprg_bit7 @ 0x0f; static bit unsigned char Vprg_bit6 @ 0x0e; static bit unsigned char Vprg_bit5 @ 0x0d; static bit unsigned char Vprg_bit4 @ 0x0c; static bit unsigned char Vprg_bit3 @ 0x0b; static bit unsigned char Vprg_bit2 @ 0x0a; static bit unsigned char Vprg_bit1 @ 0x09; static bit unsigned char Vprg_bit0 @ 0x08; /*-- Выходные битовые Скорость Vpr Din -----------------------*/ static bit unsigned char Vprd_bit9 @ 0x11; static bit unsigned char Vprd_bit8 @ 0x10; static bit unsigned char Vprd_bit7 @ 0x1f; static bit unsigned char Vprd_bit6 @ 0x1e; static bit unsigned char Vprd_bit5 @ 0x1d; static bit unsigned char Vprd_bit4 @ 0x1c; static bit unsigned char Vprd_bit3 @ 0x1b; static bit unsigned char Vprd_bit2 @ 0x1a; static bit unsigned char Vprd_bit1 @ 0x19; static bit unsigned char Vprd_bit0 @ 0x18; /*-- Входные битовые Скорость Vmd Grey -----------------------*/ static bit unsigned char Vmdg_bit9 @ 0x21; static bit unsigned char Vmdg_bit8 @ 0x20; static bit unsigned char Vmdg_bit7 @ 0x2f; static bit unsigned char Vmdg_bit6 @ 0x2e; static bit unsigned char Vmdg_bit5 @ 0x2d; static bit unsigned char Vmdg_bit4 @ 0x2c; static bit unsigned char Vmdg_bit3 @ 0x2b; static bit unsigned char Vmdg_bit2 @ 0x2a; static bit unsigned char Vmdg_bit1 @ 0x29; static bit unsigned char Vmdg_bit0 @ 0x28; /*-- Выходные битовые Скорость Vmd Din -----------------------*/ static bit unsigned char Vmdd_bit9 @ 0x31; static bit unsigned char Vmdd_bit8 @ 0x30; static bit unsigned char Vmdd_bit7 @ 0x3f; static bit unsigned char Vmdd_bit6 @ 0x3e; static bit unsigned char Vmdd_bit5 @ 0x3d; static bit unsigned char Vmdd_bit4 @ 0x3c; static bit unsigned char Vmdd_bit3 @ 0x3b; static bit unsigned char Vmdd_bit2 @ 0x3a; static bit unsigned char Vmdd_bit1 @ 0x39; static bit unsigned char Vmdd_bit0 @ 0x38; /*------------------------------------------------------------------------*/ /* Процедура записи бита четности для SlRab */ /*------------------------------------------------------------------------*/ void CalcChetSl(void){ SlRab_bit31=1; SlRab_bit31=SlRab_bit31^SlRab_bit0^SlRab_bit1^SlRab_bit2; SlRab_bit31=SlRab_bit31^SlRab_bit3^SlRab_bit4^SlRab_bit5; SlRab_bit31=SlRab_bit31^SlRab_bit6^SlRab_bit7^SlRab_bit8; SlRab_bit31=SlRab_bit31^SlRab_bit9^SlRab_bit10^SlRab_bit11; SlRab_bit31=SlRab_bit31^SlRab_bit12^SlRab_bit13^SlRab_bit14; SlRab_bit31=SlRab_bit31^SlRab_bit15^SlRab_bit16^SlRab_bit17; SlRab_bit31=SlRab_bit31^SlRab_bit18^SlRab_bit19^SlRab_bit20; SlRab_bit31=SlRab_bit31^SlRab_bit21^SlRab_bit22^SlRab_bit23; SlRab_bit31=SlRab_bit31^SlRab_bit24^SlRab_bit25^SlRab_bit26; SlRab_bit31=SlRab_bit31^SlRab_bit27^SlRab_bit28^SlRab_bit29; SlRab_bit31=SlRab_bit31^SlRab_bit30; } /*------------------------------------------------------------------------*/ /* Процедура перевода из грея в двоичную допустимую скорость */ /*------------------------------------------------------------------------*/ void Perevod_Md(void){ Vmdd=0; Vmdd_bit9=Vmdg_bit9; Vmdd_bit8=Vmdg_bit8^Vmdd_bit9; Vmdd_bit7=Vmdg_bit7^Vmdd_bit8; Vmdd_bit6=Vmdg_bit6^Vmdd_bit7; Vmdd_bit5=Vmdg_bit5^Vmdd_bit6; Vmdd_bit4=Vmdg_bit4^Vmdd_bit5; Vmdd_bit3=Vmdg_bit3^Vmdd_bit4; Vmdd_bit2=Vmdg_bit2^Vmdd_bit3; Vmdd_bit1=Vmdg_bit1^Vmdd_bit2; Vmdd_bit0=Vmdg_bit0^Vmdd_bit1; } /*------------------------------------------------------------------------*/ /* Процедура перевода из грея в двоичную предельную скорость */ /*------------------------------------------------------------------------*/ void Perevod_Pr(void){ Vprd=0; Vprd_bit9=Vprg_bit9; Vprd_bit8=Vprg_bit8^Vprd_bit9; Vprd_bit7=Vprg_bit7^Vprd_bit8; Vprd_bit6=Vprg_bit6^Vprd_bit7; Vprd_bit5=Vprg_bit5^Vprd_bit6; Vprd_bit4=Vprg_bit4^Vprd_bit5; Vprd_bit3=Vprg_bit3^Vprd_bit4; Vprd_bit2=Vprg_bit2^Vprd_bit3; Vprd_bit1=Vprg_bit1^Vprd_bit2; Vprd_bit0=Vprg_bit0^Vprd_bit1; } /*------------------------------------------------------------------------*/ /* Процедура расстановки состояний */ /*------------------------------------------------------------------------*/ void Priznak_Work(bit unsigned char a,bit unsigned char b){ SlRab_bit30=a; SlRab_bit29=b; } /*------------------------------------------------------------------------*/ /* Процедура расстановки идентифткатора */ /*------------------------------------------------------------------------*/ void Priznak_Usvic(viod){ SlRab_bit8=0;/* Признак */ SlRab_bit9=1;/* от УСВИЦ-250 */ } /*------------------------------------------------------------------------*/ /* Процедура имтация входных данных */ /*------------------------------------------------------------------------*/ void ImVxodMd(void){ Vmdg=344; } /*------------------------------------------------------------------------*/ /* Процедура имтация входных данных */ /*------------------------------------------------------------------------*/ void ImVxodPr(void){ Vprg=172; } /*------------------------------------------------------------------------*/ /* Процедура проверки на отказ Vmd */ /*------------------------------------------------------------------------*/ void Cikl_Otkaz_Vmd(void){ int c=3,St; Vmd_Ok=0; T1=0; do { /* vvodvmd();*/ ImVxodMd(); /* имитация входа */ Perevod_Md();/* перевод из грея в двоичную */ St=StecVmdd; if ((St+test_speed>Vmdd)&&(St-test_speed { StecVmdd=Vmdd; break; } if (c==0) { Vmd_Ok=1; T1=1; break; } c--; } while(c>(-1)); } /*------------------------------------------------------------------------*/ /* Процедура проверки на отказ Vpr */ /*------------------------------------------------------------------------*/ void Cikl_Otkaz_Vpr(void){ int b=3,St; Vpr_Ok=0; RXD=0; do { /* vvodvpr(); */ ImVxodPr(); /* имитация входа */ Perevod_Pr();/* перевод из грея в двоичную */ St=StecVprd; if ((St+test_speed>Vprd)&&(St-test_speed { StecVprd=Vprd; break; } if (b==0) { Vpr_Ok=1; RXD=1; break; } b--; } while(b>(-1)); } /*------------------------------------------------------------------------*/ /* Процедура маштабирование для ЦАП с соответствием 1==0.63 */ /*------------------------------------------------------------------------*/ void Machtab(unsigned int V1){ double rab1; rab1=(double)V1; rab1*=0.63; CapSlowo=0; CapSlowo=(unsigned int)rab1; CapSlowo0<<=6; } /*------------------------------------------------------------------------*/ /* Процедура формирование слова с соответствием с РТМ */ /*------------------------------------------------------------------------*/ void FormPTM(unsigned int V1){ double rab2; SlRab=0; rab2=(double)V1; rab2/=0.11575; SlRab=(unsigned long)rab2; rab2-=(double)SlRab; if (rab2>0.5) SlRab++; SlRab<<=12; } /*------------------------------------------------------------------------*/ /* Процедура тест контроля ПО */ /*------------------------------------------------------------------------*/ void TestControlPO(void){ int Vprd1=0,Vmdd1=0,Vprg1=0,Vmdg1=0; PO_Ok=Vmd_Ok=Vpr_Ok=0; Vprg1=Vprg; /* сохраняем Vprg */ Vmdg1=Vmdg; /* сохраняем Vmdg */ Vprd1=Vprd; /* сохраняем Vprd */ Vmdd1=Vmdd; /* сохраняем Vmdd */ Vmdg=Vprg=speed; Perevod_Md(); Perevod_Pr(); if (Vmdd!=200) { PO_Ok=1; Vmd_Ok=1; } if (Vprd!=200) { PO_Ok=1; Vpr_Ok=1; } /*----------------------------- 206 --------------------------------------*/ SlRab=0; FormPTM(Vprd); Adress=0x61; Priznak_Usvic();/* признак от УСВИЦ-250 */ Priznak_Work(1,0);/* признак тест */ CalcChetSl();/* Подсчет четности */ if(SlRab!=1080820321) { PO_Ok=1; Vpr_Ok=1; } /*----------------------------- 207 --------------------------------------*/ SlRab=0; FormPTM(Vmdd); Adress=0xe1; Priznak_Usvic();/* признак от УСВИЦ-250 */ Priznak_Work(1,0);/* признак тест */ CalcChetSl();/* Подсчет четности */ if(SlRab!=3228304097) { PO_Ok=1; Vmd_Ok=1; } SlRab=0; /*------------------- востанавливаем состояния --------------------------*/ Vprg=Vprg1; /* востанавливаем Vprg */ Vmdg=Vmdg1; /* востанавливаем Vmdg */ Vprd=Vprd1; /* востанавливаем Vprd */ Vmdd=Vmdd1; /* востанавливаем Vmdd */ } /*------------------------------------------------------------------------*/ /* Процедура проверки скорости - нет вычисленных данных */ /*------------------------------------------------------------------------*/ void If_Speed(unsigned int V){ if(V<200) Priznak_Work(0,1); /* признак нет вычисленных данных */ } /*------------------------------------------------------------------------*/ /* Запуск таймера */ /*------------------------------------------------------------------------*/ void Zapusk(void){ /*---------- Чистка рабочих областей параметров--------------*/ SlRab=0;NomParam=0; /*------------- Запуск таймера --------------------------*/ 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 Priznak_Test(void){ if((PK_Vpr==0) && (Vpr_Ok==0) && (Vmd_Ok==0) && (PO_Ok==0)) SlRab_bit28=0; else SlRab_bit28=1; SlRab_bit27=PK_Vpr; SlRab_bit26=Vpr_Ok; SlRab_bit25=Vmd_Ok; SlRab_bit24=PO_Ok; } /*------------------------------------------------------------------------*/ /* Процедура разовой команды ТЕСТ КОНТРОЛЬ */ /*------------------------------------------------------------------------*/ void Test_Kontrol(void){ 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с ORL P0,#0C0H ; 2 mkc 40 ;-------------------------------------------------------------------- 40 ;-------------------------------------------------------------------- 0 POP 3 ; 2 mkc POP 2 ; 2 mkc POP 1 ; 2 mkc POP 0 ; 2 mkc POP 0E0H ; 2 mkc POP 0D0H ; 2 mkc RET ; 2 mkc ;-------------------------------------------------------------------- 14 ;*************************************************************************** _Vivod207: 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,#Sl207 ; 1 mkс 18 ;----------------------------------------------------------------------- Bait207: MOV A,@R0 ; 1 mkc MOV R2,#7 ; 1 mkс Bit207: 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с Pauza207_0: DJNZ R1,Pauza207_0 ; 2*15=30 mkc 36 NOP ; 1 mkc NOP ; 1 mkc MOV P0,BaitV ; 2 mkс 40 63 MOV R1,#18 ; 1 mkс 00 Pauza207_1: DJNZ R1,Pauza207_1 ; 2*17=34 mkc DJNZ R2,Bit207 ; 2 mkс 37 RRC A ; 1 mkс ORL P0,#0ffh ; 2 mkc 40 ;------------------------------------------------------------------------ MOV Bit6V,C ; 2 mkс 00 MOV Bit7V,C ; 2 mkс CPL Bit7V ; 1 mkс MOV R1,#16 ; 1 mkс 6 Pauza207_2: DJNZ R1,Pauza207_2 ; 2*16=32 mkc 38 MOV P0,BaitV ; 2 mkс 40 MOV R1,#15 ; 1 mkс 00 Pauza207_3: DJNZ R1,Pauza207_3 ; 2*15=30 mkc 31 ;--------------------------------------------------------------------- INC R0 ; 2 mkc 33 DJNZ R3,Bait207 ; 2 mkс 35 NOP NOP NOP ORL P0,#0C0H ; 2 mkc 40 ;------------------------------------------------------------------------- POP 3 ; 2 mkc POP 2 ; 2 mkc POP 1 ; 2 mkc POP 0 ; 2 mkc POP 0E0H ; 2 mkc POP 0D0H ; 2 mkc RET ; 2 mkc ;*************************************************************************** _Vivod271: 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,#Sl271 ; 1 mkс 18 ;----------------------------------------------------------------------- Bait271: MOV A,@R0 ; 1 mkc MOV R2,#7 ; 1 mkс Bit271: 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с Pauza271_0: DJNZ R1,Pauza271_0 ; 2*15=30 mkc 36 NOP ; 1 mkc NOP ; 1 mkc MOV P0,BaitV ; 2 mkс 40 63 MOV R1,#18 ; 1 mkс 00 Pauza271_1: DJNZ R1,Pauza271_1 ; 2*17=34 mkc DJNZ R2,Bit271 ; 2 mkс 37 RRC A ; 1 mkс ORL P0,#0ffh ; 2 mkc 40 ;------------------------------------------------------------------------ MOV Bit6V,C ; 2 mkс 00 MOV Bit7V,C ; 2 mkс CPL Bit7V ; 1 mkс MOV R1,#16 ; 1 mkс 6 Pauza271_2: DJNZ R1,Pauza271_2 ; 2*16=32 mkc 38 MOV P0,BaitV ; 2 mkс 40 MOV R1,#15 ; 1 mkс 00 Pauza271_3: DJNZ R1,Pauza271_3 ; 2*15=30 mkc 31 ;--------------------------------------------------------------------- INC R0 ; 2 mkc 33 DJNZ R3,Bait271 ; 2 mkс 35 NOP NOP NOP ORL P0,#0C0H ; 2 mkc 40 ;------------------------------------------------------------------------- POP 3 ; 2 mkc POP 2 ; 2 mkc POP 1 ; 2 mkc POP 0 ; 2 mkc POP 0E0H ; 2 mkc POP 0D0H ; 2 mkc RET ; 2 mkc ;*************************************************************************** END Приложени 3. Программа вывода приборной скорости на ЦАП. defseg c_text,class=code seg c_text CapSlowo0 equ 28h; CapSlowo1 equ 29h; global _VivodCapSl _VivodCapSl: push 0e0h push 1 push 2 push 3 clr tcon.4 mov a,CapSlowo0 mov p0,a mov a,CapSlowo1 mov p2,a setb p0.3 nop nop nop nop nop clr p0.3 setb tcon.4 pop 3 pop 2 pop 1 pop 0e0h ret End Приложение 4. Программа считывания приборной скорости с маски. defseg c_text,class=code seg c_text ;адреса битов на Vmd bitvmd0 equ 28h bitvmd1 equ 29h bitvmd2 equ 2ah bitvmd3 equ 2bh bitvmd4 equ 2ch bitvmd5 equ 2dh bitvmd6 equ 2eh bitvmd7 equ 2fh bitvmd8 equ 20h bitvmd9 equ 21h global _vvodvmd _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 inc p1 inc p1 call Read_P_1_5 mov bitvmd4,c inc p1 inc p1 call Read_P_1_5 mov bitvmd5,c orl p1,#11h ;запрет d2 и разрешение d4 anl p1,#11h ;запрет d2 и разрешение d4 anl p0,#0 ;запрет d5 call Read_P_1_5 mov bitvmd6,c inc p1 inc p1 call Read_P_1_5 mov bitvmd7,c inc p1 inc p1 call Read_P_1_5 mov bitvmd8,c inc p1 inc p1 call Read_P_1_5 mov bitvmd9,c setb tcon.4 pop 3 pop 2 pop 1 pop 0e0h ret Read_P_1_5: setb p1.5 mov r3,#30 ;250 Pause_P_1_5: nop nop djnz r3,Pause_P_1_5 mov c,p1.5 ret end Приложение 5. Программа считывания максимальной допустимой скорости с маски. defseg c_text,class=code seg c_text ;адреса битов на Vpr bitvpr0 equ 08h bitvpr1 equ 09h bitvpr2 equ 0ah bitvpr3 equ 0bh bitvpr4 equ 0ch bitvpr5 equ 0dh bitvpr6 equ 0eh bitvpr7 equ 0fh bitvpr8 equ 00h bitvpr9 equ 01h global _vvodvpr _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 inc p1 inc p1 call Read_P_1_5 mov bitvpr5,c inc p1 inc p1 call Read_P_1_5 mov bitvpr6,c inc p1 inc p1 call Read_P_1_5 mov bitvpr7,c orl p1,#10h ;запрещение D2 и разрешение D4 anl p1,#10h ;запрещение D2 и разрешение D4 call Read_P_1_5 mov bitvpr8,c inc p1 inc p1 call Read_P_1_5 mov bitvpr9,c setb tcon.4 pop 3 pop 2 pop 1 pop 0e0h ret Read_P_1_5: setb p1.5 mov r3,#30 ;250 Pause_P_1_5: nop nop djnz r3,Pause_P_1_5 mov c,p1.5 ret end