; init PORTB clrf TRISB ; PORT-B 全出力ポート movlw B'00000100' ; PORT-B RB2(RxD)のみ入力ポート movwf TRISB ; bcf OPTION_REG,NOT_RBPU ; PORT B pull-up ; シリアル初期化 ; Start 1bit, Data 8bit, Stop 2bit ; PICはSTOP=1bit固定なので、9ビットモードでMSBを1にすることでSTOP=2bitにする ; bsf STATUS,RP0 ; Bank 1 movlw B'01100101' ; 9bit 1/16mode ASYNC TXon HighSpeed bit9=1 movwf TXSTA ; Tx設定レジスタ ;movlw D'103' ; 4800bps ;movlw D'51' ; 9600bps ;movlw D'25' ; 19200bps movlw D'12' ; 38400bps movwf SPBRG ; Txボーレート設定レジスタ bcf STATUS,RP0 ; Bank 0 movlw B'10010000' ; SPEN RX9 (SREN) CREN ADDEN FERR OERR (RX9D) movwf RCSTA ; Rx設定レジスタ
8bit送信(通常)
TXCHAR(FILE)に書いてあるデータを1バイト送信
rssend_loop1 bsf STATUS,RP0 ; Bank 1 を選択する btfss TXSTA,TRMT ; 送信バッファが空になるのを待つ goto rssend_loop1 bcf STATUS,RP0 ; Bank 0 を選択する movf TXCHAR,0 movwf TXREG
9bit送信(ストップビット2を仮想実現)
TXCHAR(FILE)に書いてあるデータを1バイト送信
rssend_loop1 bsf STATUS,RP0 ; Bank 1 を選択する btfss TXSTA,TRMT ; 送信バッファが空になるのを待つ goto rssend_loop1 bsf TXSTA,0 ; TX9Dを1にする bcf STATUS,RP0 ; Bank 0 を選択する movf TXCHAR,0 movwf TXREG
1バイト受信
call err_chk ; 受信状態にエラーがないかチェック rcv_loop1 btfss PIR1,RCIF ; 受信完了フラグが1なら次をスキップ goto rcv_loop1 movf RCREG,0 ; 1文字Wレジスタにコピー(RCIFフラグは自動クリアされる) movwf CHAR1 ; CHAR1(FILE)にコピー
エラーチェック
err_chk btfsc RCSTA,OERR ; Errじゃ無かったらスキップ goto err_recover1 btfsc RCSTA,FERR ; Errじゃ無かったらスキップ goto err_recover2 return ; エラーが無かったので元に戻って処理続行 err_recover1 bsf PORTB,LED_OERR ; オーバーランエラー表示 goto err_recover err_recover2 bsf PORTB,LED_FERR ; フレームエラー表示 goto err_recover ;エラー処理 err_recover MOVLW D'100' ; 受信データが終わるまでちょっと待つ CALL WAIT_1msec_w ; カラ読み(ダブルバッファを空にするため、空読みしてゴミを捨てる) movf RCREG,0 ; 1文字Wレジスタにコピー movf RCREG,0 ; 1文字Wレジスタにコピー bcf RCSTA,OERR ; エラーフラグクリア(自動だったかも) bcf RCSTA,FERR ; エラーフラグクリア(自動だったかも) goto main_loop ; エラーしたデータを捨てたらメインループに戻る