/ / UARTコードがガベージを送信-アセンブリ、uart、8051、edsim51

UARTコードはガーベッジアセンブリ、uart、8051、edsim51を送信します

EdSim51エミュレーター(8051 MCU用)を使用して、次の このメモ。データを送信するプログラムを作成しましたが、時々(常にではない)ゴミを送信します。

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に書き込みますが、シリアルモニターはゴミを表示します。画像を参照してください。 UART

ボーレートが同期していないようです。それとも私は何かを忘れましたか?混乱した出力のソースは何ですか?

回答:

回答№1は0

ISRの終わりにTIをクリアするのを忘れました。 シリアルポートの2つの割り込みソース(送信と受信)は1つのベクターを共有するため、TIとRIはベクター化時にハードウェアによってクリアされません。それはプログラマー次第です。

ジェームズ・ロジャース- EdSim51クリエイター