Задача
Передать состояние кнопки с одного контроллера на реле другого.
Микроконтроллер: PIC16F628A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.
Что понадобится
- два PIC16F628A
- два кварца 4 МГц + конденсаторы
- кнопка + резистор 10 кОм
- реле, транзистор, обратный диод
- перемычки выбора роли
Схема подключения
| Вывод | Подключение |
|---|---|
| TX ведущего (RB2) | к RX ведомого (RB1) |
| GND | общий провод между платами |
| RA0 | перемычка выбора роли: замкнута на GND — ведущий |
| RA1 ведущего | кнопка |
| RA2 ведомого | ключ реле |
Алгоритм
- При старте прочитать перемычку и выбрать ветку программы.
- Ведущий периодически опрашивает кнопку и шлёт символ состояния.
- Ведомый ждёт байт и по его значению включает или выключает нагрузку.
- Обмен идёт непрерывно, состояние обновляется несколько раз в секунду.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: 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.