SERIAL
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
* PIC16F88の例 [#mf6c316e]
** 初期化 [#w9525a85]
; 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にする...
;
bsf STATUS,RP0 ; Bank 1
movlw B'01100101' ; 9bit 1/16mode ASYNC TXon HighSpeed ...
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 OER...
movwf RCSTA ; Rx設定レジスタ
** 送信 [#l07b4b45]
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
* 受信 [#z085cab6]
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 ; エラーしたデータを捨てたらメインループ...
終了行:
* PIC16F88の例 [#mf6c316e]
** 初期化 [#w9525a85]
; 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にする...
;
bsf STATUS,RP0 ; Bank 1
movlw B'01100101' ; 9bit 1/16mode ASYNC TXon HighSpeed ...
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 OER...
movwf RCSTA ; Rx設定レジスタ
** 送信 [#l07b4b45]
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
* 受信 [#z085cab6]
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 ; エラーしたデータを捨てたらメインループ...
ページ名: