山本ワールド
PIC18F46K22 EUSART1(RS232C)で受信割込みを使用して送受信(アセンブラプログラム)
概要
PIC18F46K22のEUSARTモジュールを使用しRS232Cを経由してパソコンと通信するプログラムである。
パソコンからターミナルで文字列を入力するとPICで割込みにより受信してパソコンへ同じ文字を送信する。
受信に割り込みを使用すると受信データの発生は割り込みで知ることができますので、受信データが発生するまで別の処理を行うことができます。例えば9600bpsの場合、1byteのデータは最速でも約1msの時間待つ必要があります。64MHzでPICを動作させている場合、受信待ちの間に16000命令も実行することができます。
秋月電子 PIC18F46K22使用 マイコンボードをベースとし半田付けされている水晶20MHzをH8/3048ボードの16MHzと交換し64MHzで動作可能とした。このボードはICSP端子を備えておりPICKIT 3で書き込みができ、電源はミニUSBで供給可能である。またユニバーサル基板になっているので簡単に回路を追加することができる。
ちなみに水晶が20MHzの場合は、通信速度がかわるので設定を変更しなければならない。
EUSARTの設定値の計算はPIC18 EUSART ボーレート計算を参照してください。
使用メモリは以下のとおりです
プログラムメモリ 84byte使用
回路はPIC18F46K22でRS232C送受信(アセンブラプログラム)のとおりである。
例えば9600bpsで割り込みを使用しない場合、1文字の受信に1ms近く受信が完了することを示すフラグをチェックし続けなければなりません。
割込みを使用すると受信後の割込みにより受信完了を知ることができますので、他の処理と同時に処理をすることができます。
通信設定
プログラムの説明
初期化
EUSART1の初期化し通信仕様を設定します。ボーレートの設定はBPS1という定数を設定することによりビルド時に自動的に計算して各種レジスタを設定するようにしてみました。
1byte分のデーターを受信するとRCREG1レジスタに受信データーが格納されます。その時、受信データがあることを知らせる割り込みをRC1IEビットで許可します。
上記の割り込みは周辺の割り込みですので有効にするためにPEIEビットをセットします。
割り込みは高位と低位の2種類使用できます。初期値は高位になっていますのでそのままとします。
高位割り込みを許可するためにGIEビットをセットします。
割り込み発生時のジャンプ先は、割込みベクターでROMアドレスに高位が0008h、低位が0018hにジャンプします。通常は、このアドレスにgoto命令を記述して割り込み処理ルーチンへジャンプさせます。
受信データが発生するまで無限ループで待機します。
高位割り込み処理ルーチン inth
受信データが1byte発生するとinthにジャンプします。高位割り込みの場合、Wレジスタ、バンクレジスタ及びPCの値はPIC内の専用レジスタに保存されます。割り込みから復帰する場合は、retfie FAST命令を使用して保存された値によりWレジスタ、バンクレジスタ、PCを復帰します。
複数の割り込み要因を許可していないので、割り込み要因をボーリングする作業をしておりません。
サブルーチンusart1_readにより受信データーをWレジスタに取得し、サブルーチンusart1_writeにより送信します。
usart1_read
受信データを1byte取得しWレジスタに格納します。受信データーが発生するとRC1IFフラグがセットされますので、セットされるまでボーリングします。
受信データはRCREG1レジスタに格納されているのでWレジスタにコピーしてサブルーチンを終了します。
usart1_write
Wレジスタのデータを送信します。送信中の場合、TXREG1に新しい送信データを書き込むことはできないのでTRMTフラグにより送信が完了するまでボーリングします。
送信が完了したら、TXREG1レジスタに送信データをコピーしサブルーチンを終了します。
ソースファイル
以下のファイルで構成されているeusart4a.asm ・・・ メインプログラム
ソースファイルのダウンロード eusart4a.zip
; EUSART1受信割り込みによる送受信テスト(高位レベル割り込み使用) 2017/01/31 20:00
; 慈渓博瑞テクノロジー株式会社 PIC18F46K22 マイコンキット Ver2013.12.08用
; http://akizukidenshi.com/catalog/g/gK-07231/
; 水晶は16MHzに交換してPICを64MHzで駆動
; 19200bps
; ストップビット 1bit
; パリティ 無
; ストップ 1bit
; フロー制御 無
; MPLAB X IDE v3.45 Microchip MPASM(v5.70)
; PicKit 3
; RC6:TX1 RS232C
; RC7:RX1 RS232C
#INCLUDE <p18f46k22.inc>
; 水晶発振(16MHz) クロック分周無 PLL有効(*4) プライマリクロック有効 ウォッチドッグタイマ無効 低電圧プログラム書き込みモード無効
CONFIG FOSC = HSHP,PLLCFG=ON,PRICLKEN=ON,WDTEN=OFF,LVP=OFF
CODE
ORG 0
goto start ; リセット時
org 08h
goto inth ; 高位レベル割り込み
start
BANKSEL ANSELC
; USART初期化 300bps?115.2kbps (Xtal 16MHz PLL *4)
FOSC1 EQU d'64000000' ; クロック周波数 Hz
BPS1 EQU d'19200' ; ボーレート設定
SPBRGW1 EQU (FOSC1/(d'16'*BPS1)-1)
bsf BAUDCON1,BRG16 ; BRH16=1
movlw b'00100000' ; CSRC=0:非同期 TX9=0:8bit BRGH=0
movwf TXSTA1
movlw b'10010000' ; シリアル 8bit
movwf RCSTA1
movlw LOW SPBRGW1
movwf SPBRG1
movlw HIGH SPBRGW1
movwf SPBRGH1
movlw b'00111111'
movwf ANSELC,BANKED
movlw b'11111111'
movwf TRISC
bsf PIE1,RC1IE ; 受信割り込み許可
bsf INTCON,PEIE
bsf INTCON,GIE ; 高位レベル割り込み許可
goto $
inth ; 高位割り込み
call usart1_read
call usart1_write
retfie FAST
usart1_write ; USART1へWREGの1byte書き込み
btfss TXSTA1,TRMT ; TSR空か
bra usart1_write
movwf TXREG1
return
usart1_read ; USART1から読み取り
btfss PIR1,RC1IF ; 受信完了
bra usart1_read
btfsc RCSTA1,FERR ; フレミングエラーがない場合次の命令をスキップ
bra usart1_ferr
btfsc RCSTA1,OERR ; オーバーランエラーがない場合次の命令をスキップ
bra usart1_oerr
movf RCREG1,W
return
usart1_ferr ; フレミングエラーが発生
usart1_oerr ; オーバーフローエラーが発生
return
END