PIC18F46K22でRS232C送受信(アセンブラプログラム)

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

概要

PIC18F46K22のEUSARTモジュールを使用しRS232Cを経由してパソコンと通信するプログラムである。
パソコンからターミナルで文字列を入力するとPICで受信してパソコンへ同じ文字を送信する。
秋月電子 PIC18F46K22使用 マイコンボードをベースとし半田付けされている水晶20MHzをH8/3048ボードの16MHzと交換し64MHzで動作可能とした。このボードはICSP端子を備えておりPICKIT 3で書き込みができ、電源はミニUSBで供給可能である。またユニバーサル基板になっているので簡単に回路を追加することができる。
ちなみに水晶が20MHzの場合は、通信速度がかわるので設定を変更しなければならない。
EUSARTの設定値の計算はPIC18 EUSART ボーレート計算を参照してください。
使用メモリは以下のとおりです
プログラムメモリ 109byte使用
回路は次のとおりである。
cir.svg
回路図(PDF)

パソコンでRS232Cを使用する

パソコンとの接続

RS232Cを使用する場合、パソコン同士等の接続を考慮したリバースケーブルとパソコンと端末等との接続を考慮したストレートケーブルがあります。
RS232Cを使用した機器を製作する場合、ケーブルの接続が自分の入力に対して出力となっているかなどを考慮しないと出力同士及び入力同士が接続され正常動作しないばかりか故障の原因にもなります。
リバースケーブルには内部の結線方法において幾つの種類があります。


本回路の場合、パソコンとはストレートケーブルで接続してください。

パリティなしで文字jkを送信した場合のRS232C送信波形

0 1 1 0 1 0 1 0 LSB MSB SVGの代替画像

文字jとkを偶数パリティで送信した場合のRS232C送信波形

j LSB MSB 0 1 0 1 0 1 1 0 0 SVGの代替画像 k LSB MSB 1 1 0 1 0 1 1 0 1 SVGの代替画像
j LSB MSB 0 1 0 1 0 1 1 0 0 k LSB MSB 1 1 0 1 0 1 1 0 1 SVGの代替画像

文字jとkを奇数パリティで送信した場合のRS232C送信波形

j LSB MSB 0 1 0 1 0 1 1 0 1 SVGの代替画像 k LSB MSB 1 1 0 1 0 1 1 0 0 SVGの代替画像

秋月電子 USB-シリアル変換ケーブル スケルトン

最近のパソコンはRS232Cが搭載されていませんのでUSBとRS232Cを変換するケーブルを使用してみました。
秋月電子のUSB-シリアル変換ケーブル スケルトンを使用しました。
このケーブルはWindows 10のサポートしておりませんが、秋月のサイトから古いドライバをダウンロードしインストールすると動作しました。以下にドライバのバージョン等を示します。
PL2303用ドライバー RS232C-USB
OS プロバイダー 日付 バージョン
Windows 7 Service Pack 1 64bit Prolific 2016/09/19 3.8.3.0
Windows 10 32bit Prolific 2010/03/12 3.3.11.152
Windows 10 64bit Prolific 2008/09/24 3.3.2.102

プログラムの説明

ソースファイル

以下のファイルで構成されている
eusart2a.asm ・・・ メインプログラム

ソースファイルのダウンロード eusart2a.zip

; EUSAER1を用いたRS232Cサンプルプログラム  2017/01/08
; 慈渓博瑞テクノロジー株式会社 PIC18F46K22 マイコンキット Ver2013.12.08用
;   http://akizukidenshi.com/catalog/g/gK-07231/
;   水晶は16MHzに交換してPICを64MHzで駆動
;   RC7:RX1   RC6:TX1
; MPLAB X IDE v3.45 Microchip MPASM(v5.70)
; PicKit 3

        #INCLUDE <p18f46k22.inc>
        ; 水晶発振(16MHz) クロック分周無 PLL有効(*4) プライマリクロック有効  ウォッチドッグタイマ無効 低電圧プログラム書き込みモード無効
        CONFIG FOSC = HSHP,PLLCFG=ON,PRICLKEN=ON,WDTEN=OFF,LVP=OFF
;   PC側のターミナル(例えTera Term)と通信を行う
;   最初にPIC18F46K22 EUSART1という文字列を送信後、受信した文字を送信する。
;   19200bps 8bit ストップビット1 パリティなし フロー制御無し
;   PC側のターミナルの改行コードは例えば受信CR、送信CR+LFに設定する。
;   PC側のターミナルの送受信文字コードをJISにした場合、半角カタカナを使用可能

        
        ; プログラムメモリのアドレスadsをTBLPTRレジスタに設定
LDTBLPTR MACRO   ads
        movlw   UPPER ads
        movwf   TBLPTRU
        movlw   HIGH ads
        movwf   TBLPTRH
        movlw   LOW ads
        movwf   TBLPTRL
        ENDM

        CODE
        ORG 0
        goto   start    ;   リセット時

start
        
;       USART初期化
        BANKSEL ANSELC
        movlw   b'00100100' ; CSRC=0:非同期 TX9=0:8bit BRGH=1:高速
        movwf   TXSTA1
        movlw   b'10010000' ; シリアル 8bit
        movwf   RCSTA1
        movlw   d'207'          ; 64MHz/(16*19200)-1=207 19230bps 0.16%
        movwf   SPBRG1

        movlw   b'00111111'
        movwf   ANSELC,BANKED
        movlw   b'11111111'
        movwf   TRISC
        
        
; ROM内の文字列をRS232Cで送信
        LDTBLPTR open_msg_str
loop1
        tblrd  *+
        movf   TABLAT,W
        bz     loop1_exit
        call   usart1_write
        bra    loop1
loop1_exit
loop2
        call   usart1_read
        call   usart1_write
        bra    loop2

open_msg_str
       DB      "PIC18F46K22 EUSART1",0dh,0ah,0

     
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