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

          ANL A,#40h      ;Сохраняем только битовое
                                ;значение

          ANL A,ANDREZ    

          MOV ANDREZ,A     

          MOV A,@R0         

          ANL A,#3Fh       ;Сохраняем только
                                ;значение частоты

          MOV R2,A         

          SUBB A,MINBYTE1 ;Определение, минимальный ли
                                ;байт

          JNC BYTE2            

          MOV MINBYTE1,R2                

          MOV A,R3

          DEC A

          MOV NOFMIN1,A

BYTE2:    INC R0

          MOV A,@R0       ;Второй байт

          MOV R4,A

          SUBB A,MINBYTE2

          JNC NOTMIN

          MOV MINBYTE2,R4

          MOV A,R3

          DEC A

          MOV NOFMIN2,A

NOTMIN:   DEC R3

          CJNE R3,#0,ANALYZE       ;Цикл пока не
                                       ;обработаем все данные

          MOV A,NOFMIN1

          CJNE A,NUMBER,NOACT      ;Сравнение номера
;обладателя минимальной частоты с собственным номером и, если
;эти значения совпадают, выдать управляющие воздействия

          SETB P1.4             

          JMP BITACT            

NOACT:    CLR P1.4

BITACT:   MOV A,ANDREZ

          CJNE A,#40h,BNOACT       ;Если результат
;операции логического умножения равен единице, то выдаём
;управляющие воздействия, иначе – переход на BNOACT

          SETB P1.6             

          JMP B2ACT             

BNOACT:   CLR P1.6

;Аналогично анализу первого байта производим анализ
;номера обладателя минимального значения аналогового сигнала и
;выдачу управляющих воздействий

B2ACT:    MOV A,NOFMIN2

          CJNE A,NUMBER,NOB2ACT

          SETB P1.5             

          JMP ENDACT           

NOB2ACT:  CLR P1.5

ENDACT:   CLR PSW.3        ; Выбор банка регистров 0

          RET

3.4 Описание обработчиков прерываний

Обработчик прерывания от УАПП производит анализ, в результате чего он был вызван. Если произошел конец передачи байта, то обработчик производит отключение передатчика от ЛС и возвращает управление программе. Если завершился приём байта, то обработчик должен проанализировать, какой это байт (маркер или данные), а также сохранить информацию, полученную в этом байте в переменных или таблице данных.

PCAINT:   JNB SCON.1,RESEIVE   

          CLR P1.3                       

          RETI

RESEIVE:  SETB PSW.3                     

          MOV R1,SBUF     ;Сохранение полученного байта

          MOV A,R1         ;Проверка бита паритета

          JB PSW.0,ODD

          JB SCON.2,ERRINP         ;RB8!=P => ERROR!  

          JMP NOERR           

ODD:      JNB SCON.2,ERRINP        ;RB8!=P => ERROR!

NOERR:    JB ACC.7,WMARK           ;SBUF.7=1 => Маркер

          MOV A,CURRENT    ;Определение номера контроллера

          CJNE A,#0FFh,GETB    

          JMP RETURN       ;Если номер неизвестен

GETB:     MOV A,NBYTE      ;Загрузка счётчика принятых
;байт. Если этот счётчик <2, то можно принимать байт, иначе -
;необходимо вернуться из прерывания

          CJNE A,#2,NEXTB

          JMP ERRINP           

NEXTB:    MOV A,CURRENT

          RL A                  ;*2

          ADD A,NBYTE           ;A+=NBYTE

          ADD A,#TABLE        ;A=#TABLE+2*CURRENT+NBYTE

          MOV R0,A

          MOV A,R1              ;A<-SBUF

          MOV @R0,A     ;(#TABLE+2*CURRENT+NBYTE)<-SBUF

          INC NBYTE

          CLR ISMARKER  ;Мы получили данные (а не маркер)                 JMP RETURN

WMARK:    ANL A,#7         ;3 младших бита - это номер

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

          MOV A,R1           

          ANL A,#38h    ;Следующие 3 бита – это количество

          RR A             ;работающих контроллеров

          RR A                 

          RR A

          MOV QUANT,A

          MOV A,R1

          MOV C,ACC.6      ;6-й бит – признак цикла

          MOV INITC,C      ;инициализации

          SETB ISMARKER   ;Мы получили маркер

          JMP RETURN       ;(а не данные)