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
Во время главного рабочего цикла производится постоянное прослушивание линии, составление таблицы данных, контроль выхода из строя или отключения какого-либо контроллера в сети, а также при получении маркера – выдача управляющих воздействий на объект управления.
WORK: CALL WAIT ;Ожидание появления
;какого-либо байта в сети
JNB ANSWER,ABAND ;Если такого байта не было
CLR ANSWER
JNB ISMARKER,WORK ;Ждём маркер для выдачи
;своих данных в сеть, выдачи управляющих воздействий. В это ;время при приходе
каждого байта обработчиком прерывания от
;УАПП производится формирование таблицы данных и обновление
;информации о числе контроллеров в сети и идентификаторе цикла
;(рабочий или инициализация).
MOV A,NUMBER ;Проверка, не адресован ли
;полученный маркер данному микроконтроллеру. Если маркер
;адресован какому-то другому контроллеру, то продолжаем
;обычную работу
CJNE A,CURRENT,WORK
;Если номер контроллера не равен 0, то выполняется
;переход к метке USUAL. Иначе – получение маркера,
;адресованного контроллеру с номером 0 означает, что все
;контроллеры поучаствовали в круге инициализации и последний
;из работающих прислал этот маркер. Значит, данный контроллер
;имеет право сбросить признак круга инициализации
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.