Болею, времени до фига, достал ноутбук и решил разобраться в интерфейсе USART на примере PIC16F876A. Пишу на ассемблере. Среда MPLAB.
Покурил даташит и поставил для себя учебную задачу: передать b'01010101' в асинхронном режиме.
В даташите сказано: для того, чтобы начать передачу, выберите частоту тактового генератора, выберите режим, включите передачу, загрузите в TXREG ваши данные, и передача начнётся незамедлительно.
Почитал, как всё это происходит. Написано: как только в TXREG загружаются данные, они незамедлительно отправляются в регистр TSR, после чего поднимается флаг, показывающий, что в TSR что-то есть, и (внимание) регистр TXREG обнуляется. Начинается передача.
Написал программу согласно этим шагам. Запускаю пошаговое выполнение. Что я вижу? Данные в TXREG загружаются. Флаг, показывающий, что в TSR что-то есть, поднимается (значит, данные перекинулись из TXREG в TSR?). Но регистр TXREG не обнуляется и на RC6 (выводе передатчика) ничего не появляется. Но через некоторое время флаг "полного TSR" опускается, якобы "передача закончена"... а на RC6 по прежнему все нули
Ах, да, ещё написано, что как только я загружу данные в TXREG, должен сброситься флаг "пустого TXREG", он же PIR1<4>. Он не сбрасывается
В чём дело?
Код: Выделить всё
; Попытка передать данные через интерфейс USART
processor 16f876a
radix hex
#include <p16f876a.inc>
; 32109876543210
__CONFIG b'11111100111010' ;керамика 20 МГц, все таймеры отключены, защита кода отключена, защита от записи отключена, LVP отключено
org 0x00
goto start
start
call init
;////////настройка USART/////////////
;настройка Baud Rate Generator
;из таблицы 10-3 берём значение BRG=d'0'
bsf STATUS,5 ;банк1
movlw d'0'
movwf SPBRG ;загружаем значение
bsf TXSTA,BRGH ;Высокая скорость
;/////НАСТРОЙКА РЕГИСТРА TXSTA///////////////////////
bcf TXSTA,SYNC ;Асинхронный режим
bcf STATUS,5 ;банк0
;///////НАСТРОЙКА РЕГИСТРА RCSTA////////////////
bsf RCSTA,SPEN ;включаем последовательный порт
bsf STATUS,5 ;банк1
bcf TXSTA,6 ;выбираем 8-битную передачу
bsf TXSTA,5 ;включаем передачу (Здесь PIR1<4> поднимается, т. к. в регистре TXREG ничего нет)
start_transm
bcf STATUS,5 ;банк0
movlw b'01010101' ;данные для передачи
movwf TXREG ;загружаем (Здесь PIR1<4> должен сброситься, а он не сбрасывается)
nop ;Здесь регистр TXREG должен обнулиться, а он не обнуляется :(
bsf STATUS,5 ;банк1
;Но бит TMRT после загрузки данных становится равным 0, а это значит, что в регистре TSR что-то есть.
tr_in_progr
btfss TXSTA,1 ;проверяем бит TRMT, пока он не стал равным 1
goto tr_in_progr ;если он равен 0 - передача ещё идёт (но в это время на RC6 ничего не меняется)
goto start_transm ;если нет - новая передача (бит TMRT всё же становится равным 1, якобы "передача закончена")
init
;/////////////IO PORTS///////////
bcf STATUS,6
bsf STATUS,5 ;банк1
clrf TRISA
clrf TRISB
clrf TRISC
;данные будут передаваться через RC6, согласно даташиту делаем RC6 и RC7 входами
bsf TRISC,7
bsf TRISC,6
bcf STATUS,5 ;банк0
clrf PORTA
clrf PORTB
clrf PORTC
return
end