Задача
Отправлять текстовую строку в терминал компьютера раз в секунду.
Микроконтроллер: PIC16F628A, кварц 4 МГц. Среда: MPLAB X + MPASM (или любой совместимый ассемблер). Как настроить среду и прошить контроллер — в статье программирование PIC.
Что понадобится
- PIC16F628A
- кварц 4 МГц + 2×22 пФ
- преобразователь USB-UART (CP2102/CH340) или MAX232
- резистор 10 кОм
Схема подключения
| Вывод | Подключение |
|---|---|
| RB2 / TX | вход RXD преобразователя |
| RB1 / RX | выход TXD преобразователя |
| GND | общий провод с преобразователем — обязательно |
| MCLR | через 10 кОм на +5 В |
Алгоритм
- Отключить компараторы, чтобы выводы работали как цифровые.
- Записать в
SPBRGделитель скорости и включитьBRGH. - Разрешить передатчик битом
TXENи включить порт битомSPEN. - Ждать флага
TRMTи класть байт вTXREG.
Листинг на ассемблере
Код проверен ассемблером и собирается без ошибок. Скачать: p35.asm · p35.hex (готовая прошивка).
;=======================================================
; Проект 35. Передача по UART (аппаратный USART)
; PIC16F628A, 4 МГц, 9600 бод, 8N1
; TX — RB2, к ПК через преобразователь уровней (MAX232 или USB-UART)
;=======================================================
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, idx, chr
endc
ORG 0x000
goto Start
;--- строка для передачи, 0 — признак конца ---
Text
addwf PCL,f
retlw 'A'
retlw 'F'
retlw 'O'
retlw 'N'
retlw ' '
retlw 'P'
retlw 'I'
retlw 'C'
retlw 0x0D ; возврат каретки
retlw 0x0A ; перевод строки
retlw 0x00
Start
movlw 0x07
movwf CMCON ; компараторы выключены, выводы цифровые
bsf STATUS,RP0 ; банк 1
movlw .25 ; 9600 бод при 4 МГц и BRGH=1
movwf SPBRG
movlw b'00100100' ; TXEN=1, BRGH=1, асинхронный режим
movwf TXSTA
bsf TRISB,1 ; RB1/RX — вход
bsf TRISB,2 ; RB2/TX задаёт модуль USART
bcf STATUS,RP0 ; банк 0
movlw b'10000000' ; SPEN=1 — порт включён
movwf RCSTA
Main
clrf idx
SendLoop
movf idx,w
call Text
movwf chr
movf chr,w
btfsc STATUS,Z ; конец строки?
goto Pause
movf chr,w
call TxByte
incf idx,f
goto SendLoop
Pause
call Delay1s
goto Main
;--- передача байта из W ---
TxByte
bsf STATUS,RP0
TxWait
btfss TXSTA,TRMT ; ждём опустошения регистра сдвига
goto TxWait
bcf STATUS,RP0
movwf TXREG ; запуск передачи
return
Delay1s
movlw .5
movwf d1
S1 movlw .255
movwf d2
S2 nop
nop
nop
nop
nop
nop
nop
decfsz d2,f
goto S2
decfsz d1,f
goto S1
return
END
Пояснения
- Делитель считается по формуле SPBRG = Fosc/(16 × скорость) − 1. При 4 МГц и 9600 бод получается 25 — ошибка около 0,2 %, что допустимо.
- У PIC16F628A регистр
CMCONпосле сброса включает компараторы; без записи 0x07 выводы порта A остаются аналоговыми. - Общий провод между контроллером и преобразователем обязателен — без него связь не работает, даже если сигнальные линии подключены верно.
Что дальше
Разобравшись с этим проектом, переходите к следующему в разделе проекты на PIC. Справочник по архитектуре и периферии контроллеров — на странице микроконтроллеры PIC.