          5. Практическая часть

      5.1. Особенности разработки
           программ для ОЭВМ

   Для  проектирования  на языке АССЕМБЛЕР
программного  обеспечения  для устройства,
основанного на  однокристальной ЭВМ, необ-
ходимо  знать архитектуру и систему команд
данной ОЭВМ.
   Микроконтроллер AT89C52 имеет множество
регистров, расположенных в адресном прост-
ранстве  ОЗУ  регистров  спецфункций и 111
машинных команд [1] форматом 1,2 или 3 ба-
йта  с различными  аргументами и способами
адресации, предназначенных для разнообраз-
ной обработки данных в этих регистрах,дру-
гих областях  памяти (внутреннее  ОЗУ дан-
ных, ПЗУ,внешнее ОЗУ),а также в двунаправ-
ленных внешних портах.
   ОЭВМ имеет:

 ■ 8 килобайт внутреннего ПЗУ;
 ■ 32 регистра  общего  назначения (РОН), 
разбитых на 4 блока по 8 регистро R0-R7; 
 ■ 128 определяемых  пользователем  прог- 
раммно-управляемых флагов; 
 ■ набор  регистров  специальных  функций 
(SFR, Special Function Registers); 
 ■ 256 байт внутреннего ОЗУ данных, пере- 
секающегося  нижними 128 байтами с памятью 
регистров спецфункций. ОЗУ данных доступно 
только с помощью косвенной регистровой ад- 
ресации по регистрам R0,R1. 

   В ОМЭВМ предусмотрена возможность зада-
ния частоты внутреннего генератора с помо-
щью кварца,LC-цепочки или внешнего генера-
тора. Тактовая частота не должна превышать 
24 МГц. 

   Регистры  спецфункций с указанием адре-
сов  приведены  в таблице 5.1.1 (регистры,
допускающие  побитовую адресацию, помечены
звёздочкой):

                            Таблица 5.1.1 
┌───────────┬─────────────────────┬──────┐ 
│Обозначение│    Наименование     │ Адрес│ 
├───────────┼─────────────────────┼──────┤ 
│   *ACC    │ Аккумулятор         │ 0E0h │ 
├───────────┼─────────────────────┼──────┤ 
│    *B     │ Регистр B           │ 0F0h │ 
├───────────┼─────────────────────┼──────┤ 
│   *PSW    │ Регистр состояния   │      │ 
│           │  программы          │ 0D0h │ 
├───────────┼─────────────────────┼──────┤ 
│    SP     │ Указатель стека     │  81h │ 
├───────────┼─────────────────────┼──────┤ 
│    DPTR   │ Указатель данных.   │      │ 
│           │  2 байта:           │      │ 
│   - DPL   │ - младший байт      │  82h │ 
│   - DPH   │ - старший байт      │  83h │ 
├───────────┼─────────────────────┼──────┤ 
│    *P0    │ Порт 0              │  80h │ 
├───────────┼─────────────────────┼──────┤ 
│    *P1    │ Порт 1              │  90h │ 
├───────────┼─────────────────────┼──────┤ 
│    *P2    │ Порт 2              │ 0A0h │ 
├───────────┼─────────────────────┼──────┤ 
│    *P3    │ Порт 3              │ 0B0h │ 
├───────────┼─────────────────────┼──────┤ 
│    *IP    │ Регистр приоритетов │      │ 
│           │  прерываний         │ 0B8h │ 
├───────────┼─────────────────────┼──────┤ 
│    *IE    │ Регистр разрешения  │      │ 
│           │  прерываний         │ 0A8h │ 
├───────────┼─────────────────────┼──────┤ 
│    TMOD   │ Регистр режимов     │      │ 
│           │  таймера/счётчика   │  89h │ 
├───────────┼─────────────────────┼──────┤ 
│   *TCON   │ Регистр управления  │      │ 
│           │  таймера/счётчика   │  88h │ 
├───────────┼─────────────────────┼──────┤ 
│    TH0    │ Таймер/счётчик 0.   │      │ 
│           │  Старший байт       │  8Ch │ 
├───────────┼─────────────────────┼──────┤ 
│    TL0    │ Таймер/счётчик 0.   │      │ 
│           │  Младший байт       │  8Ah │ 
├───────────┼─────────────────────┼──────┤ 
│    TH1    │ Таймер/счётчик 1.   │      │ 
│           │  Старший байт       │  8Dh │ 
├───────────┼─────────────────────┼──────┤ 
│    TL1    │ Таймер/счётчик 1.   │      │ 
│           │  Младший байт       │  8Bh │ 
├───────────┼─────────────────────┼──────┤ 
│   *SCON   │ Управление после-   │      │ 
│           │  довательным портом │  98h │ 
├───────────┼─────────────────────┼──────┤ 
│    SBUF   │ Буфер последовате-  │      │ 
│           │  льного порта       │  99h │ 
├───────────┼─────────────────────┼──────┤ 
│    PCON   │ Управление          │      │ 
│           │  потреблением       │  87h │ 
└───────────┴─────────────────────┴──────┘ 

  Аккумулятор. ACC - регистр  аккумулято-
ра. Команды, предназначенные для  работы с
аккумулятором, используют  мнемонику  "A",
например, MOV A, P2. Мнемоника "ACC" испо-
льзуется,к примеру,при побитовой адресации
аккумулятора. Так,символическое имя пятого
бита аккумулятора будет следующим: ACC.5.
  Регистр B. Используется во время опера-
ций умножения и деления.Для других инстру-
кций  регистр  B может рассматриваться как
дополнительный сверхоперативный регистр.
  Регистр  состояния  программы.  Регистр 
PSW содержит флаги состояния программы. 
  Указатель  стека SP. 8-битовый регистр,
содержимое которого инкрементируется перед
записью  данных  в стек при выполнении ко-
манд  PUSH  и CALL. При  начальном  сбросе
указатель стека  устанавливается  в 07h, а
область стека  в ОЗУ  данных  начинается с
адреса 08h. При необходимости  путём пере-
определения  указателя стека область стека
может быть расположена в любом месте внут-
реннего ОЗУ микроЭВМ.
  Указатель   данных.  Указатель   данных 
(DPTR)  состоит  из старшего байта (DPH) и 
младшего  байта (DPL). Содержит 16-битовый
адрес при обращении к внешней памяти.Может
использоваться  как 16-битовый регистр или
как  два независимых восьмибитовых регист-
ра.
  Порт0-Порт3. Регистрами специальных фу-
нкций  P0, P1, P2, P3  являются  регистры-
&#60;защёлки&#62; соответствующих портов.
  Буфер  последовательного  порта.   SBUF
представляет собой два отдельных регистра:
буфер передатчика и буфер приёмника. Когда
данные  записываются в SBUF, они поступают
в буфер передатчика, причём запись байта в 
SBUF автоматически инициирует его передачу 
через  последовательный порт. Когда данные
читаются из SBUF, они выбираются из буфера
приёмника.
   Регистры   таймера.  Регистровые   пары 
(TH0,TL0) и (TH1,TL1) образуют  16-битовые 
счётные  регистры  соответственно таймера-
счётчика 0 и таймера-счётчика 1.
   Регистры управления. Регистры специаль-
ных функций IP, IE, TMOD, TCON,SCON и PCON
содержат  биты управления и биты состояния
системы  прерываний, таймеров/счётчиков  и
последовательного порта.

────────────────────────────────────────── 

   5.2. Разработка и описание программы

  5.2.1. Реализация  упаковщика по методу 
битового RLE с сегментацией 

   Самой  критичной  по времени исполнения
частью программы является упаковщик по ме-
тоду  битового RLE с одновременной выдачей
сжатых данных в последовательный порт. По-
скольку этот участок является для програм-
мы решающим,разработку кода программы луч-
ше всего начать с него. В разделе 4.1 было
оценено  время  в машинных  циклах AT89C52
между двумя передаваемыми байтами. Это по-
зволяет выбрать строение внутреннего цикла
программы,ориентируясь на время выполнения
одного  прохода  цикла подсчёта количества
подряд идущих одинаковых бит. Это время не
может превышать:

           1000/128 ў 8 (МЦ),

а на практике - ещё меньше,чтобы предусмо-
треть время  на остальную часть программы,
помимо цикла.
   Для  подсчёта количества одинаковых бит
