Возникла такая проблема.
Необходимо организовать асинхронную передачу (а в дальнейшем и прием) с параметрами 9600-8-N-2 на 16-м ПИКе.
Т.к. "железно" поддерживается только 1 стоп-бит, вычитал в сети, что для передачи 2-го стоп-бита достаточно сделать задержку длительностью в 1 бит (около 104 мкс для 9600) перед отправкой следующего байта. Но как бы я с этим ни извращался, куда бы ее не вставлял, в виртуальном терминале Протеуса выводится мусор в виде одного единственного байта F8. Когда переключаю терминал на 1 стоп-бит, последовательность из необходимых 13 байтов выводится нормально.
Кусок кода с отправкой таков (прерывание не используется):
Спойлер
sendbsf RCSTA,SPEN ; Включаю порт
bsf STATUS,RP0
bsf TXSTA,TXEN ; Разрешаю передачу
bcf STATUS,RP0
movlw 1-й байт ; Отправка байтов
call tx
movlw 2-й байт
call tx
movlw 3-й байт
call tx
......
movlw 13-й байт
call tx
bsf STATUS,RP0
bcf TXSTA,TXEN ; Отключаю передатчик
bcf STATUS,RP0
clrf command
return
tx
btfss PIR1,TXIF ; Ожидаем опустошения
goto $-1 ; буфера перед
movwf TXREG ; отправкой в его регистр байта.
return
Вставлял ее перед movwf TXREG, делал отдельную проверку по биту TRMT (1=TSR empty, 0=TSR full), но он почему-то никогда не выходит в 1. Как-то раз даже извратился: отключил USART, настроил порт ТХ на выход (для USART`a он и RX должны быть настроены на вход) и выставил на нем 1 на нужный период, но и это не помогло.
Что посоветуете сделать для передачи 2-го стоп-бита?
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.


