PIC16F88の例

初期化

	; 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	; エラーしたデータを捨てたらメインループに戻る

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2023-11-27 (月) 23:39:34