AFON // радиотехник affonya@mail.ru
← Проекты на PIC

Проект 41. Обмен данными между двумя PIC

Два контроллера соединены по UART: один опрашивает кнопку, другой управляет нагрузкой. Роль задаёт перемычка — прошивка одна на оба устройства.

Задача

Передать состояние кнопки с одного контроллера на реле другого.

Микроконтроллер: PIC16F628A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.

Что понадобится

  • два PIC16F628A
  • два кварца 4 МГц + конденсаторы
  • кнопка + резистор 10 кОм
  • реле, транзистор, обратный диод
  • перемычки выбора роли

Схема подключения

ВыводПодключение
TX ведущего (RB2)к RX ведомого (RB1)
GNDобщий провод между платами
RA0перемычка выбора роли: замкнута на GND — ведущий
RA1 ведущегокнопка
RA2 ведомогоключ реле

Алгоритм

  1. При старте прочитать перемычку и выбрать ветку программы.
  2. Ведущий периодически опрашивает кнопку и шлёт символ состояния.
  3. Ведомый ждёт байт и по его значению включает или выключает нагрузку.
  4. Обмен идёт непрерывно, состояние обновляется несколько раз в секунду.

Листинг на ассемблере

Код проверен ассемблером и собирается без ошибок. Скачать: p41.asm · p41.hex (готовая прошивка).

;=======================================================
; Проект 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

Пояснения

  • Единая прошивка на оба устройства упрощает обслуживание: одна и та же плата становится ведущим или ведомым переустановкой перемычки.
  • Общий провод между платами обязателен — по нему замыкается сигнальная цепь.
  • Для длинных линий вместо прямого соединения ставят преобразователи RS-485: тот же UART, но дифференциальный и помехоустойчивый.

Что дальше

Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.