нам обязательно потребуется чтение внешне-
го ОЗУ командой movx a,@dptr или аналогич-
ной  командой movx a,@Ri, использующей ре-
гистр R0 или R1. В данном  случае  это  не
составляет разницы,поскольку и та,и другая
команда  выполняются за 2 МЦ. При переходе
к каждому следующему байту адрес необходи-
мо инкрементировать с  учётом зацикливания
внутри четверти ОЗУ. Разумеется,неприменим
фрагмент, делающий это напрямую:
       ...
       mov a,dph
       inc dptr
       xrl a,dph
       anl a,#30h
       xrl a,dph
       mov dph,a
       ...
поскольку один только этот фрагмент выпол-
няется за 1+1+1+1+1+1=6 МЦ.
   Поэтому  целесообразным  представляется
вычислить  до входа в цикл количество про-
ходов цикла таким образом, чтобы инкремен-
тирование старшего байта адреса происходи-
ло после выхода  из цикла, а в самом цикле
осталось только inc dpl (1 МЦ).
   Далее  нам  требуется организовать про-
верку  бита  в  считанном  байте  и  выход
из  цикла  при  нужном  значении этого би-
та. Такую  задачу  можно  решить  командой 
jb acc.N,label (или  jnb),  где  N - номер 
проверяемого бита. Но в этом случае требу-
ется иметь в программе 16 (8 битов · 2 по-
лярности) похожих  участков, что  не очень
удобно. Тем более что с учётом команды за-
цикливания  djnz counter,loop  (2 МЦ) весь
цикл будет отнимать 2+1+2+2=7 МЦ, что поч-
ти на пределе выделенного времени.
   Таким  образом, имеет  смысл  "раскрыть
цикл", то есть сгруппировать действия,осу-
ществлявшиеся в несколько проходов  цикла,
в один проход. В нашем случае достаточно 4
проходов  внутри одного (приведён фрагмент
для подсчёта нулевых битов):

bp01:   movx a,@dptr ;2 МЦ 
       orl orer,a   ;1 МЦ: накапливаем
                           ;единицы в orer
       inc dpl      ;1 МЦ 
bp02:   movx a,@dptr 
       orl orer,a
       inc dpl 
bp03:   movx a,@dptr 
       orl orer,a
       inc dpl 
bp04:   movx a,@dptr 
       orl orer,a
       mov a,orer   ;1 МЦ
       anl a,masker ;1 МЦ
       jnz bp0_e    ;2 МЦ: среди 4 прочи-
                     ;танных байт попалась
                        ;единица в бите по
                             ;маске masker
       mov orer,#0  ;1 МЦ
       inc dpl
       djnz b,bp01  ;2 МЦ
       ...

   Метки bp01, bp02, bp03  и bp04 - четыре
входа  в цикл, причём  выбор одного из них
зависит от того, где относительно сегмента 
(128 байт) и  параграфа  памяти (256 байт) 
расположен dptr: инкремент dph или обрабо-
тка конца сегмента должны происходить пос-
ле выхода из цикла.
   В таком случае, после  выхода  из цикла
(после djnz) необходимо проверить:
 ■ не нужно ли увеличить dph? (dpl=0?);
 ■ не кончился ли сегмент памяти? 
((dpl-segbeg)mod 256=128?) 
   На выходе из цикла  по jnz  необходимо,
кроме  того, найти байт, где после нулевых
битов впервые появилась единица.Пусть в R0
до входа в цикл помещается содержимое dpl.
Очевидно, искать  единицу  до этого адреса
не нужно:
       ... 
bp0_e:  mov a,R0         ;в R0 - положение 
                        ;dptr до цикла
       cjne a,dpl,bp0_en0  ;&#60;&#60;
       jmp bp0rese         ;уменьшаем dpl 
bp0_en0:                    ;на 3, но не 
       dec dpl             ;меньше,чем до
       cjne a,dpl,bp0_en1  ;совпадения
       jmp bp0rese         ;с R0 
bp0_en1:                    ; 
       dec dpl             ;
       cjne a,dpl,bp0_en2  ;
       jmp bp0rese         ; 
bp0_en2:                    ; 
       dec dpl             ;&#62;&#62;

bp0rese:movx a,@dptr  ;ищем первую единицу 
                     ;среди 4(или меньше)
                     ;смежных байтов
       inc dpl
       anl a,masker  ;проверяем бит
                     ;по маске сигнала
       jz bp0rese    ;продолжаем поиск,
                     ;если ноль
       dec dpl       ;переполнения dpl
                     ;быть не может, т.к.
       ...           ;мы вышли из inner
                     ;loop по единичному
                     ;биту.

   Перед  входом  в цикл необходимо вычис-
лить  число  проходов и выбрать правильную
точку входа.Всего возможно несколько вари-
антов  относительного  расположения dptr и
адреса  начала  сегмента  ( N = количество
элементарных проходов цикла):

a) segbeg&#60;128: раньше  появится конец сег- 
мента.
N=(segbeg+128-dpl) mod 256; 
b) segbeg=128: конец  сегмента  и одновре- 
менно dpl=0.
N=(segbeg+128-dpl) mod 256=256-dpl; 
c) segbeg&#62;128 и dpl&#62;128: раньше произойдёт 
dpl=0.
N=256-dpl; 
d) segbeg&#62;128 и dpl&#60;128: раньше появится 
конец сегмента.
N=(segbeg+128-dpl) mod 256.

   Начальное   значение   счётчика   цикла 
(count) зависит от N следующим образом: 

┌─────┬───┬───┬───┬───┬───┬───┬──┬───┬───┐ 
│  N  │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │..│127│128│ 
├─────┼───┼───┼───┼───┼───┼───┼──┼───┼───┤ 
│count│ 1 │ 1 │ 1 │ 1 │ 2 │ 2 │..│ 32│ 32│ 
└─────┴───┴───┴───┴───┴───┴───┴──┴───┴───┘ 

   Поэтому count определяется выражением:

           count=(N+3) div 4,

что на ассемблере AT89C52 проще всего реа-
лизовать последовательностью  команд (если
значение N поместить в аккумулятор):
       ...
       dec a
       rr a    ;циклический сдвиг вправо
       rr a    ;на 2 разряда
       inc a
       mov b,a ;количество проходов цикла
       jbc b.7,bp0i_x1  ;выбираем один из
                   ;четырех входов в цикл
       jbc b.6,bp03  ;01 сразу сбрасываем
                    ;проверяемые биты 6,7
       jmp bp04      ;00 
bp0i_x1:jbc b.6,bp01  ;11 
       jmp bp02      ;10

  Остальная  часть процедуры упаковки ме-
нее сложна.Внимания заслуживает только не-
большой  рагмент, где  короткий (не  более
чем  на 128 байт) условный  переход  из-за
большого  размера цикла приходится продол-
жить длинным безусловным:
       ...
       cjne a,dpl,bp_inseg_jmp 
;уменьшаем количество оставшихся сегментов 
       djnz R7,bp_main_jmp   ;продолжаем,
                            ;если не ноль
       call waitsend  ;вызов п/п ожидания
                          ;передачи байта
       jmp SENDSUM    ;выдача контрольной
                                   ;суммы 
;;;;;;;; ВЫХОД из п/п ЧИТАТЬ КАНАЛ ;;;;;;; 
bp_inseg_jmp: 
       jmp bp_inseg  ;компенсация коротк.
                           ;перехода cjne
                   ;с пом.длинного перех. 
bp_main_jmp: 
       jmp bp_main ;компенсация короткого
                            ;перехода djnz

────────────────────────────────────────── 

           5.2.2. Реализация
        главного цикла программы

   После  сброса или включения устройства,
вслед  за инициализацией и проведением са-
моконтроля, программа управления СЛА пере-
ходит к главному циклу. Главный цикл прог-
раммы занимается  получением  и обработкой
кадров сообщений.
   Приём  кадра  оказалось удобно реализо-
вать через подпрограмму,возвращающую после
удачного или неудачного приёма кадра в ак-
кумуляторе  код завершения, в регистре B - 
КОП, а в блоке памяти  по адресу FramBuf - 
принятую полезную  часть  данных кадра (то
есть без  байтов КОП, длины  и контрольной
суммы).
   Соответствие возвращаемого значения ак-
кумулятора виду ошибки принято следующим:

   ┌─────┬──────────────────────────┐
   │ ACC │      Вид ошибки          │
   ├─────┼──────────────────────────┤
   │  0  │ нет ошибки               │
   │  1  │ ошибка приема КОП        │
   │  2  │ неверная длина кадра     │
   │  3  │ ошибка контрольной суммы │
   └─────┴──────────────────────────┘

   Подпрограмма приёма кадра имеет выход в
