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

Проект 36. Приём по UART с эхо-ответом

Контроллер принимает символы из терминала, показывает их код на светодиодах и возвращает обратно. Проект учит работе с приёмником и обработке ошибки переполнения.

Задача

Принять символ из терминала, показать его код и отправить обратно.

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

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

  • PIC16F628A
  • кварц 4 МГц + 2×22 пФ
  • преобразователь USB-UART
  • 8 светодиодов + резисторы 330 Ом

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

ВыводПодключение
RB1 / RXвыход TXD преобразователя
RB2 / TXвход RXD преобразователя
RA0…RA7светодиоды индикации кода символа

Алгоритм

  1. Разрешить приём битом CREN.
  2. Ждать флага RCIF — байт принят.
  3. Прочитать RCREG, вывести код на светодиоды.
  4. Отправить тот же байт обратно передатчиком.

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

Код проверен ассемблером и собирается без ошибок. Скачать: 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.