;=======================================================
; Проект 41. Обмен между двумя PIC по UART
; PIC16F628A, 4 МГц, 9600 бод. Ведущий и ведомый в одной прошивке:
; перемычка на RA0 задаёт роль (0 — ведущий, 1 — ведомый)
; Ведущий шлёт состояние кнопки RA1, ведомый включает реле RA2
;=======================================================
        LIST    p=16F628A
        #include <p16f628a.inc>
        __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_OFF & _MCLRE_ON & _CP_OFF

        cblock  0x20
        d1, d2, rxb
        endc

        ORG     0x000
        goto    Start

Start
        movlw   0x07
        movwf   CMCON
        bsf     STATUS,RP0
        movlw   .25
        movwf   SPBRG
        movlw   b'00100100'
        movwf   TXSTA
        movlw   b'00000011'     ; RA0 (роль) и RA1 (кнопка) — входы
        movwf   TRISA
        bsf     TRISB,1
        bsf     TRISB,2
        bcf     STATUS,RP0
        movlw   b'10010000'     ; приём и передача включены
        movwf   RCSTA
        bcf     PORTA,2

        btfsc   PORTA,0         ; определяем роль по перемычке
        goto    Slave

;--- ВЕДУЩИЙ: опрашивает кнопку и шлёт команду ---
Master
        btfss   PORTA,1         ; кнопка нажата?
        goto    SendOn
        movlw   '0'
        call    TxByte
        goto    MDelay
SendOn
        movlw   '1'
        call    TxByte
MDelay
        call    Delay100ms
        goto    Master

;--- ВЕДОМЫЙ: принимает команду и управляет нагрузкой ---
Slave
        call    RxByte
        movwf   rxb
        xorlw   '1'
        btfsc   STATUS,Z
        bsf     PORTA,2         ; включить нагрузку
        movf    rxb,w
        xorlw   '0'
        btfsc   STATUS,Z
        bcf     PORTA,2         ; выключить
        goto    Slave

RxByte
        btfsc   RCSTA,OERR
        goto    ClrErr
        btfss   PIR1,RCIF
        goto    RxByte
        movf    RCREG,w
        return
ClrErr
        bcf     RCSTA,CREN
        bsf     RCSTA,CREN
        goto    RxByte

TxByte
        bsf     STATUS,RP0
TW      btfss   TXSTA,TRMT
        goto    TW
        bcf     STATUS,RP0
        movwf   TXREG
        return

Delay100ms
        movlw   .130
        movwf   d1
DL1     movlw   .250
        movwf   d2
DL2     nop
        decfsz  d2,f
        goto    DL2
        decfsz  d1,f
        goto    DL1
        return

        END