случае обрыва связи во время приёма кадра.
Обрыв связи распознаётся как чрезмерно бо-
льшая  пауза после приёма байта и при ожи-
дании следующего. Максимальная пауза между
байтами  пауза задана в программе констан-
той:

GetWait equ 4000 ;максимальная пауза между 
            ;принимаемыми байтами (x5 МЦ)

   Главный цикл возможно реализовать так:

;-------- ГЛАВНЫЙ ЦИКЛ (MainLoop) -------- 
MainLoop: 
       call GETFRAME    ;приём кадра из
                       ;последовательного
                        ;порта в буфер
       cjne a,#0,ML_er1 ;Переход, если
                    ;ошибка приема (A&#60;&#62;0)
       mov a,b          ;КОП
       anl a,#7fh       ;сброс старшего
                        ;бита КОП
       cjne a,#08h,ML_2 ;Проверка КОПа на
                        ;существование 
ML_2:   jc ML_noer       ;Переход,если нет 
                        ;ошибки команды
                        ;(A&#60;08h, C=1) 
ML_coer:call _ECOM       ;Вызов подпрог- 
                    ;раммы ОШИБКА КОМАНДЫ
       jmp MainLoop     ;Переход на
                        ;начало цикла 
ML_noer:mov dpl,#Low(CallTab) ;&#60;&#60;Заносим в 
                             ;dptr адрес
                            ;таблицы под-
       mov dph,#High(CallTab) ;программ&#62;&#62;
       add a,acc        ;Сдвиг аккумуля-
                        ;тора влево
       jmp @a+dptr    ;Переход на таблицу
                     ;вызовов подпрограмм 
ML_er1: 
       djnz acc,ML_er2  ;переход, если не
                       ;ошибка приёма КОП 
;1=ошибка приема КОП 
       jmp MainLoop 
ML_er2: 
       djnz acc,ML_er3  ;переход, если не
                        ;ошибка данных 
;2=неверная длина кадра 
;или поле данных при КОП.7=0 
       call _EIO      ;вызов подпрограммы
                  ;ОШИБКА ПЕРЕДАЧИ ДАННЫХ
       jmp MainLoop 
ML_er3: 
;3=ошибка контрольной суммы 
       call _EIO      ;вызов подпрограммы
                   ;ОШИБКА ПЕРЕДАЧИ ДАННЫХ
       jmp MainLoop 
;---- Конец главного цикла (MainLoop) ---- 

   Здесь  видно, что переход на обработчик
команды или запроса  реализован через таб-
лицу подпрограмм. Такое средство,предоста-
вляемое системой команд ОЭВМ, очень удобно
в этом случае, поскольку число обрабатыва-
емых КОП легко может быть увеличено, и при
этом программа  не  станет громоздкой и не
будет работать медленнее.
   Главная часть механизма перехода по та-
блице - команда jmp @a+dptr, которая  осу-
ществляет переход  по  вычисляемому адресу 
dptr+ACC. В нашем случае dptr указывает на 
первый адрес таблицы,а ACC содержит смеще-
ние (кратное 2 ).Таблица состоит из неско-
льких коротких переходов (ajmp), каждый из
которых  указывает на свою программу-обра-
ботчик. В конце обработчиков стоит команда 
jmp MainLoop для возврата в начало главно- 
го цикла.

────────────────────────────────────────── 

         5.2.3. Состав текстов
       программных модулей ПО СЛА

   Главным  модулем  является  SLA.asm. Он
содержит:
 ■ объявления глобальных констант;
 ■ директивы распределения памяти;
 ■ код программы инициализации;
 ■ главный цикл и таблицу переходов;
 ■ общую подпрограмму коррекции dptr пос- 
ле перехода границы параграфа памяти; 
 ■ директивы компиляции остальных модулей 
программы. 

   Модуль io.asm, реализующий базовые опе-
рации   ввода-вывода   в  последовательный
порт, содержит  следующие  необходимые для
этого подпрограммы:
 ■ SENDSUM - процедура выдачи в порт кон- 
трольной  суммы -csum. Здесь и далее вход- 
ные данные - в аккумуляторе; 
 ■ SEND - процедура выдачи байта  в буфер 
последовательного  порта  без ожидания его 
передачи, с накоплением контрольной суммы; 
 ■ movsbuf - процедура выдачи байта в бу- 
фер последовательного  порта  без ожидания 
его  передачи, без  накопления контрольной 
суммы; 
 ■ SENDKOP - процедура  выдачи в последо- 
вательный порт КОП и его дополнения до ну- 
ля; 
 ■ SENDACC - процедура выдачи содержимого 
аккумулятора  в  последовательный  порт  с 
ожиданием передачи и накоплением контроль- 
ной суммы; 
 ■ waitsend - процедура ожидания передачи 
байта из буфера последовательного порта; 
 ■ GETFRAME - процедура  приёма  кадра по 
последовательному порту; 
 ■ GETBYTE - процедура  приёма  байта  из 
последовательного порта. 

   Модуль  messages.asm  содержит подпрог-
раммы выдачи простых ответных сообщений:
 ■ _COMOK - подпрограмма выдачи ОС &#60;Кома- 
нда выполнена&#62;; 
 ■ _ECOM - подпрограмма  обработки ошибки 
команды. Выдача ОС &#60;Ошибка команды&#62;; 
 ■ _EDATA - подпрограмма обработки ошибки 
данных. Выдача ОС &#60;Некорректные данные&#62;; 
 ■ _EIO - подпрограмма  выдачи ОС &#60;Ошибка 
передачи данных&#62;; 
 ■ _RESOK - подпрограмма выдачи ОС &#60;Исхо- 
дное состояние&#62;. 

   Модуль  control.asm  содержит процедуры
контроля ОЗУ и ПЗУ:
 ■ SIGNS - контроль ПЗУ (8k)  сигнатурным
анализом;
 ■ EXRAM - контроль  внешнего ОЗУ (16k) с 
очисткой. 

   Модуль  _rchan.asm  содержит  процедуры
обработки запроса &#60;Читать канал&#62;:
 ■ _RCHN - общая  подпрограмма  анализа и 
выдачи  данных канала наиболее эффективным 
методом кодирования; 
 ■ rch_const - процедура   выдачи  данных 
постоянного (не изменяющегося) канала; 
 ■ rch_noise - процедура  выдачи   данных 
сильно изменяющегося (шумового) канала; 
 ■ bitpack - процедура  выдачи данных не- 
постоянного канала.На основании статистики 
канала производится выбор метода кодирова- 
ния: без сжатия или со сжатием по битовому 
методу RLE; 
 ■ FRONTS - процедура подсчёта  статистик 
(числа фронтов) сигналов  в данной области 
ОЗУ. 

   Остальные модули содержат по одной важ-
ной процедуре.Входные данные для этих про-
цедур должны находиться в буфере принятого
кадра.
   Модуль _rstate.asm содержит подпрограм-
му _RSTATE, служащую для обработки запроса 
&#60;Читать  состояние  СЛА&#62;. Модуль _rram.asm 
содержит подпрограмму _RRAM, служащую  для
обработки  запроса  &#60;Читать  ОЗУ&#62;.  Модуль 
_selfc.asm  содержит  подпрограмму  _SELFC 
обработки  команды &#60;Запустить самоконтроль 
ЛА&#62;. 

   Перечисленные программы составляют весь
список необходимых модулей,входящих в про-
граммное  обеспечение  специализированного
логического анализатора.

────────────────────────────────────────── 

   5.3. Автономная отладка программы
               на модели

   Для  отладки  программы  управления СЛА
был использован монитор-отладчик Debugger- 
51. С помощью  этого средства можно выпол- 
нять c программой такие действия, как:

 ■ выполнение  до  указанного   оператора 
(строки кода); 
 ■ пошаговое выполнение программы;
 ■ выполнение до точки останова;
 ■ включение и выключение точек останова;
 ■ просмотр и изменение  значений регист- 
ров и ячеек памяти; 
 ■ загрузка и сохранение содержимого всех 
видов памяти ОЭВМ на магнитный носитель. 

   Использование  отладчика позволило зна-
чительно сократить срок  написания главных
алгоритмов программы за счёт автоматизации
поиска и исправления ошибок.
   Отсутствие возможности отладки алгорит-
мов передачи данных измерения на существу-
ющем  СЛА  компенсировано за счёт создания
его модели,что позволило провести проекти-
рование программы на одной ПЭВМ. Для этого
были произведены следующие действия:

 ■ в базовые функции ввода-вывода (модуль 
io.asm) внесены  изменения. Вместо  выдачи 
данных  в последовательный порт, процедуры 
заносят  байты  данных  во внешнее ОЗУ, за 
пределами используемой области в 16k. 
 ■ в главном модуле программы отключаются 
вызовы процедур самоконтроля и приёма кад- 
ра. Вместо  приёма кадра при трассировке с 
помощью  отладчика  в  регистры и ОЗУ ОЭВМ 
подставляются  данные  кадра  отлаживаемой 
команды или запроса. 
 ■ данные  каналов генерируются с помощью 
псевдослучайных чисел специальной програм- 
мой,написанной на Delphi, и при трассиров- 
ке грузятся  во  внешнее ОЗУ ОЭВМ. Листинг 
программы-генератора  сигналов  приведен в 
приложении данного дипломного проекта. 
 ■ После места вызова отлаживаемой проце- 
дуры ставится точка останова. 
 ■ Кадры ОС,возвращаемые программой упра- 
вления СЛА, формируются во внешней памяти, 
после чего выгружаются средствами отладчи- 
ка и тестируются на правильность. 

   Для  примера  можно  показать, как была
сгенерирована случайная последовательность
сигналов  с начальным значением псевдослу-
чайного генератора, равным 2 (рис.5.3.1).

 ▒▒ Signal generator ▒▒▒▒▒▒▒▒ [_][O][X]
 ╟────────────────────────────────────╢
 ║ ┌────┐┌──────┐┌────┐┌──────┐┌────┐ ║
 ║ ┘    └┘      └┘    └┘      └┘    └ ║
 ║ ┐┌┐┌─┐┌┐ ┌┐┌┐┌─┐┌┐┌┐┌┐ ┌┐┌┐┌┐┌─┐┌┐ ║
 ║ └┘└┘ └┘└─┘└┘└┘ └┘└┘└┘└─┘└┘└┘└┘ └┘└ ║
 ║ ─┐┌┐┌─┐ ┌┐ ┌─┐ ┌┐┌─┐┌┐┌┐┌─┐ ┌─┐┌─┐ ║
 ║  └┘└┘ └─┘└─┘ └─┘└┘ └┘└┘└┘ └─┘ └┘ └ ║
 ║ ┐ ┌┐┌─┐┌─┐ ┌─┐ ┌─┐┌─┐ ┌┐ ┌─┐┌─┐ ┌─ ║
 ║ └─┘└┘ └┘ └─┘ └─┘ └┘ └─┘└─┘ └┘ └─┘  ║
 ║ ┐┌─┐┌─┐┌─┐┌──┐ ┌─┐┌──┐┌─┐┌┐┌─┐┌─┐┌ ║
 ║ └┘ └┘ └┘ └┘  └─┘ └┘  └┘ └┘└┘ └┘ └┘ ║
 ║ ┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌ ║
 ║ └┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘ ║
 ║  ┌─┐ ┌──┐ ┌─┐ ┌──┐ ┌┐ ┌─┐ ┌─┐ ┌──┐ ║
 ║ ─┘ └─┘  └─┘ └─┘  └─┘└─┘ └─┘ └─┘  └ ║
 ║ ─┐┌─────┐┌───┐┌───┐┌────┐┌────┐┌── ║
 ║  └┘     └┘   └┘   └┘    └┘    └┘   ║
 ║                                    ║
 ║                                    ║
  ║█████▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒║
 ╟────────────────────────────────────╢
 [Generate] Seed= [2] not tested [Test]
 ╙────────────────────────────────────╜

Рис. 5.3.1. Генератор тестовых сигналов.

   Ниже приведён  дамп файла сгенерирован-
ной программой  области памяти (4 килобай-
та), где значения отсчётов сигналов распо-
ложены  так, как  если бы они были считаны
схемой записи СЛА. Этот файл будет исполь-
зоваться для отладки программы СЛА в отла-
дчике Debugger-51 (таблица 5.3.1).

             Таблица 5.3.1.
     Дамп сгенерированных сигналов

0000: D6D6D292-90802021-21252D2D-2D296868 
0010: 68484044-44444404-04040404-00000000 
0020: 40404046-66666666-66323232-32323232 
0030: 1E1E1C1C-1C5C5C4C-48404040-40400404 
0040: 24242424-24202060-60606060-40434347 
0050: 0707078F-8F8E8E8E-CACACAC8-C8D0D034 
0060: 34343434-34343430-30100000-40404040 
0070: 40040404-0C0C0C0C-28282828-2A2A2222 
0080: 26666646-46460602-00001010-10101414 
0090: 14145454-70707070-78686868-682C2D0D 
00A0: 0D050501-03030202-42424242-46464444 
00B0: 44400020-20202024-2424BCFC-FCF8D8D8 
00C0: D8D8D898-90909090-96161606-66666666 
00D0: 66666040-40000404-0404040C-08080848 
00E0: 48486868-6C6C6464-24242424-20202123 
00F0: 03031313-13131616-54545454-5C484808 
0100: 08282828-2C242424-24646444-44444040 
0110: 40404040-02020606-06060606-26262232 
0120: 727070F0-F0F8FCFC-FCBC3C1C-04040400 
0130: 00000000-00444444-44444444-40202022 
0140: 22222626-26262607-03034B5B-5B59585C 
0150: 54141414-14100000-00202020-24242464 
0160: 64646060-60404042-4A0E0E0E-0E0E0E0E 
0170: 0A0A0A40-60606070-74747434-34343434 
0180: 10101000-00000404-C4C4C4C4-CCCECECA 
0190: EA6A2A2A-26262626-26060444-44444040 
01A0: 40404040-40410101-0505151D-1D3D3D39 
01B0: 39387070-70505046-46464646-46020202 
01C0: 02020202-06044444-44646464-60606060 
01D0: 2000080C-0C0C0C0C-0C141454-505050D0 
01E0: D0F2F2F6-F6B63626-26262606-06000000 
01F0: 00484848-484D4D4D-4D0D2525-21212121 
0200: 21242404-04040444-54565252-52525252 
0210: 52563636-36363630-20282828-28280848 
0220: 484C4C44-44444444-44404000-00002020 
0230: 24242626-26260642-42424242-42404404 
0240: 141C1C9C-9D9DBDB9-B9B9F8F0-70545454 
0250: 44444444-04040002-02020202-02626262 
0260: 66666664-2C2C2828-08080808-00000044 
0270: 44444444-44444424-20202030-30303636 
0280: 56565652-52525A4A-0A0A0A0C-0C0C0404 
0290: 24646460-60606061-61418181-85858484 
02A0: 848484C4-C4C44446-46426262-6A6A2A2A 
02B0: 2A3A1C1C-1C141414-14141454-54505050 
02C0: 50505050-54446424-24202022-2222020E 
02D0: 0E0E0E4E-4E4E4642-42404000-00000404 
02E0: 04242420-20303030-71717151-5557575F 
02F0: 5F5F0B0B-0A0A0A00-04040424-24646460 
0300: 60606060-6464E484-84848484-848480C0 
0310: C0C84A4A-4E4E4E5E-7E3E3636-36323232 
0320: 30300040-44444444-44440400-00000000 
0330: 00000004-44646464-60606A6A-2A2A0E0E 
0340: 0F0F0F17-17171551-51505050-50141414 
0350: 14342424-24202020-20202000-40444C4C 
0360: 4E4E4E4E-4A4A4242-42828484-A4A4A4A0 
0370: A0A02020-40404454-54545450-10101818 
0380: 181C1C1C-0C0C0606-22222262-62666666 
0390: 64646404-04040400-00000000-00000041 
03A0: 4D4D4D4D-5C7C7C3C-34303032-32323212 
03B0: 06060646-46444040-40404040-40400424 
03C0: 24242424-24202028-08080808-48404444 
03D0: 44C4C6C2-C2929292-92163636-36363230 
03E0: 20206060-64444444-44444000-08080808 
03F0: 28282820-20202424-04444442-42434343 
0400: 43031313-16161616-14343474-74747470 
0410: 70684848-0C0C0C0C-0C0C0C00-00004040 
0420: 40646464-64642626-22222222-22220206 
0430: 46464646-42480808-0888989C-9C9C9CF4 
0440: F4F0F070-70706060-60242424-04040501 
0450: 01010143-43434246-666E6E6E-2E2E2E28 
0460: 28080808-08004444-44444454-50505010 
0470: 30303434-34242626-26060642-424A4A4A 
0480: 4A4A4A0E-04040404-24202020-20202020 
0490: 24646464-44404040-00001010-1014141F 
04A0: 1F5F5F7B-7B7B7B7B-622222A2-80848484 
04B0: 84840400-00004040-44444444-44446060 
04C0: 60202828-282C2C2C-3C3C3C36-56525252 
04D0: 52525252-52121614-04042420-20202020 
04E0: 20206064-6464444D-4D490909-09090904 
04F0: 04040404-06060602-02626262-62626664 
0500: 74747474-54541414-10101090-9098988C 
0510: 8C8C8CEC-EC6C6860-60202020-20242626 
0520: 26262606-02424242-42424242-44040404 
0530: 04243030-30303838-397D7D7D-7D5D5541 
0540: 40000000-00000000-06060666-66666262 
0550: 6262626A-2E0C0C0C-0C0C0808-00004040 
0560: 44444454-54545410-30303030-B0B4B4B4 
0570: B4B686C6-C6CECE4A-4A4A4A4A-4A4A0A26 
0580: 26242424-25252521-41414141-41404044 
0590: 04040404-04000020-60707070-707A7A1A 
05A0: 1A1E1E1E-1E1E1604-04444440-40404040 
05B0: 40400424-24242424-24244444-40404040 
05C0: 40080A0A-0E0E0E0E-0E0E0E42-42434341 
05D0: 61617575-757534B4-94909090-9090D0D0 
05E0: D0C04040-40646424-242C2E2A-2A2A2A2A 
05F0: 2A0A0A0E-0E464646-46444440-40000000 
0600: 20202024-24242424-64445050-50585858 
0610: 1C1C1C1C-16161606-07072723-23232323 
0620: 63606464-44444444-4C0C0C08-08080808 
0630: 08040404-64646464-64606060-00101092 
0640: 92929696-96961616-16464642-62626268 
0650: 28282828-2C0C0C0C-0C0C0444-40404040 
0660: 40000000-04040424-24242033-33333373 
0670: 77775757-5F5E5C18-18080808-08000004 
0680: 44446464-64602020-20200000-00040404 
0690: 44444448-4A4A4A4A-4A5A5E36-36363636 
06A0: 32222020-A0C0C0C4-C4C4C4C4-C4C4C0C0 
06B0: 80800000-00000404-2C2C2E6E-6A6B6B6B 
06C0: 6B636767-67260606-04000000-00101414 
06D0: 14141414-54545474-70606068-68682828 
06E0: 28280C0C-04060606-06020242-42424266 
06F0: 64646464-24242020-20202020-38585C5C 
0700: 5C5C5C50-D0D0D0D0-D0848484-A6262626 
0710: 26666363-63434307-07060604-04000000 
0720: 00080808-4C4C6C64-64602020-20243434 
0730: 34141414-54545454-52525212-02020206 
0740: 06060606-2A2A6868-68686868-68642404 
0750: 04040404-04000000-40404042-46464676 
0760: 76363232-32323030-10189CDC-DCDDCDCD 
0770: CDC5C101-00002020-20202424-24666666 
0780: 46424242-42424242-42080C0C-0C0C0C0C 
0790: 2C2C3C34-34747070-70505050-44444404 
07A0: 06060606-02020202-02024260-6060646C 
07B0: 6C2C2C2C-08080800-00000000-40404444 
07C0: 44444444-44427233-33333333-333736B6 
07D0: 9696D6C0-C0C0C0C8-48484C4C-0C0C0424 
07E0: 20202020-20202464-64646464-40404000 
07F0: 00000206-0E0E0E0E-0A1A1A1A-7A7A7A72 
0800: 72767676-66242404-04040400-00000000 
0810: 00000444-44444444-44646060-28282828 
0820: 292B2F2F-2F272707-57565250-50505050 
0830: 14141414-14242020-A0A0E0E0-E0E4E4E4 
0840: 0C0C0C0C-0C0C0808-0A0A4242-42424246 
0850: 46062626-24242424-24301050-50505050 
0860: 54545454-545C0C0C-08080828-2A2A2A22 
0870: 62666666-66666666-42000000-00010505 
0880: 05050545-41404040-40606474-34343438 
0890: 38381A1A-1A1E0686-C6C6C6C6-C6C2C2C0 
08A0: C0002020-24242424-24246440-40404040 
08B0: 4044444C-0C0C0808-08082820-20203434 
08C0: 76767676-76725252-12121204-04040404 
08D0: 04050149-49494969-6D6D6D24-24242424 
08E0: 00000000-40404040-46460606-06262222 
08F0: 32327272-7AFAFEDE-DEDE9E9E-90808080 
0900: 80800004-04040404-04444040-60606060 
0910: 24242424-24040446-464E4A4A-4A4A0A0A 
0920: 0A062624-34343434-70705050-51515555 
0930: 55454544-00000000-00000000-00060E2E 
0940: 6E6E6E6A-6A6A6A22-22200404-04040404 
0950: 00404040-40444454-54541434-34303030 
0960: B0B0A0A0-A4ACECCC-CE4E4A4A-4A020202 
0970: 02020606-06262620-20206060-60614545 
0980: 45050504-14141410-18181858-585C5C5C 
0990: 74766626-26222222-22222222-22424646 
09A0: 44444404-04040400-00080808-4868686C 
09B0: 6C6C6C64-64747476-36121292-92929296 
09C0: 96969414-54544444-40404028-28282828 
09D0: 282C2D25-05050101-01014140-40444446 
09E0: 46060626-26263232-32301010-10545C5C 
09F0: 5C5C4C48-48480800-20242424-24246464 
0A00: 64606060-60000004-04040606-06020202 
0A10: 02024242-52565676-7C7C7838-38382828 
0A20: 20200101-050505C5-C5C5C5C5-C5C4C480 
0A30: 82828202-0A2E2E2E-2E2E2C68-68686060 
0A40: 74747454-54101010-10100000-00040404 
0A50: 44444444-60606062-62222222-2A2E0E0E 
0A60: 0E0E0E06-04000000-00004040-40505454 
0A70: 54141434-35353131-31313131-35754646 
0A80: 4646CA8A-8A8A8A8A-8A8A8284-84044444 
0A90: 44444464-60606060-60202424-24243414 
0AA0: 141C1C18-185A5A5A-5A5A5646-46464606 
0AB0: 06062020-20202020-24242464-64444440 
0AC0: 40404000-0008080A-0E0E0E0E-2E266662 
0AD0: 70707071-71717515-15151514-10101000 
0AE0: 00000404-44444464-646E6E6E-6AEAEAEA 
0AF0: 8A8A8E8E-84040404-04040444-40606060 
0B00: 70703030-30303414-14141454-44444242 
0B10: 4242020A-0A0A0A0E-2C2C2C2C-64646464 
0B20: 64646465-45010101-01010101-10141414 
0B30: 14145656-72727A7A-6A6A2A2A-2E2E2E0C 
0B40: 04040404-44404040-40C0C0C0-C0C0C084 
0B50: 84A42424-24242420-20604040-42424252 
0B60: 56161616-1E1E1A1A-18184848-4C6C6C64 
0B70: 64242420-20202020-20204445-45454747 
0B80: 47464642-02020202-02060E0E-2E6E6C6C 
0B90: 6C686860-30303010-14141414-14141050 
0BA0: 50404044-44444406-06060202-02022A2A 
0BB0: 6E6E6E6E-E4E4A0A0-A0A08080-00000404 
0BC0: 04044444-44444040-50101010-14151535 
0BD0: 3737373F-3F3F2B2A-6A6A6848-40404444 
0BE0: 44444444-00000000-20202024-24242464 
0BF0: 64644444-4444440E-0A0A0A1A-1E1E1E16 
0C00: 16565656-44406060-60606060-60242404 
0C10: 84848484-8480C0C0-40484848-4C0C2C2C 
0C20: 2E262622-22232323-23236357-54545454 
0C30: 54545410-10101010-10000000-04246464 
0C40: 6C6C6C68-68282A2A-02020206-06464444 
0C50: 44444440-40000000-20202424-24247474 
0C60: 74545454-50505818-181A9A9A-9E9E8E8E 
0C70: 8A8AE2E2-62606024-24242404-04000101 
0C80: 01010145-45454545-44646060-60202026 
0C90: 2E0E1E1E-1E1E1E1A-1A1A1818-18404040 
0CA0: 40446464-24242020-20202020-00040404 
0CB0: 44444444-46464242-0A2A2A2A-2A2A2A22 
0CC0: 20242474-54555151-51515111-01000484 
0CD0: 84A4A4A4-A4202068-68684848-484E0E0E 
0CE0: 0E060202-02020242-42404040-44444444 
0CF0: 04042020-30303078-78787C5C-5C5C5C1C 
0D00: 14100202-02020202-02064666-66666262 
0D10: 62220200-01010105-05454544-44404048 
0D20: 48484C0C-2C2C2C2C-34343010-90D0D0D0 
0D30: D2D2D2D2-16161626-26262020-20202000 
0D40: 00404044-44444444-04040808-28282828 
0D50: 28282064-64465656-56561612-12121210 
0D60: 14141414-74646060-60606064-640C0D0D 
0D70: 0D0D0909-09030302-06464646-46666662 
0D80: 62606060-30303014-14141414-14141414 
0D90: 40404040-404C6C6C-2CACACAC-ACACA822 
0DA0: 22220202-42424646-46464644-40000000 
0DB0: 00002024-24242424-20606061-61415555 
0DC0: 5D1D1C1C-18181818-10101252-52524266 
0DD0: 66662626-26262222-20000000-00000008 
0DE0: 084C4C4C-4C4C4C4C-4C484800-00202022 
0DF0: 26262626-A6A6C6C6-C2D25252-52521614 
0E00: 14141419-19192929-29696464-64646404 
0E10: 00000000-00000000-44464646-46424262 
0E20: 222A2A2E-2E2E0C0C-08081818-18505454 
0E30: 54545454-54501000-00202424-24242464 
0E40: 64646262-424A4A0A-0A0A0F0F-0F070504 
0E50: 04444444-446060E0-E0A0A0A0-B0B4B4B4 
0E60: 94949494-10105050-544E4E4E-4E4E6E2A 
0E70: 22222222-22222246-46464444-44444000 
0E80: 00000000-00000024-6C6C6C6C-6C686860 
0E90: 60301212-12161616-16161616-52525041 
0EA0: 41414545-45444420-20202020-20282828 
0EB0: 2C2C6E4E-4E464242-42420202-02060606 
0EC0: 06043430-303030F0-F0F4F4F4-F4E4CCCC 
0ED0: 8C8C8888-08080808-04044646-66666262 
0EE0: 62626262-66262606-06040405-05050101 
0EF0: 01011155-5454545C-78787878-3828282C 
0F00: 2C2C0404-04044444-46464642-42420222 
0F10: 22222222-22222626-24246464-44444858 
0F20: 58585858-D8D89C94-94949410-50507070 
0F30: 60646464-64646022-22030B0B-0B0F0F0F 
0F40: 0E060604-40404040-60646464-64242424 
0F50: 24200000-00001010-14545454-54505050 
0F60: 52524242-62222A2A-2A2A2A2E-2E2E2604 
0F70: 44404040-40404040-40000404-04242424 
0F80: 24202060-60707171-F1F5DDDF-DF9F9E9E 
0F90: 9A121202-02020644-44444444-44404060 
0FA0: 60602020-24242C2C-2C2C0C48-48484040 
0FB0: 40400202-02020606-06161616-36363070 
0FC0: 70707070-70703014-04040C0C-0C080808 
0FD0: 48484C44-46464642-62636363-23232525 
0FE0: 25250505-44404040-40505054-14141414 
0FF0: 9C9CBCBC-BCB8B8A8-E0E2E2C2-C6460606 

   При  прогоне  программы  в отладчике ей
подставляется  отладочная  команда  чтения
канала  0, после чего ставится точка оста-
нова и вызывается обработчик данной коман-
ды (рис.5.3.2).

[прим.издателей: здесь  был  рабочий экран 
монитора-отладчика  в альбомном расположе- 
нии, см.графический материал] 

    Рис.5.3.2. Отладка программы СЛА
    с помощью отладчика Debugger-51.

   Выделенная  область  памяти, содержащая
данные  ответного  сообщения программы СЛА
(компрессированные данные  канала 0 ),сре-
дствами  отладчика   сохраняется   в  файл 
result.bin, после чего полученный файл те- 
стируется  на  корректность и соответствие
сгенерированному сигналу программой Signal 
generator (рис. 5.3.3). 

 ▒▒ Signal generator ▒▒▒▒▒▒▒▒ [_][O][X]
 ╟────────────────────────────────────╢
 ║ ┌────┐┌──────┐┌────┐┌──────┐┌────┐ ║
 ║ ┘    └┘      └┘    └┘      └┘    └ ║
 ║ ┐┌┐┌─┐┌┐ ┌┐┌┐┌─┐┌┐┌┐┌┐ ┌┐┌┐┌┐┌─┐┌┐ ║
 ║ └┘└┘ └┘└─┘└┘└┘ └┘└┘└┘└─┘└┘└┘└┘ └┘└ ║
 ║ ─┐┌┐┌─┐ ┌┐ ┌─┐ ┌┐┌─┐┌┐┌┐┌─┐ ┌─┐┌─┐ ║
 ║  └┘└┘ └─┘└─┘ └─┘└┘ └┘└┘└┘ └─┘ └┘ └ ║
 ║ ┐ ┌┐┌─┐┌─┐ ┌─┐ ┌─┐┌─┐ ┌┐ ┌─┐┌─┐ ┌─ ║
 ║ └─┘└┘ └┘ └─┘ └─┘ └┘ └─┘└─┘ └┘ └─┘  ║
 ║ ┐┌─┐┌─┐┌─┐┌──┐ ┌─┐┌──┐┌─┐┌┐┌─┐┌─┐┌ ║
 ║ └┘ └┘ └┘ └┘  └─┘ └┘  └┘ └┘└┘ └┘ └┘ ║
 ║ ┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌┐┌ ║
 ║ └┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘└┘ ║
 ║  ┌─┐ ┌──┐ ┌─┐ ┌──┐ ┌┐ ┌─┐ ┌─┐ ┌──┐ ║
 ║ ─┘ └─┘  └─┘ └─┘  └─┘└─┘ └─┘ └─┘  └ ║
 ║ ─┐┌─────┐┌───┐┌───┐┌────┐┌────┐┌── ║
 ║  └┘     └┘   └┘   └┘    └┘    └┘   ║
 ║ ┐┌────┐┌─────┐┌────┐┌─────┐┌────┐┌ ║
 ║ └┘    └┘     └┘    └┘     └┘    └┘ ║
  ║▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒█████║
 ╟────────────────────────────────────╢
 [Generate] Seed= [2]  tested ok [Test]
 ╙────────────────────────────────────╜

    Рис.5.3.3. Проверка содержимого
        ответного сообщения СЛА.

   При тестировании распознаётся метод ко-
дирования, указанный в поле данных ОС,дан-
ные  канала  декомпрессируются, после чего
происходит сравнение распакованного сигна-
ла (на рисунке - нижний) и исходного кана-
ла 0 (на рисунке - верхний).

────────────────────────────────────────── 

       5.4. Описание работы с СЛА

   Программа предназначена для автоматиза-
ции процесса наладки приборов,подключенных
к шине типа ММИ. Устройство  рассчитано на
использование внутри предприятия.Ниже при-
ведено  описание основных требований к ин-
терфейсу системы СЛА - ПЭВМ [16]:

   Для  работы  СЛА  необходима ПЭВМ обще-
го назначения с установленным  программным
обеспечением обслуживания специализирован-
ного  логического  анализатора, подключен-
ная к СЛА  по последовательному интерфейсу 
RS-232. 
   Программа ПЭВМ (ПУЛА) должна  осуществ-
лять  управление  логическим  анализатором
ММИ (СЛА) по  интерфейсу  RS-232, а  также
прием  и  вывод на экран дисплея временных
диаграмм процессов передачи  информации по
интерфейсу ММИ  при настройке аппаратуры и
локализации отказов. Она должна также обе-
спечивать  чтение  и  запись в/из файла на
магнитном диске результатов измерения из/в
рабочего  буфера  совместно  с параметрами
запуска и измерения.
   Запуск  измерения ЛА должен инициирова-
ться с клавиатуры ПЭВМ.При запуске измере-
ния ПУЛА должна выполнять следующую после-
довательность действий:

 ■ останов измерения от предыдущего запу- 
ска выдачей  на ЛА команды &#60;Остановить из- 
мерение&#62;; 
 ■ гашение на дисплее временной диаграммы 
от предыдущего измерения; 
 ■ запуск  измерения  выдачей на ЛА кадра 
параметров командой &#60;Запустить измерение&#62;; 
 ■ циклический  опрос  байта состояния из 
ЛА с  помощью  запросов &#60;Читать  состояние 
ЛА&#62; (с выводом на  экран) до окончания из- 
мерения  или  до вмешательства оператора с 
клавиатуры  ПЭВМ  с выдачей  на ЛА команды 
&#60;Остановить измерение&#62;; 
 ■ при  успешном  завершении  измерения - 
прием из ЛА результатов измерения запроса- 
ми &#60;Читать канал&#62; последовательно по заде- 
йствованным каналам в рабочий буфер, с по- 
следующим выводом на экран или в файл. 

   ПУЛА должна обеспечивать инициируемую с
клавиатуры  установку в исходное состояние
ЛА выдачей по интерфейсу на ЛА команды ус-
тановки в исходное с последующим приемом и
индикацией байта состояния ЛА.
   Самоконтроль  ЛА  может  запускаться по
командам  оператора ПЭВМ с последующей ин-
дикацией результатов на дисплее.С ПЭВМ до-
лжна подаваться команда &#60;Запустить самоко- 
нтроль ЛА&#62; и запрос &#60;Читать состояние ЛА&#62;, 
приведенные в разделе 3.3.
   ЛА может быть  подключен к ПЭВМ для ра-
боты  в одномашинном  и двухмашинном режи-
мах.Одномашинным является режим работы,ко-
гда одна и та же ПЭВМ  производит управле-
ние комплексом устройств и снимает резуль-
таты измерения. В двухмашинном режиме одна
из ПЭВМ  осуществляет контроль, а другая -
снимает результаты измерения с ЛА.

   При  работе в одномашинном режиме взаи-
модействие ПУЛА и программы контроля может
осуществляться в следующем порядке:

 ■ снимается питание с АКИА и с ЛА;
 ■ подается питание на ПЭВМ;
 ■ вызывается ПУЛА, задается тип устройс- 
тва и запрашивается тип  средств  коммута- 
ции; 
 ■ в аппаратуру на место заданного устро- 
йства устанавливается ЛА с требуемым типом 
средств  коммутации и с заданным устройст- 
вом; 
 ■ подается питание на ЛА;
 ■ средствами  ПУЛА  ЛА устанавливается в 
исходное  состояние и контролируется соот- 
ветствие типа средств коммутации заданному 
типу устройства; 
 ■ подается питание на АКИА;
 ■ средствами ПУЛА задаются параметры за- 
пуска и измерения ЛА  и осуществляется за- 
пуск измерения ЛА в однократном режиме. 
 ■ выполняется выход из ПУЛА в ДОС;
 ■ вызывается и запускается программа ко- 
нтроля АКИА; 
 ■ осуществляется останов программы конт- 
роля и выход из нее в ДОС; 
 ■ вызывается ПУЛА без нарушения  состоя- 
ния ЛА; 
 ■ средствами ПУЛА опрашивается состояние 
ЛА и, если запуск состоялся,принимаются из 
ЛА и выводятся на экран результаты измере- 
ния. 

   При  работе в двухмашинном режиме взаи-
модействие ПУЛА и программы контроля может
осуществляться в следующем порядке:

 ■ снимается питание с АКИА и с ЛА;
 ■ подается  питание  на  вспомогательную 
ПЭВМ с установленной ПУЛА; 
 ■ вызывается ПУЛА,задается тип устройст- 
ва и запрашивается тип средств коммутации; 
 ■ в аппаратуру на место заданного устро- 
йства устанавливается ЛА с требуемым типом 
средств  коммутации и с заданным устройст- 
ва; 
 ■ подается питание на ЛА;
 ■ средствами  ПУЛА  ЛА устанавливается в 
исходное состояние и контролируется  соот- 
ветствие типа средств коммутации заданному 
типу устройства; 
 ■ подается питание на АКИА;
 ■ средствами ПУЛА задаются параметры за- 
пуска  и измерения ЛА и осуществляется за- 
пуск измерения ЛА в однократном режиме или 
в периодическом режиме; 
 ■ вызывается и запускается программа ко- 
нтроля АКИА; 
 ■ средствами ПУЛА опрашивается состояние 
ЛА и, если запуск состоялся,принимаются из 
ЛА и выводятся на экран результаты измере- 
ния. 

   Одновременный (двухмашинный) режим  ра-
боты может быть реализован на одной ПЭВМ с
установленной  многозадачной  операционной
системой, такой как MS Windows.

────────────────────────────────────────── 

         6. Экономическая часть

6.1. Определение трудоёмкости разработки
         программного продукта

   Разрабатываемый программный продукт от-
носится  к подсистеме &#60;Управление  качест-
вом&#62;.
   Исходные данные для расчёта:

 ■ количество разновидностей форм входной 
информации: 2 (в том числе переменной: 2); 
 ■ количество разновидностей  форм выход- 
ной информации: 2; 
 ■ степень новизны  разрабатываемой зада- 
чи: В (разработка проекта с использованием 
типовых  проектных  решений при условии их 
изменения;разработка проектов,имеющих ана- 
логичные решения); 
 ■ сложность  алгоритма: 1 (алгоритмы оп- 
тимизации и моделирования систем  и объек- 
тов); 
 ■ сложность организации контроля входной 
информации: группа  12 (входные  данные  и 
документы однообразной формы и содержания, 
осуществляется формальный контроль); 
 ■ сложность организации  контроля выход- 
ной информации: группа 22 (печать докумен- 
тов однообразной формы и содержания, вывод 
массивов данных на магнитные носители); 

   Программный продукт разработан в кросс-
средах  программирования  для  процессоров
типа MCS-51: редактор-транслятор Asm51Edit 
2 и отладчик Debugger-51, на языке АССЕМБ- 
ЛЕР,с использованием типовых проектных ре-
шений и стандартных модулей  в объёме 20%.
Разработка  проекта велась в режиме работы
в реальном времени.

   При расчёте  норм времени в зависимости
от  исходных  данных  для  расчёта следует
применять  соответствующие поправочные ко-
эффициенты.  [13]  Далее  приведён  список
значений этих коэффициентов.
  
1. Разработка технического задания: 
 ■ для  разработчика  постановки  задачи:
0,65;
 ■ для разработчика программного  обеспе-
чения: 0,35. 
2. Разработка эскизного проекта: 
 ■ для  разработчика  постановки  задачи:
0,7;
 ■ для разработчика  программного обеспе-
чения: 0,3. 
3. Разработка технического проекта. 

           1·2
      K  = ───·1·1,26·0,85 ў 1,07.
       общ  2

4. Разработка рабочего проекта. 

       1,20·2
   K  = ──────·1·1,32·1,15·0,8 ў 1,468.
   общ    2

5. Внедрение. 

        K  = 1·1·1,21·0,8 = 0,968.
        общ

   Для  учета  применения  ПЭВМ в процессе
проектирования  вводятся поправочные коэф-
фициенты:

 ■ для расчёта  трудоёмкости (для  стадий 
ТП, РП, внедрение): 0,6; 
 ■ для расчёта затрат  машинного времени: 
1,32. 

   Поскольку типовые нормы времени на про-
граммирование задач для ЭВМ были рассчита-
ны для устаревших средств разработки ПО,то
во все  используемые  коэффициенты следует
внести поправочный коэффициент 0,6.

   Определим  трудоёмкость по стадиям раз-
работки проекта.Результаты расчётов приве-
дены в таблице 6.1.1.

                            Таблица 6.1.1 
┌──────────────┬───────┬────────┬────────┐ 
│    Стадия    │Затраты│Поправо-│ Затраты│ 
│  разработки  │времени│  чный  │ времени│ 
│   проекта    │ чел.- │ коэффи-│с учётом│ 
│              │  дни  │ циент  │п.коэфф.│ 
├──┬───────────┼───────┼────────┼────────┤ 
│  │Разработчик│       │        │        │ 
│  │постановки │       │0,65·0,6│   12   │ 
│  │задачи     │       │        │        │ 
│ТЗ├───────────┤   31  ├────────┼────────┤ 
│  │Разработчик│       │        │        │ 
│  │ПО         │       │0,35·0,6│    7   │ 
├──┼───────────┼───────┼────────┼────────┤ 
│  │Разработчик│       │        │        │ 
│  │постановки │       │0,7·0,6 │   27   │ 
│  │задачи     │       │        │        │ 
│ЭП├───────────┤   67  ├────────┼────────┤ 
│  │Разработчик│       │        │        │ 
│  │ПО         │       │0,3·0,6 │   12   │ 
├──┼───────────┼───────┼────────┼────────┤ 
│  │Разработчик│       │        │        │ 
│  │постановки │   57  │ 1,07x  │   21   │ 
│  │задачи     │       │x0,6·0,6│        │ 
│ТП├───────────┼───────┼────────┼────────┤ 
│  │Разработчик│       │ 1,07x  │        │ 
│  │ПО         │   21  │x0,6·0,6│    8   │ 
├──┼───────────┼───────┼────────┼────────┤ 
│  │Разработчик│       │        │        │ 
│  │постановки │   23  │ 1,46x  │   11   │ 
│  │задачи     │       │x0,6·0,6│        │ 
│РП├───────────┼───────┼────────┼────────┤ 
│  │Разработчик│       │ 1,46x  │        │ 
│  │ПО         │  104  │x0,6·0,6│   54   │ 
├──┼───────────┼───────┼────────┼────────┤ 
│В │Разработчик│       │        │        │ 
│н │постановки │   14  │ 0,968x │    5   │ 
│е │задачи     │       │x0,6·0,6│        │ 
│д ├───────────┼───────┼────────┼────────┤ 
│р │Разработчик│       │ 0,968x │        │ 
│. │ПО         │   21  │x0,6·0,6│    7   │ 
├──┴───────────┼───────┼────────┼────────┤ 
│ Всего        │  338  │        │   164  │ 
└──────────────┴───────┴────────┴────────┘ 

   Численность исполнителей рассчитывается
исходя  из планового фонда рабочего време-
ни, который составляет 80 дней,по формуле:

                ТОбщ
            Ч = ──── [чел],
                  Ф

   где ТОбщ - суммарные затраты времени на
всех стадиях разработки; Ф - плановый фонд
рабочего времени.

  ТОбщ=164 чел.-дней, Ф=80 раб. дней.

               164
            Ч = ─── = 2,05 чел.
                80

   Затраты машинного времени составляют:

            33·1,32 ў 44 дня.

────────────────────────────────────────── 

   6.2. Построение ленточного графика

   Ленточный график представляет собой та-
блицу, где  перечислены наименования видов
работ, должности исполнителей,трудоёмкость
и длительность выполнения каждого вида ра-
бот. Продолжением таблицы является график,
отражающий  продолжительность каждого вида
работ в виде отрезков времени,которые рас-
полагаются в соответствии с последователь-
ностью выполнения работ [14].
   Для построения ленточного графика испо-
льзуются следующие исходные данные:

 ■ общая трудоёмкость разработки;
 ■ трудоёмкость отдельных стадий;
 ■ планируемый  срок разработки (80 рабо- 
чих дней); 
 ■ необходимый состав исполнителей (руко- 
водитель, инженер-разработчик). 

 Исходя из полученных в п. 6.1. данных по-
строим ленточный график (рис.6.2.1).

┌───┬──┬─────────────────────────────────┐ 
Ста-Вре- Продолжительность работы,недели │ 
│дия│мя├─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┤ 
разр.ис-1│ │3│ │5│ │7│ │9│ 11│ 13│ 15│ 17│ 
пр-та п│ │2│ │4│ │6│ │8│ 10│ 12│ 14│ 16│ │ 
├───┼──┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ 
│ТЗ │ 9│5│4│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ 
│ЭП │19│ │1│5│4│5│4│ │ │ │ │ │ │ │ │ │ │ │ 
│ТП │14│ │ │ │ │ │1│5│5│3│ │ │ │ │ │ │ │ │ 
│РП │32│ │ │ │ │ │ │ │ │2│5│6│2│3│6│5│3│ │ 
Внед. 6│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │2│4│ 
├───┼──┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤ 
Всего80│5│5│5│4│5│5│5│5│5│5│6│2│3│6│5│5│4│ 
└───┴──┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘ 

     Рис. 6.2.1. Ленточный график.

────────────────────────────────────────── 

  6.3. Составление сметы на разработку

   Себестоимость   программного   продукта
складывается из следующих видов затрат:

1. заработная  плата разработчиков (услов- 
ная,принятая за основу на предприятии) за
80 рабочих дней, с учетом занятости руко-
водителя  данным  проектом в 25% времени.
При  этом рабочий месяц  приравнивается к
21 рабочему дню:

 (5000·0,25+3100)·80/21 = 13059,52 руб;

2. дополнительная  заработная плата разра- 
 ботчиков,составляющая 10% от суммы пункта
1:

      13059,52·0,10 = 1305,95 руб;

3. отчисления на социальные нужды, состав- 
ляющие 36% от суммы пунктов 1 и 2:

 0,36·(13059,52+1305,95) = 5171,57 руб;

4. затраты на машинное время: 
 ■ амортизация ЭВМ:
- норма амортизации: 25,3 руб/день;
- эксплуатация ЭВМ длится 44 рабочих дня:

         25,3·44 = 1113,20 руб;

 ■ затраты на электроэнергию:
- мощность ЭВМ: 0,2 кВт;
- эксплуатация ЭВМ длится 44 рабочих дня;
- рабочий день составляет 8 часов;
- стоимость 1 кВт-часа электроэнергии рав-
на 0,89 руб:

       448·0,2·0,89 = 62,66 руб;

 ■ затраты на программное обеспечение:
- используемые средства разработки созданы
на предприятии;
- на ЭВМ установлена ОС Windows'98;
- срок амортизации ОС: 2 года;
- эксплуатация ЭВМ длится 44 рабочих дня;
- год включает 250 рабочих дней;
- стоимость дистрибутива ОС: 3100 руб;
- поскольку  данная  ОС  используется  для
других задач, кроме разработки ПО СЛА, то
вводится   коэффициент  использования  ОС
проектировщиками СЛА, равный 0,5:

        44
      ─────·3100·0,5 = 136,40 руб;
      250·2

   Себестоимость программного продукта:

   13059,52+1305,95+5171,57+1113,20+
     +62,66+136,40 = 20849,30 руб.

Уровень рентабельности программного проду-
кта  закладывается  предприятием на уровне 
25% от себестоимости: 

      20849,30·0,25 = 5212,32 руб.

   В цену  программного продукта включают-
ся:
 ■ себестоимость (20849,30 руб);
 ■ рентабельность (5212,32 руб);
 ■ налог на добавленную стоимость (20%):

 0,2·(20849,30+5212,32) = 5212,32 руб.

   Таким образом, цена программного проду-
кта составит:
                          ┌─────────────┐
20849,30+5212,32+5212,32 =│31273,94 руб.│
                          └─────────────┘ 
────────────────────────────────────────── 

      6.4. Выводы по экономической
  эффективности программного продукта

   Внедрение  разработанного  программного
продукта позволит:

 ■ повысить  качество, объём, технический 
уровень  и скорость  выполняемых с помощью 
программы работ; 
 ■ увеличить объёмы и сократить сроки пе- 
реработки информации; 
 ■ улучшить показатели  основной деятель- 
ности предприятия. 

   Расчёт  по  экономической эффективности
представлен в таблице 6.4.1.

                           Таблица 6.4.1. 
┌──────────────┬────────────┬────────────┐ 
│              │   Ручная   │  Наладка с │ 
│              │  наладка   │ помощью СЛА│ 
├──────────────┼────────────┼────────────┤ 
│Трудоёмкость  │            │            │ 
│решения одной │            │            │ 
│задачи,       │     25     │      3     │ 
│чел.-час.     │            │            │ 
├──────────────┼────────────┼────────────┤ 
│Количество    │            │            │ 
│задач, решае- │     50     │     50     │ 
│мых за год    │            │            │ 
├──────────────┼────────────┼────────────┤ 
│Часовая ста-  │            │            │ 
│вка, руб.     │     15     │     15     │ 
├──────────────┼────────────┼────────────┤ 
│Стоимость ча- │            │            │ 
│са машинного  │     -      │    25,3    │ 
│времени, руб. │            │            │ 
├──────────────┼────────────┼────────────┤ 
│Затраты при   │            │            │ 
│расчёте       │ 25·50·15 = │3·(15+25,3)x│ 
│за год, руб.  │   = 30000  │ x50 = 6045 │ 
└──────────────┴────────────┴────────────┘ 

   Годовая экономия:

        30000-6045 = 23955 руб.

   Срок окупаемости:

    31273,94
    ──────── ў 1,3 года ў 16 месяцев.
      23955


