前回に引き続き、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