STC12C2052のシリアル通信について挑戦してみました。

シリアル通信は簡単にできそうと思ったのですが、ちょっと苦戦してしまいました。
ボーレートを簡単に設定するためには、水晶発振子をぴったしの分周発振周波数にすることですが、まず、水晶発振に切り替えすることができませんでした。

RC内部発振から外付け水晶発振にするには、前回使用しているダウンロードソフトstcgalでは、デバイスが対象外になっておりコマンドでの変更ができません。メーカーからのダウンロードソフトSTC-ISPですが、うわさどうり、セキュリティーソフトで疑わしいソフトとして警告を受けてしまいました^^;
ちょっとリスクをあるのでためらってしまいます^^;

STC-ISPがセキュリティーソフトではじかれるので、外部水晶発振は断念しました^^
RC内部発振 で行くことにします。
RC内部発振では、発振周波数が、stcgalを実行すると Target frequency: 5.762MHzと表示がでています。
この周波数から最適なボーレートを探す必要があります。

8051オリジナルでは、原発振の12クロックを1マシンサイクルとしてタイマ回路につなぎます。STC12C2052では、レジスタを設定することにより1クロックを1マシンサイクルとみなしてタイマ回路に送ることができます。
この設定は、AUXRレジスタ(0x8e)のB7(T0x12)及びB6(T1x12)で切り替えます。シリアル通信では T1タイマーを使用するのでB6 (T1x12) の設定を変えればいいことになります。
0:12クロック  1:1クロックです。
今回は T0,T1とも 1クロック設定としました。

AUXR		.equ	0x8e

	mov	AUXR,	#0xc0			;SYSCLK/1 timer0 or timer1 clock souce 

タイマーはシリアル通信では8bitAuto-Reload機能を使うことが一番簡単といことで、この機能を使用します。この機能はモード2という設定になります。
タイマーのモード設定は、TMODレジスタ(0x89)で上位4ビットがタイマ1、下位4ビットがタイマ0の設定になります。タイマ1を使用するのでモード2に設定します。

	mov	TMOD,	#0x20			;Set Timer 1 as mode2(8bit auto reload)

シリアル回路ではタイマーからのクロックをさらに16分周して、ボーレートとしています。さらにデフォルトでは1/2の設定になっているので結果的に32分周することになります。デフォルトの1/2を1/1に設定するにはPCONレジスタ(0x87)のSMOD(B7)を1に設定することで、DoubleBandの1/1となり 16分周で済みます。今回は PCON の設定はデフォルトのままですので32分周となります。

以上の情報からいろいろ計算した結果2400bpsが一番近い分周比になりました。タイマの分周値の計算は次の通りです。

タイマーの分周値=5762000/32/2400=75.026となり ほぼ75分周になります。

タイマーはカウントアップしてオーバーフローすれば、カウント値を再読み込みしカウントアップを繰り返します。
したがって、タイマーの設定は256-75=181 となり、16進では 0xb5となります。
実際のカウント値の設定は、TH1及びTL1に設定します。

mov a,  #0xb5
mov TH1,    a
mov TL1,    a

シリアル回路の動作モードは4種類あり。今回は8ビットUARTを選択しました。モード1の選択となります。モード設定はSCONレジスタ(0x98)で設定します。 モード1設定はSM0(B7)=0,SM1(B6)=1をセットします。 また、シリアル回路の受信を有効にするために、REN(B4)を1にセットします。

	mov	SCON,	#0x50			;set UART as mode1 or Receive activity

送受信方式は、ポーリング方式で、受信フラグ(RI=SCON(B0))及び送信フラグ(TI=SCON(B1))を常にチェックする方式です。
なお、チェックフラグ RI,TIは手動でクリアする必要があります。
入出力するデータは、SBUF(0x99)にセットされます。
1文字入力、1文字出力は次ようになりました。

getchar:
	clr	ri
	jnb	ri,	.
	mov	a,	SBUF
	ret

putchar:
	clr	ti
	mov	SBUF,	a
	jnb	ti,	.
	ret

なお、 jmp ri, . は loop: jmp ri, loop  と同じです

回路は、リセット回路をデータシートに記載された回路にしました。
また、P1.0とP1.1のジョンパーは1Kに変更しました。

下記のプログラムは、シリアル端末にメッセージを出力したのち、>の後、入力された文字をエコーバックします。
ボーレートは2400bps、8N1設定です。

; STC12C2052  Serial communication by Pinecone 2019/11/18
;
; STC12C2052 cpu
; Flash ROM 2Kbyte
; RAM       256byte
; External clock -
 
; assembler
;  program start 000H 0000H-07ffH
;  main          100H
;
; assemblers  ASxxxx and ASlink V5.31
; file name 2052_serial01.asm
; $ as8051 -l -s -o 2052_serial01.asm
; $ aslink -i 2052_serial01
; $ program download  stcgl 2052_serial01.ixh  
;
AUXR		.equ	0x8e

	.area	TEST(ABS)

	.org	0x0000

	ljmp	main

	.org	0x0100

main:
	mov	sp,	#0x3f
	mov	AUXR,	#0xc0			;SYSCLK/1 timer0 or timer1 clock souce 
	mov	SCON,	#0x50			;set UART as mode1 or Receive activity
	mov	TMOD,	#0x20			;Set Timer 1 as mode2(8bit auto reload) 
	mov	a,	#0xb5			;Timer 1 count set (256-75=181:0xb5)
	mov	TH1,	a
	mov	TL1,	a
	setb	TR1				;Timer 1 start running

	mov	DPTR,	#start_msg
	lcall	msgout
	mov	a,	#'>
	lcall	putchar
loop:
	lcall	getchar
	lcall	putchar
	sjmp	loop


msgout:
	clr	a
	movc	a,	@A+DPTR
	jz	msgout_end
	inc	DPTR
	lcall	putchar
	sjmp	msgout
msgout_end:
	ret

getchar:
	clr	ri
	jnb	ri,	.
	mov	a,	SBUF
	ret

putchar:
	clr	ti
	mov	SBUF,	a
	jnb	ti,	.
	ret

start_msg:
	.str	"STC12C2052 Uart communication Test !"
	.db	0x0d,0x0a,0x00

	.end
おすすめの記事