MPLAB IDE v9.82, MPASM v5.51, PICKit3の環境で、PIC16F1827のEUSARTのテストをします。まず、送信テストをします。
回路図です。今回もICSPでテストをします。
PIC16F1827から送信した信号をシリアルUSB変換モジュールFT-234を通してパソコンに接続し、通信ソフトTeraTermで受信します。BaudRateは、9600bpsとします。
PIC16F1827は、APFCON0とAPFCON1の設定で、各種機能のピン割り当てを変更することができます。
今回は、APFCON0のbit7 RXDTSEL=0(RX/DT=RB1)、APFCON1のbit0 TXCKSEL=0(TX/CK=RB2)としました。
通信プロトコルは、非同期、8bitとします。
TXSTAは、TXEN=1,BRGH=1とします。(他のビットはデフォルト)
RCSTAは、SPEN=1,CREN=1とします。(他のビットはデフォルト)
PIC16F1827では、より広範囲なクロック、通信速度に対応するためにSPBRGレジスタが16bitに拡張され、SPBRGHとSPBRGLの2つになりました。8bitにするか16bitにするかは、BAUDCONレジスタのbit3 BRG16で設定します。今回は、8bitで使用しますので、BRG16=0とします。
BaudRateを計算する式は、次の表のようにSYNC=0(非同期),BRG16=0(SPBRG 8bit),BRGH=1(高速モード)の時は、Fosc{16(n+1)}です。
Fosc=4MHz=4000000Hz,BaudRate=9600bpsの時、SPBRGの値は、25となります。(SPBRGL=25)
この値は、説明書にも掲載されています。誤差は、0.16%です。
"Hello World!"の後に、数値を0から255までカウントアップしながら、1秒ごとに送信するプログラムを作ってみました。
------------------------------------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; PIC16F1827 EUSART TEST
; 2024.11.15
; JH7UBC Keiji Hata
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LIST P=PIC16F1827
INCLUDE P16F1827.INC
__CONFIG _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_OFF & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
__CONFIG _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_OFF & _BORV_19 & _LVP_OFF
ERRORLEVEL -302
CBLOCK 020h
CNT1ms
CNT250ms
COUNTER
BYTE0
DIGIT12
DIGIT34
SHIFT
WORK1
TEMP
ENDC
SETUP
;クロック設定
BANKSEL OSCCON
MOVLW b'01101000' ;PLLなし、4MHz,Fosc
MOVWF OSCCON
;入出力設定
BANKSEL ANSELA
CLRF ANSELA ;AN0-AN4使用しない
CLRF ANSELB ;AN5-AN11使用しない
BANKSEL TRISA
CLRF TRISA ;PORTAは全て出力(RA5は入力)
MOVLW b'00000010' ;RB1は入力、他は出力
MOVWF TRISB
;USART設定
;RX,TX PIN 設定
BANKSEL APFCON0
BCF APFCON0,7 ;RXDTSEL=0 RX=RB1
BCF APFCON1,0 ;TXCKSEL=0 TX=RB2
BANKSEL TXSTA
MOVLW b'00100100'
MOVWF TXSTA ;非同期モード、高速通信モードBRGH=1
; BANKSEL RCSTA
MOVLW 090h
MOVWF RCSTA ;受信可、非同期モード
; BANKSEL BAUDCON
BCF BAUDCON,3 ;BRG16=0 BRG 8bit
MOVLW 019h ;019h=25
MOVWF SPBRGL ;Fosc=4MHz,Baud Rate=9600bps
CLRF COUNTER ;COUNTERクリア
MAIN
MOVLW "H"
CALL SENDCHR
MOVLW "e"
CALL SENDCHR
MOVLW "l"
CALL SENDCHR
MOVLW "l"
CALL SENDCHR
MOVLW "o"
CALL SENDCHR
MOVLW " "
CALL SENDCHR
MOVLW "W"
CALL SENDCHR
MOVLW "o"
CALL SENDCHR
MOVLW "r"
CALL SENDCHR
MOVLW "l"
CALL SENDCHR
MOVLW "d"
CALL SENDCHR
MOVLW "!"
CALL SENDCHR
MOVLW " "
CALL SENDCHR
MOVFW COUNTER
MOVWF BYTE0
CALL CONV_BCD ;COUNTERの値(バイナリ)をBCDに変換しDIGIT34,DIGIT12に格納
MOVFW DIGIT34
ANDLW 0Fh ;DIGIT34の下位4bitを取り出す
IORLW 30h ;ASCIIコードに変換
CALL SENDCHR
MOVFW DIGIT12
MOVWF WORK1
MOVWF TEMP
SWAPF TEMP,W
ANDLW 0Fh ;DIGIT12の上位4bitを取り出す
IORLW 30h ;ASCIIコードに変換
CALL SENDCHR
MOVFW WORK1
ANDLW 0Fh ;DIGIT12の下位4bitを取り出す。
IORLW 30h ;ASCIIコードに変換
CALL SENDCHR
MOVLW 0Dh ;改行コード
CALL SENDCHR
MOVLW 0Ah ;NLコード
CALL SENDCHR
INCF COUNTER ;COUNTER+1
CALL LOOP250ms
CALL LOOP250ms
CALL LOOP250ms
CALL LOOP250ms
GOTO MAIN
;1文字送信
SENDCHR
BANKSEL TXSTA
BTFSS TXSTA,TRMT ;送信可能かチェック(1:可 0:禁止)
GOTO $-1
MOVWF TXREG
RETURN
;--------------------------------------------
; バイナリからBCDへの変換
;--------------------------------------------
CONV_BCD
BCF STATUS,C ;キャリーをクリア
MOVLW 08h ;8ビットカウンタ
MOVWF SHIFT ;SHIFT=8
CLRF DIGIT12 ;BCDデータクリア
CLRF DIGIT34
LOOP
RLF BYTE0,F ;shift BYTE to DIGIT
RLF DIGIT12,F
RLF DIGIT34,F
DECFSZ SHIFT,F ;end check
GOTO ADJST ;adjust to BCD
RETURN
ADJST
MOVF DIGIT12,W ;DIGIT12 adjust TO BCD
CALL ADJBCD
MOVWF DIGIT12
MOVF DIGIT34,W ;DIGIT34 adjust to BCD
CALL ADJBCD
MOVWF DIGIT34
GOTO LOOP
;**** Each digit adjust to BCD ****
ADJBCD
MOVWF WORK1 ;save
MOVLW 3 ;W+3
ADDWF WORK1,W
MOVWF TEMP
BTFSC TEMP,3 ;Test W+3>7
MOVWF WORK1 ;>7 then W+3 else W
MOVLW 030h ;W+30
ADDWF WORK1,W
MOVWF TEMP
BTFSC TEMP,7 ;Test W+30>7*
MOVWF WORK1 ;>70 then W+30 else W
MOVF WORK1,W
RETURN
LOOP250ms
MOVLW 0FAh ;0FAh=250
MOVWF CNT250ms
LOOP2
CALL LOOP1ms
DECFSZ CNT250ms
GOTO LOOP2
RETURN
LOOP1ms
MOVLW 0F9h ;0F9h=249
MOVWF CNT1ms
LOOP1
NOP
DECFSZ CNT1ms,F
GOTO LOOP1
RETURN
END
------------------------------------------------------------------
ブレッドボードです。
PIC16F1827から送信された文字が、TeraTermに表示されました。
数値は、0から255ですが、ゼロ消しの処理をしていませんので、0が表示されます。
※コメント投稿者のブログIDはブログ作成者のみに通知されます