Задача
Принять символ из терминала, показать его код и отправить обратно.
Микроконтроллер: PIC16F628A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.
Что понадобится
- PIC16F628A
- кварц 4 МГц + 2×22 пФ
- преобразователь USB-UART
- 8 светодиодов + резисторы 330 Ом
Схема подключения
| Вывод | Подключение |
|---|---|
| RB1 / RX | выход TXD преобразователя |
| RB2 / TX | вход RXD преобразователя |
| RA0…RA7 | светодиоды индикации кода символа |
Алгоритм
- Разрешить приём битом
CREN. - Ждать флага
RCIF— байт принят. - Прочитать
RCREG, вывести код на светодиоды. - Отправить тот же байт обратно передатчиком.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: p36.asm · p36.hex (готовая прошивка).
;=======================================================
; Проект 36. Приём по UART с эхо-ответом
; PIC16F628A, 4 МГц, 9600 бод
; RX — RB1, TX — RB2. Принятый байт возвращается обратно
; и его код показывается на светодиодах PORTA
;=======================================================
LIST p=16F628A
#include <p16f628a.inc>
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF & _BODEN_OFF & _MCLRE_ON & _CP_OFF
cblock 0x20
rxbyte
endc
ORG 0x000
goto Start
Start
movlw 0x07
movwf CMCON
bsf STATUS,RP0
movlw .25
movwf SPBRG
movlw b'00100100' ; TXEN, BRGH
movwf TXSTA
clrf TRISA ; светодиоды
bsf TRISB,1
bsf TRISB,2
bcf STATUS,RP0
movlw b'10010000' ; SPEN + CREN (приём разрешён)
movwf RCSTA
clrf PORTA
Main
call RxByte
movwf rxbyte
movwf PORTA ; показываем код принятого символа
movf rxbyte,w
call TxByte ; отправляем обратно
goto Main
;--- приём байта в W ---
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
END
Пояснения
- Проверка
OERRобязательна: при переполнении приёмник блокируется, и восстановить его можно только перезапуском битаCREN. - Чтение
RCREGавтоматически сбрасывает флагRCIF— отдельно его сбрасывать не нужно. - Приёмник имеет двухуровневый буфер, но при 9600 бод байт приходит раз в миллисекунду — успеть обработать несложно.
Что дальше
Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.