前回に引き続き、STC8G1K08Aのシリアル通信に挑戦してみました。

シリアル通信で重要な、クロック原ですが、11.0592MHzとしました。これは原発振22.1184MHzを1/2に設定した値になります。

8051オリジナルでは、原発振の12クロックを1マシンサイクルとしてタイマ回路につなぎます。STC8G1K08Aでは、12クロックを1マシンサイクルまたは、1クロックを1マシンサイクルとしてタイマー回路に送ることができます。今回は、1クロックを1マシンサイクルとして設定(AUXR=0x11000000)しました。

11.0592MHzでの設定範囲は9600~115200まで設定できるようですがここではボーレート38400bpsに設定し、8データビット、パリティなし、1ストップビットの8N1の設定としています。

シリアル通信UARTのモードをモード1にSCONの設定を行います。及び 受信イネーブルします。

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

原発振22.1184MHzを1/2に設定した値にします。(11.0592MHz)

	mov	P_SW2,#0x80			;拡張RAM領域特殊機能レジスタ(XFR)アクセス 有効
	mov	DPTR,#CLKDIV		        ;Clock Division register set
	mov	a,#0x02				;分周値を 1/2にセット
	movx	@DPTR,a			        ;
	mov	P_SW2,#0x00			;拡張RAM領域特殊機能レジスタ(XFR)アクセス 禁止	

シリアル通信では、タイマー1を占有します。タイマー1(TMODで)は8ビット自動リドードモードに設定します。

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

分周器TH1及びTL1の値は次の式で求められます。

分周値=256-(SMOD1:1or2)×システムクロック)/(32*ボーレート)

256を引いている意味は、カウント値はカウントアップしてオーバーフローし、カウント値を再読み込みしカウントアップを繰り返すためです。

分周値=256-(1*11059200)/(32*38400)=256-9=247

16進に変換して、0xf7(247)

	mov	a,	#0xf7			;Timer 1 count set
	mov	TH1,	a
	mov	TL1,	a

STC8G1K08Aの仕様書の13.2.6 UART1 Mode1の項の表により求める事もできます。
周波数11.0592、T1mode2、1Tmode、1Tmodeで38400のボーレートで”F7H"となります。

