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

MINBYTE1: DS 1             ;Байт с минимальным значением

NOFMIN1:  DS 1             ;Номер владельца этого значения

MINBYTE2: DS 1

NOFMIN2:  DS 1

ANDREZ:   DS 1             ;Результат операции «И» над
                                ;всеми битовыми входными
                                ;значениями

3.2.2 Инициализация

Основная программа начинается с инициализации универсального приёмопередатчика (УАПП), задания маски, приоритетов и векторов прерываний. Так как при включении электропитания содержимое резидентной памяти данных не определено, то необходимо также проинициализировать переменные и таблицу данных. Так как после сброса во все регистры записывается #FFh, то необходимо также сбросить линии порта 1, осуществляющие управление объектом.

          RSEG SEGCODE     ;Начало сегмента кода  

         ORG 0            ;При включении питания

          JMP START        ;запустить основную программу

          ORG 3            ;Прерывание от INT0

          JMP EXTINT       ;Переход на обработчик           

          ORG 1Bh          ;Прерывание от

          JMP T1INT        ;таймера/счётчика

          ORG 23h          ;Прерывание от УАПП

          JMP PCAINT

          ORG 30h          ;Начало основной программы

START:

          MOV P1,#8Fh      ;Снятие управляющих воздействий
                                ;с объекта управления

          MOV IE,#89h      ;Запрет всех прерываний, кроме

                           ;прерываний от

                           ;таймера/счётчика 1 и УАПП

          MOV IP,#10h      ;Высокий приоритет для УАПП

          MOV TMOD,#11h    ;Установка таймеров/счётчиков

                           ;в режим 16-битных таймеров                                        

          MOV IMPCOUNT,#0FFh    ;Инициализация счётчика

                           ;импульсов. Если

;значение этой переменной в процессе работы программы FFh,

;то это значит, что значение числа импульсов за 0,05 с

;ещё не определено и это значение учитываться не будет

          MOV PREPIMP,#0

          MOV TH1,#3Ch     ;Установка ТС1 (0.05с) – время,

          MOV TL1,#0Afh    ;в течение которого

                           ;производится подсчёт числа

                           ;импульсов

               MOV TCON,#40h    ;Запуск таймера 1

;Инициализация переменных:

          CLR ANSWER       ;Ещё никто не отвечал

          MOV NUMBER,#0    ;Собственный номер

          MOV NBYTE,#0     ;Ещё не принимали данных

          MOV CURRENT,#0

          MOV SP,#30h      ;Начальный адрес стека

;Инициализация таблицы данных

          MOV A,#10h       ;Всего 16 байт

INITAB:   MOV R0,A

          MOV A,#TABLE

          ADD A,R0

          XCH A,R0

          MOV @R0,#0FFh    ;Заполняем #0FFh

          DEC A

          JNZ INITAB

3.2.3 Определение собственного номера и начало работы

При включении микроконтроллера он сначала в течение времени 3×t «слушает» сеть. Это необходимо для определения, работала ли сеть до его включения. Значение t определяется как сумма времени, необходимого для передачи байта и времени, необходимого для реагирования контроллера с некоторым запасом. Так как используется частота передачи fрез/64, то время, необходимое для пересылки 11 бит (режим 2) составит:  мкс. С учётом запаса на реагирование микроконтроллера t=70 мкс.

TAU       SET 0FF2Dh       ;TAU=0FFFFh-временная

                           ;задержка (0.210 мс)

          SETB IE.4        ;Разрешение прерываний от УАПП

WHOAMI:   CALL WAIT        ;Начало цикла «Кто я такой?»

                           ;Вызов подпрограммы ожидания

                           ;любого байта в течение 210 мкс

TAU       SET 0FF73h       ;Далее время ожидания 140 мкс      

          JBC ANSWER,INUSE      ;Если установлен флаг

;ANSWER, т.е. сеть уже используется, переход на INUSE.

;Флаг устанавливается обработчиком прерывания от УАПП

          MOV NUMBER,#0    ;Иначе – я номер 0         

          MOV QUANT,#1     ;В сети один контроллер