Код UART отправляет мусор

Я использую эмулятор EdSim51 (для MCU 8051), следуя этим примечаниям. Я написал программу, которая отправляет данные, но иногда (не всегда) отправляет мусор.

JMP main

ORG 23h ; serial interrupt vector
  JBC TI,sendString
RETI

ORG 30h
str: DB 'H','e','l','l','o',0Dh,0

sendString:
  CLR A
  MOVC A,@A+DPTR ; read next char from str
  INC DPTR
  JZ sendStringEnd ; if the char is not 0
    MOV SBUF,A ; write next char
  sendStringEnd:
RETI

main:
CLR SM0
SETB SM1 ; serial mode 1

MOV TMOD,#20h
MOV TH1,#243
MOV TL1,#243
SETB TR1 ; 2400 baud rate

SETB EA
SETB ES ; enable serial interrupt

MOV DPTR,#str ; DPTR points to Hello string
SETB TI ; force interrupt

JMP $

MOV SBUF,A пишет правильные данные в SBUF, но последовательный монитор показывает мусор, см. изображение. УАПП

Похоже, скорость передачи данных не синхронизирована. Или я что-то забыл? Каков источник испорченного вывода?


person Jan Turoň    schedule 03.11.2015    source источник
comment
@HansPassant, да. Он подключил эту штуку к последовательному прерыванию и даже проверяет бит TI.   -  person Jester    schedule 03.11.2015


Ответы (1)


Вы забыли очистить TI в конце ISR. Поскольку два источника прерывания последовательного порта (передача и прием) совместно используют один вектор, ни TI, ни RI не сбрасываются аппаратно при векторизации. Это зависит от программиста.

Джеймс Роджерс - создатель EdSim51

person James Rogers    schedule 10.11.2015
comment
Я использовал JBC TI,sendString - разве это не должно очищать TI? - person Jan Turoň; 11.11.2015