送受信方式は、ポーリング方式で、受信フラグ(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

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

回路図は前回の「8051コアに萌えたい STC8G1K08AでLチカ(開発環境(アセンブラ)と書き込み、実行)」の回路図をそのまま使用します。

今回は、6pin(P3.1)TxD、5pin(p3.0)RxDをそのまま、シリアル通信用に兼用します。
STC8G1K08Aへの書き込みが終わったら、シリアル通信用のターミナルを立ち上げると通信できるようになります。
STC8G1K08A書き込み中は、シリアル通信用のターミナルは終了するようにしてください。

下記のプログラムは、シリアル端末にメッセージを出力したのち、>の後、入力された文字をエコーバックします。また、数字の1~4で8pin及び1pinの接続したLEDを点灯/消灯できます。
ボーレートは38400bps、8N1設定です。

; STC8G1K08A  Serial communication AND  LED 点灯 1pin(P5.4),8pin(P3.3)

 
; Flash ROM 8Kbyte
; RAM       1Kbyte
; EEPROM    4Kbyte
; External clock 33MHz
 
; assembler
;  program start 000H 0000H-01fffH
;  main          100H
;
; assemblers  ASxxxx and ASlink V5.5
; file name STC8G1K08A_serial.asm
; $ as8051 -l -s -o STC8G1K08A_serial.asm
; $ aslink -i STC8G1K08A_serial
; program download  $ sudo stcgal -P stc8g -t 22118.4 -p /dev/ttyUSB0 STC8G1K08A_serial.hex 
;
;ボーレート38400bps 8N1

;P50	.equ	0xc8
;P51	.equ	0xc9
;P52	.equ	0xca
;P53	.equ	0xcb
P54	.equ	0xcc
       
AUXR	.equ	0x8e
CLKDIV	.equ	0xfe01
P_SW2	.equ	0xba

P3M0	.equ	0xb2
P3M1	.equ	0xb1

P5M0	.equ	0xca
P5M1	.equ	0xc9

	.area	TEST(ABS)

	.org	0x0000

	ljmp	main

	.org	0x0100

main:
	mov	sp,	#0x3f
	
	
	mov	P3M0,0b00000000		;P3.3  準双方向モード
	mov	P3M1,0b00000000		;P3.7- P3.4 P3.2-P3.0 準双方向モード
	
	mov	P5M0,0b00000000		;P5.4 準双方向モード
	mov	P5M1,0b00000000		;P5.7- P5.5 P5.3-P5.0 準双方向モード
	
	mov	P_SW2,#0x80		;拡張RAM領域特殊機能レジスタ(XFR)アクセス 有効
	mov	DPTR,#CLKDIV		;Clock Division register set
	mov	a,#0x02			;分周値を 1/2にセット
	movx	@DPTR,a			;
	mov	P_SW2,#0x00		;拡張RAM領域特殊機能レジスタ(XFR)アクセス 禁止	
	
	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,	#0xf7		;Timer 1 count set
	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
	cjne	a,#0x31,loop2		;数字の1でP3.3(8pin)LED点灯
	clr	P3.3			;P3.3(8pin) L set
loop2:	cjne	a,#0x32,loop3		;数字の2でP3.3(8pin)LED消灯
	setb  P3.3			;P3.3(8pin) H set
loop3:	cjne	a,#0x33,loop4		;数字の3でP5.4(1pin)LED点灯
	clr	P54			;P5.4(1pin) L set
loop4:	cjne	a,#0x34,loop5		;数字の4でP5.4(1pin)LED消灯
	setb P54			;P5.4(1pin) H set
loop5:	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	"STC8G1K08A Uart communication Test !"
	.db	0x0d,0x0a
	.str	"1=8pinLED(ON) 2=8pinLED(OFF) 3=1pinLED(ON) 4=1pinLED(OFF)"
	.db	0x0d,0x0a,0x00

	.end

アセンブリ、リンクします。

$ as8051 -l -s -o STC8G1K08A_serial.asm

$ aslink -i STC8G1K08A_serial

ASlink >> -i
ASlink >> STC8G1K08A_serial

書き込みします。

$ sudo stcgal -P stc8g -t 22118.4 -p /dev/ttyUSB0 STC8G1K08A_serial.hex
Waiting for MCU, please cycle power: done
Target model:
  Name: STC8G1K08A-8PIN
  Magic: F794
  Code flash: 8.0 KB
  EEPROM flash: 4.0 KB
Target frequency: 22.073 MHz
Target BSL version: 7.3.13U
Target wakeup frequency: 36.125 KHz
Target ref. voltage: 1191 mV
Target mfg. date: 2024-07-01
Target options:
  reset_pin_enabled=False
  clock_gain=high
  watchdog_por_enabled=False
  watchdog_stop_idle=True
  watchdog_prescale=64
  low_voltage_reset=False
  low_voltage_threshold=2
  eeprom_erase_enabled=True
  bsl_pindetect_enabled=False
  por_reset_delay=long
  rstout_por_state=high
  uart1_remap=False
  uart2_passthrough=True
  uart2_pin_mode=push-pull
  epwm_open_drain=True
  program_eeprom_split=8192
Loading flash: 464 bytes (Intel HEX)
Target frequency: Target 22.118 MHz
Adjusted frequency: 22.109 MHz(-0.043%)
Switching to 115200 baud: done
Erasing flash: done
Writing flash: 576 Bytes [00:00, 7313.01 Bytes/s]
Finishing write: done
Setting options: done
Target UID: F794C4840AEBF6
Disconnected!

シリアル端末でチェックします。
電源を再投入した後、メッセージと、入力したキーをエコーバックします。数字の1~4でLEDをON/OFFします。

STC8G1K08A Uart communication Test !
1=8pinLED(ON) 2=8pinLED(OFF) 3=1pinLED(ON) 4=1pinLED(OFF)
>12341234asdfghj

おすすめの記事