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

          JNZ USUAL            

          CLR INITC            

USUAL:    CALL SENDD       ;Послать свои данные в сеть

          INC CURRENT      ;Послать маркер следующему

          CALL SENDM           

          JBC ANSWER,WORK  ;Если был ответ, то переход на
;нормальную работу. Иначе, нужно проверить, не имеет ли
;данный контроллер номер, равный числу контроллеров в сети –1.
;Если это так, то это значит, что всё в порядке и новых
;контроллеров в сети не появилось и можно передавать маркер
;контроллеру с номером 0. Если это не так, то это значит, что
;следующий по номеру контроллер «потерялся» и необходимо
;переопределить номера контроллеров в сети

          MOV A,QUANT            

          DEC A

          CJNE A,NUMBER,ABAND  

          MOV CURRENT,#0   ;Если данный контроллер                          ;последний в сети                 

          CALL SENDM           

          JMP WORK

;Обработка ситуации пропажи из сети какого-то контроллера

ABAND:    DEC QUANT        ;Если кто-то пропал, значит,
;количество контроллеров в сети уменьшилось

          MOV A,NUMBER

          JZ IAMHERE       ;Если номер данного контроллера
;равен 0, то он имеет право начать круг инициализации

          SUBB A,CURRENT   ;Если номер пропавшего
;контроллера, больше, чем идентификационный номер текущего контроллера, то флаг C=1 и можно начинать нормальную работу

          JC WORK              

          DEC NUMBER            ;Иначе необходимо
;уменьшить номер данного микроконтроллера

          MOV A,NUMBER

          JZ IAMHERE       ;Если номер контроллера 0, то
;он имеет право начинать круг инициализации

          JMP WORK         ;Иначе – начало нормальной
;работы

;Действия, производимые контроллером, который после
;проведённых действий оказался обладателем номера 0 

IAMHERE:  MOV CURRENT,#1   ;Необходимо послать маркер
;контроллеру №1, предварительно установив признак цикла
;инициализации:

          SETB INITC     

          CALL SENDM

          JMP WORK

3.3 Описание подпрограмм

Подпрограмма WWBT: Wait While Byte is Transferring.
Данная подпрограмма производит ожидание окончания передачи
байта  УАПП. Для этого анализируется флаг прерывания передатчика в регистре SCON

WWBT:     JBC SCON.1,ENDWWBT    

          JMP WWBT

ENDWWBT:  CLR P1.3         ;Сброс бита  порта 1,
;обеспечивающего управление схемой коммутации передатчика
;с линией связи

          RET

Подпрограмма WAIT производит ожидание какого-либо байта из сети. Ожидание производится в течение времени, указанного в переменной TAU и прерывается либо по истечении этого  времени, либо при переполнении таймера посредством записи в него максимальных значений (эти действия совершает обработчик прерывания от УАПП)

WAIT:     SETB P1.3        ;Подключение передатчика к ЛС

          MOV SCON,#90h    ;Ввод в режиме 2

          MOV TH0,#HIGH(TAU)    ;Загрузка Т/С0

          MOV TL0,#LOW(TAU)

          SETB TCON.4      ;Запуск Т/С0

WLOOP:    JBC TCON.5,ENDWAIT    ;Анализ переполнения Т/С0

          JMP WLOOP            

ENDWAIT:  CLR TCON.4       ;Останов Т/С0

          RET

Подпрограмма SENDM – передача маркера в сеть. Осуществляет формирование маркера и передачу его в ЛС

SENDM:    SETB PSW.3       ;Выбор банка регистров 1

          MOV R0,CURRENT   ;R0<-Номер получателя

          MOV A,QUANT      ;Сколько контроллеров в сети?

          RL A

          RL A

          RL A

          ORL A,R0         ;Загрузка в маркер информации о
;номере получателя и количестве контроллеров в сети

          SETB ACC.7       ;Установка признака маркера

          JNB INITC,NOINIT      ;Это цикл инициализации?

          ORL A,#40h            ;Да!

NOINIT:   MOV SCON,#80h    ;Установка УАПП в режим 0

          JNB PSW.0,BTRANS ;Загрузка бита паритета

          SETB SCON.3      ;Бит паритета будет
;передаваться как 9-й бит

BTRANS:   SETB P1.3        ;Разрешение работы передатчика

          MOV SBUF,A       ;Начало передачи