PIC18F46K22 EUSART1(RS232C)で受信割込みを使用して送受信(アセンブラプログラム)

icon 項目のみ表示/展開表示の切り替え

概要

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近く受信が完了することを示すフラグをチェックし続けなければなりません。
割込みを使用すると受信後の割込みにより受信完了を知ることができますので、他の処理と同時に処理をすることができます。

通信設定

RS232C 19200bps 8bit ストップビット1 パリティなし フロー制御無し

プログラムの説明

初期化

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