Разработка контроллера в составе локальной микросети, страница 9

          MOV CURRENT,#1   ;Номер получателя маркера

          SETB INITC       ;Первый круг – инициализация

NOBODY:   CALL SENDM       ;Послать маркер

          CALL WAIT        ;Ожидание ответа

          JNB ANSWER,NOBODY     ;Если никто не ответил

          CLR ANSWER       ;Если был ответ, то на этом

                           ;роль ведущего для данного

                           ;микроконтроллера заканчивается

          JMP WORK         ;Переход к нормальной работе

;Если сеть уже используется, то необходимо занять
;вакантное место (определить, какой номер свободен и присвоить
;его себе) и включиться в работу

INUSE:    CALL WAIT        ;Если в течение 2×t никто не

          JNB ANSWER,WHOAMI     ;ответил, то необходимо
;заново выяснить, используется ли сеть. Т.к. возможно, что
;произошло отключение единственного работающего в сети
;контроллера  и тогда номер данного контроллера будет равен 0

          CLR ANSWER

          JNB ISMARKER,INUSE    ;Если был получен байт
;данных, а не маркер, то продолжаем ожидать. Флаг ISMARKER
;устанавливается обработчиком прерывания от УАПП

TAU       SET 0FFB9h            ;0.070 мс

          CALL WAIT

;Если был принят маркер и в течение 70 мкс никто не
;ответил, то это значит, что в сети нет контроллера с номером,
;который указан в маркере. Это и есть вакантное место. Переход
;на подпрограмму определения номера

          JNB ANSWER,SETNUM

          CLR ANSWER

;Если же ответ был получен, то это значит, что место
;занято и необходимо ожидать следующий маркер

TAU       SET 0FF73h            ;0.140ms

          JMP INUSE

SETNUM:   MOV NUMBER,CURRENT    ;Установка номера

          CALL SENDD               ;Выдача собственных
;данных в сеть. Подпрограмма SENDD также производит снятие
;показаний с датчиков

          MOV CURRENT,NUMBER       ;Далее необходимо
;отправить маркер следующему по порядку контроллеру (с номером
;NUMBER+1)

          INC CURRENT

          INC QUANT        ;Прежнее значение количества
;работающих контроллеров было получено вместе с маркером и с
;появлением нового контроллера увеличилось на единицу

          CALL SENDM

TAU       SET 0FF73h            ;0.140 мс

          CALL WAIT

          JBC ANSWER,WORK       ;Если на маркер получен
;ответ, то всё в порядке и можно начинать обычную работу

          MOV CURRENT,#0        ;Иначе, если ответа не
;было, то необходимо передать управление контроллеру №0

          CALL SENDM

          JNB ANSWER,ABAND         ;Если контроллер №0 по
;какой-то причине не смог ответить (возможно, вышел из строя),
;то необходимо произвести соответствующие действия
;(переопределить номера контроллеров и тогда новый контроллер
;№0 выдаст новый маркер)

          CLR ANSWER

3.2.4 Главный рабочий цикл

Во время главного рабочего цикла производится постоянное прослушивание линии, составление таблицы данных, контроль выхода из строя или отключения какого-либо контроллера в сети, а также при получении маркера – выдача управляющих воздействий на объект управления.

WORK:     CALL WAIT        ;Ожидание появления
                                ;какого-либо байта в сети

          JNB ANSWER,ABAND ;Если такого байта не было

          CLR ANSWER

          JNB ISMARKER,WORK        ;Ждём маркер для выдачи
;своих данных в сеть, выдачи управляющих воздействий. В это ;время при приходе каждого байта обработчиком прерывания от
;УАПП производится формирование таблицы данных и обновление
;информации о числе контроллеров в сети и идентификаторе цикла
;(рабочий или инициализация).

          MOV A,NUMBER     ;Проверка, не адресован ли
;полученный маркер данному микроконтроллеру. Если маркер
;адресован какому-то другому контроллеру, то продолжаем
;обычную работу

          CJNE A,CURRENT,WORK  

;Если номер контроллера не равен 0, то выполняется
;переход к метке USUAL. Иначе – получение маркера,
;адресованного контроллеру с номером 0 означает, что все
;контроллеры поучаствовали в круге инициализации и последний
;из работающих прислал этот маркер. Значит, данный контроллер
;имеет право сбросить признак круга инициализации