RS232cで通信A
PIC16F84を使った通信
■送信処理を追加する
送信処理は受信処理と同じようにカウンタを使おうと思います
送信バッファに値が入った事をトリガーとしてカウンタのカウントダウン
を行い、ビットを順次、ポートに送信します
送信完了後はバッファをクリアします
;****************************************************************************
;RS232c送信処理
;****************************************************************************
SEND_START
TSTF SEND_BUF ;SEND_BUFがゼロかテストする
BZ SEND_END ;ゼロのときジャンプ
;1/19200を32分周して1/600を作り出す
decfsz SEND_TMR,F ;Fレジスタを‐1して0ならスキップ
goto SEND_END ;ジャンプ
MOVLW 0x1F ;Wレジスタに値を代入
MOVWF SEND_TMR ;WレジスタからFレジスタに代入
;送信カウンタのセット
TSTF SEND_COUNTER ;SEND_COUNTERがゼロかテストする
BNZ SEND_COUNTER_SET_END ;ゼロ以外のときジャンプ
SEND_COUNTER_SET
MOVLW 0x13+0x01 ;Wレジスタに値を代入
MOVWF SEND_COUNTER ;WレジスタからFレジスタに代入
SEND_COUNTER_SET_END
DECF SEND_COUNTER ;Fレジスタを-1する
バッファに値が入ったことをトリガーとしてカウントダウンを開始します
同時に1/19200秒で入ってくるタイマー割り込みを32分周して1/600秒のタイミング
にしています。
;-----------------------------------------------------------------------
;スタートビットを立てる
;-----------------------------------------------------------------------
SEND_START_BIT
MOVFW SEND_COUNTER ;WレジスタにFレジスタを代
SUBLW 0x13 ;Wレジスタから値を引く
BNZ SEND_0_BIT ;結果が0以外ならジャンプ
BCF PORTA,1 ;指定ビットに0を立てる
カウンタから0x13を引き結果が0の場合はスタートビットを立てます
0以外の場合においては次の処理にジャンプします
;-----------------------------------------------------------------------
;0ビット目の送信
;-----------------------------------------------------------------------
SEND_0_BIT
MOVFW SEND_COUNTER ;WレジスタにFレジスタを代
SUBLW 0x11 ;Wレジスタから値を引く
BNZ SEND_0_BIT_END ;結果が0以外ならジャンプ
BTFSS SEND_BUF,0 ;指定ビットがゼロ以外ならスキップ
goto SEND_0_OFF ;ジャンプ
SEND_0_ON
BSF PORTA,1 ;指定ビットに1を立てる
goto SEND_0_BIT_END
SEND_0_OFF
BCF PORTA,1 ;指定ビットに0を立てる
SEND_0_BIT_END
・・・・・・・・・
カウンタから0x11を引き結果が0の場合は0ビット目の送信タイミングですので
バッファの値をみてポートに出力します
この処理内容と同じものが、7ビット目まで連続するため省略してあります
;-----------------------------------------------------------------------
;ストップビットの送信
;-----------------------------------------------------------------------
SEND_STOP_BIT
MOVFW SEND_COUNTER ;WレジスタにFレジスタを代
SUBLW 0x01 ;Wレジスタから値を引く
BNZ SEND_STOP_BIT_END ;結果が0以外ならジャンプ
BSF PORTA,1 ;指定ビットに1を立てる
SEND_STOP_BIT_END
カウンタから0x01を引き結果が0の場合はストップビットの送信タイミングですので
ポートに対して送信処理を行います
;-----------------------------------------------------------------------
;送信完了のため、送信バッファのクリア
;-----------------------------------------------------------------------
SEND_BUF_CLEAR
TSTF SEND_COUNTER ;SEND_COUNTERがゼロかテストする
BNZ SEND_END ;ゼロ以外のときジャンプ
;送信バッファをクリアする
MOVLW 0x00 ;Wレジスタに値を代入
MOVWF SEND_BUF ;WレジスタからFレジスタに代入
SEND_END
;----------------------------------------------------------------------------
カウンタが0である場合は送信完了を表しますのでバッファをクリアします
■以上で送信処理が追加できたはずですので
動作確認のため、受信した値をそのまま、送信するようにmain部分を変更します
main
;-------------------------------------
;読み出し中の場合は待機するループ
;--------------------------------------
READ_WAIT
TSTF READ_COUNTER ;READ_COUNTERがゼロかテストする
BNZ READ_WAIT ;ゼロ以外のときジャンプ
READ_WAIT_END
;-------------------------------------
MOVFW READ_BUF ;WレジスタにFレジスタを代入
MOVWF PORTB ;FレジスタにWレジスタを代入
;-------------------------------------
;送信中の場合は待機するループ
;-------------------------------------
SEND_WAIT
TSTF SEND_BUF ;SEND_BUFがゼロかテストする
BNZ SEND_WAIT ;ゼロ以外のときジャンプ
SEND_WAIT_END
;-------------------------------------
MOVFW PORTB ;WレジスタにFレジスタを代入
MOVWF SEND_BUF ;FレジスタにWレジスタを代入
goto main
受信したデータをポートBに出力して、その後
ポートBの値を送信するプログラムです。
受信中のバッファを読み取ると、正しい値が返って来ませんので
受信中のバッファを読み取れないようにループを追加しました
送信中のバッファに値を書き込むと、正しい値が送信されませんので
送信中のバッファに書き込まないようにループを追加しました
■動作確認
PIC16F84にプログラムを書き込みパソコンのRS232cに接続しました
RS232cのテスト用のプログラムを立ちあげ、
パソコンから文字を一文字送信すると、送信した文字と同じ文字が連続して返ってきました
どうやら送信が正しく動作してるようです
▼ためしに連続した文字列を送信すると
文字化けせずに連続的に受信・送信がうまくいっているようです
文字がダブって表示されているのはPICのプログラムがそのように作ってあるからです
ふう、うまくいきました
やはりアセンブラは難解ですねえ
一つ一つの動作は単純なんですけど、それを使ってロジックを作るとなると
見栄えも悪いし、可読性も悪いし、頭も混乱するし ←俺が悪いだけか笑
ハード特有の動作を調べないといけないですし、
やはり高級言語はすばらしい
でも、おかげで、MPUに対するローレベルな知識を少し身に付けることができました
(たとえば条件分岐とか)
アセンブラ命令のバイナリを見ると、まさに論理回路が目に浮かんでくる気がします笑
■以下、今回作成した全ソースコード
;---------------------------------------------------------------
LIST P=16F84
#include <p16F84.inc>
__CONFIG _CP_OFF & _HS_OSC & _PWRTE_ON & _WDT_OFF
;---------------------------------------------------------------
;アドレスに名前を付ける
;---------------------------------------------------------------
;割り込み時にレジスタを退避させるメモリ
w_temp equ 0x0C
status_temp equ 0x0D
;ウェイト用メモリ
wait_val1 equ 0x0E
wait_val2 equ 0x0F
;RS232c 受信用メモリ
READ_TMR equ 0x10
READ_COUNTER equ 0x11
READ_BUF equ 0x12
;RS232c 送信用メモリ
SEND_TMR equ 0x13
SEND_COUNTER equ 0x14
SEND_BUF equ 0x15
;PIC16F84では0x0Cから0x4Fまでが使用可能
;***************************************************************
;リセットベクタ
;***************************************************************
org 0
goto start
;***************************************************************
;割り込みベクタ
;***************************************************************
org 4
;レジスタの退避
movwf w_temp
movf STATUS,w
clrf STATUS
movwf status_temp
;各割り込みに対して適切なアドレスにジャンプさせる
btfsc INTCON,0
goto int0
btfsc INTCON,1
goto int1
btfsc INTCON,2
goto int2
intret
;レジスタの復帰
clrf STATUS
movf status_temp,w
movwf STATUS
swapf w_temp,f
swapf w_temp,w
retfie ;割り込みから復帰
;---------------------------------------------------------------
;RB0/INT割り込みにより実行
;---------------------------------------------------------------
int0 ;RB4~RB7割り込み
;割り込み時の処理をここに記述
bcf INTCON,0 ;RB4~RB7割り込みフラグリセット
goto intret
;---------------------------------------------------------------
;RB4〜RB7割り込みにより実行
;---------------------------------------------------------------
int1 ;RB0/INT割り込み
;割り込み時の処理をここに記述
bcf INTCON,1 ;RB0/INT割り込みフラグリセット
goto intret
;---------------------------------------------------------------
;タイマー割り込みにより実行
;---------------------------------------------------------------
int2 ;タイマー割り込み
;タイマーにはクロックが1/4周期で供給されるため、
;10MHzクロックでは 1/2500000secとなる
;1/19200 sec(52 usec)毎にタイマー割り込みを入れるために
;減算タイマー値に256-130=0x7Eを設定
;しかし、割り込みから、ここまでに0x0Eほどかかるため加算する
movlw 0x7E+0x0E ;タイマー値リセット
movwf TMR0
bcf INTCON,2 ;タイマー割り込みフラグリセット
;割り込み時の処理をここに記述
;****************************************************************************
;RS232c送信処理
;****************************************************************************
SEND_START
TSTF SEND_BUF ;SEND_BUFがゼロかテストする
BZ SEND_END ;ゼロのときジャンプ
;1/19200を32分周して1/600を作り出す
decfsz SEND_TMR,F ;Fレジスタを‐1して0ならスキップ
goto SEND_END ;ジャンプ
MOVLW 0x1F ;Wレジスタに値を代入
MOVWF SEND_TMR ;WレジスタからFレジスタに代入
;送信カウンタのセット
TSTF SEND_COUNTER ;SEND_COUNTERがゼロかテストする
BNZ SEND_COUNTER_SET_END ;ゼロ以外のときジャンプ
SEND_COUNTER_SET
MOVLW 0x13+0x01 ;Wレジスタに値を代入
MOVWF SEND_COUNTER ;WレジスタからFレジスタに代入
SEND_COUNTER_SET_END
DECF SEND_COUNTER ;Fレジスタを-1する
;-----------------------------------------------------------------------
;スタートビットを立てる
;-----------------------------------------------------------------------
SEND_START_BIT
MOVFW SEND_COUNTER ;WレジスタにFレジスタを代
SUBLW 0x13 ;Wレジスタから値を引く
BNZ SEND_0_BIT ;結果が0以外ならジャンプ
BCF PORTA,1 ;指定ビットに0を立てる
;-----------------------------------------------------------------------
;0ビット目の送信
;-----------------------------------------------------------------------
SEND_0_BIT
MOVFW SEND_COUNTER ;WレジスタにFレジスタを代
SUBLW 0x11 ;Wレジスタから値を引く
BNZ SEND_0_BIT_END ;結果が0以外ならジャンプ
BTFSS SEND_BUF,0 ;指定ビットがゼロ以外ならスキップ
goto SEND_0_OFF ;ジャンプ
SEND_0_ON
BSF PORTA,1 ;指定ビットに1を立てる
goto SEND_0_BIT_END
SEND_0_OFF
BCF PORTA,1 ;指定ビットに0を立てる
SEND_0_BIT_END
;-----------------------------------------------------------------------
;1ビット目の送信
;-----------------------------------------------------------------------
SEND_1_BIT
MOVFW SEND_COUNTER ;WレジスタにFレジスタを代
SUBLW 0x0F ;Wレジスタから値を引く
BNZ SEND_1_BIT_END ;結果が0以外ならジャンプ
BTFSS SEND_BUF,1 ;指定ビットがゼロ以外ならスキップ
goto SEND_1_OFF ;ジャンプ
SEND_1_ON
BSF PORTA,1 ;指定ビットに1を立てる
goto SEND_1_BIT_END
SEND_1_OFF
BCF PORTA,1 ;指定ビットに0を立てる
SEND_1_BIT_END
;-----------------------------------------------------------------------
;2ビット目の送信
;-----------------------------------------------------------------------
SEND_2_BIT
MOVFW SEND_COUNTER ;WレジスタにFレジスタを代
SUBLW 0x0D ;Wレジスタから値を引く
BNZ SEND_2_BIT_END ;結果が0以外ならジャンプ
BTFSS SEND_BUF,2 ;指定ビットがゼロ以外ならスキップ
goto SEND_2_OFF ;ジャンプ
SEND_2_ON
BSF PORTA,1 ;指定ビットに1を立てる
goto SEND_2_BIT_END
SEND_2_OFF
BCF PORTA,1 ;指定ビットに0を立てる
SEND_2_BIT_END
;-----------------------------------------------------------------------
;3ビット目の送信
;-----------------------------------------------------------------------
SEND_3_BIT
MOVFW SEND_COUNTER ;WレジスタにFレジスタを代
SUBLW 0x0B ;Wレジスタから値を引く
BNZ SEND_3_BIT_END ;結果が0以外ならジャンプ
BTFSS SEND_BUF,3 ;指定ビットがゼロ以外ならスキップ
goto SEND_3_OFF ;ジャンプ
SEND_3_ON
BSF PORTA,1 ;指定ビットに1を立てる
goto SEND_3_BIT_END
SEND_3_OFF
BCF PORTA,1 ;指定ビットに0を立てる
SEND_3_BIT_END
;-----------------------------------------------------------------------
;4ビット目の送信
;-----------------------------------------------------------------------
SEND_4_BIT
MOVFW SEND_COUNTER ;WレジスタにFレジスタを代
SUBLW 0x09 ;Wレジスタから値を引く
BNZ SEND_4_BIT_END ;結果が0以外ならジャンプ
BTFSS SEND_BUF,4 ;指定ビットがゼロ以外ならスキップ
goto SEND_4_OFF ;ジャンプ
SEND_4_ON
BSF PORTA,1 ;指定ビットに1を立てる
goto SEND_4_BIT_END
SEND_4_OFF
BCF PORTA,1 ;指定ビットに0を立てる
SEND_4_BIT_END
;-----------------------------------------------------------------------
;5ビット目の送信
;-----------------------------------------------------------------------
SEND_5_BIT
MOVFW SEND_COUNTER ;WレジスタにFレジスタを代
SUBLW 0x07 ;Wレジスタから値を引く
BNZ SEND_5_BIT_END ;結果が0以外ならジャンプ
BTFSS SEND_BUF,5 ;指定ビットがゼロ以外ならスキップ
goto SEND_5_OFF ;ジャンプ
SEND_5_ON
BSF PORTA,1 ;指定ビットに1を立てる
goto SEND_5_BIT_END
SEND_5_OFF
BCF PORTA,1 ;指定ビットに0を立てる
SEND_5_BIT_END
;-----------------------------------------------------------------------
;6ビット目の送信
;-----------------------------------------------------------------------
SEND_6_BIT
MOVFW SEND_COUNTER ;WレジスタにFレジスタを代
SUBLW 0x05 ;Wレジスタから値を引く
BNZ SEND_6_BIT_END ;結果が0以外ならジャンプ
BTFSS SEND_BUF,6 ;指定ビットがゼロ以外ならスキップ
goto SEND_6_OFF ;ジャンプ
SEND_6_ON
BSF PORTA,1 ;指定ビットに1を立てる
goto SEND_6_BIT_END
SEND_6_OFF
BCF PORTA,1 ;指定ビットに0を立てる
SEND_6_BIT_END
;-----------------------------------------------------------------------
;7ビット目の送信
;-----------------------------------------------------------------------
SEND_7_BIT
MOVFW SEND_COUNTER ;WレジスタにFレジスタを代
SUBLW 0x03 ;Wレジスタから値を引く
BNZ SEND_7_BIT_END ;結果が0以外ならジャンプ
BTFSS SEND_BUF,7 ;指定ビットがゼロ以外ならスキップ
goto SEND_7_OFF ;ジャンプ
SEND_7_ON
BSF PORTA,1 ;指定ビットに1を立てる
goto SEND_7_BIT_END
SEND_7_OFF
BCF PORTA,1 ;指定ビットに0を立てる
SEND_7_BIT_END
;-----------------------------------------------------------------------
;ストップビットの送信
;-----------------------------------------------------------------------
SEND_STOP_BIT
MOVFW SEND_COUNTER ;WレジスタにFレジスタを代
SUBLW 0x01 ;Wレジスタから値を引く
BNZ SEND_STOP_BIT_END ;結果が0以外ならジャンプ
BSF PORTA,1 ;指定ビットに1を立てる
SEND_STOP_BIT_END
;-----------------------------------------------------------------------
;送信完了のため、送信バッファのクリア
;-----------------------------------------------------------------------
SEND_BUF_CLEAR
TSTF SEND_COUNTER ;SEND_COUNTERがゼロかテストする
BNZ SEND_END ;ゼロ以外のときジャンプ
;送信バッファをクリアする
MOVLW 0x00 ;Wレジスタに値を代入
MOVWF SEND_BUF ;WレジスタからFレジスタに代入
SEND_END
;----------------------------------------------------------------------------
;****************************************************************************
;RS232c受信処理
;****************************************************************************
;1/19200 secでタイマー割り込み
;スタートビットが立ったことを検出する
;READ_COUNTER ビット数をカウントするメモリ
;READ_TMR タイマー割り込みを分周するためのメモリ
COUNTSET_START
TSTF READ_COUNTER ;READ_COUNTERがゼロかテストする
BNZ COUNTSET_END ;ゼロでないときジャンプ
COUNTSET
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto COUNTSET_END ;ジャンプ
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto COUNTSET_END ;ジャンプ;
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto COUNTSET_END ;ジャンプ
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto COUNTSET_END ;ジャンプ
MOVLW 0x12+0x01 ;Wレジスタに値を代入
MOVWF READ_COUNTER ;WレジスタからFレジスタに代入
COUNTSET_END
TSTF READ_COUNTER ;READ_COUNTERがゼロかテストする
BZ intret ;ゼロのときジャンプ
;1/19200を32分周して1/600を作り出す
decfsz READ_TMR,F ;Fレジスタを‐1して0ならスキップ
goto intret ;ジャンプ
MOVLW 0x1F ;Wレジスタに値を代入
MOVWF READ_TMR ;WレジスタからFレジスタに代入
DECF READ_COUNTER ;Fレジスタを-1する
;----------------------------------------------------------------------
;Startビットの確認
;----------------------------------------------------------------------
READ_ST_INIT
MOVFW READ_COUNTER ;WレジスタにFレジスタを代
SUBLW 0x12 ;Wレジスタから値を引く
BNZ READ_ST_END ;結果が0以外ならジャンプ
READ_ST_START
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_ST_ERR ;ジャンプ
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_ST_ERR ;ジャンプ;
;StartREADが立っている事を確認
goto READ_0_END ;ジャンプ;
READ_ST_ERR
;StartREADが立っていない ノイズであるため受信処理をリセット
MOVLW 0x00 ;Wレジスタに値を代入
MOVWF READ_COUNTER ;WレジスタからFレジスタに代入
READ_ST_END
;----------------------------------------------------------------------
;0ビット目の取得
;----------------------------------------------------------------------
READ_0_INIT
MOVFW READ_COUNTER ;WレジスタにFレジスタを代
SUBLW 0x10 ;Wレジスタから値を引く
BNZ READ_0_END ;結果が0以外ならジャンプ
READ_0_START
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_0_ON ;ジャンプ
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_0_ON ;ジャンプ;
READ_0_OFF
BCF READ_BUF,0 ;指定ビットに0を立てる
goto READ_0_END ;ジャンプ;
READ_0_ON
BSF READ_BUF,0 ;指定ビットに1を立てる
READ_0_END
;----------------------------------------------------------------------
;1ビット目の取得
;----------------------------------------------------------------------
READ_1_INIT
MOVFW READ_COUNTER ;WレジスタにFレジスタを代入
SUBLW 0x0E ;Wレジスタから値を引く
BNZ READ_1_END ;結果が0以外ならジャンプ
READ_1_START
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_1_ON ;ジャンプ
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_1_ON ;ジャンプ;
READ_1_OFF
BCF READ_BUF,1 ;指定ビットに0を立てる
goto READ_1_END ;ジャンプ;
READ_1_ON
BSF READ_BUF,1 ;指定ビットに1を立てる
READ_1_END
;----------------------------------------------------------------------
;2ビット目の取得
;----------------------------------------------------------------------
READ_2_INIT
MOVFW READ_COUNTER ;WレジスタにFレジスタを代入
SUBLW 0x0C ;Wレジスタから値を引く
BNZ READ_2_END ;結果が0以外ならジャンプ
READ_2_START
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_2_ON ;ジャンプ
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_2_ON ;ジャンプ;
READ_2_OFF
BCF READ_BUF,2 ;指定ビットに0を立てる
goto READ_2_END ;ジャンプ;
READ_2_ON
BSF READ_BUF,2 ;指定ビットに1を立てる
READ_2_END
;----------------------------------------------------------------------
;3ビット目の取得
;----------------------------------------------------------------------
READ_3_INIT
MOVFW READ_COUNTER ;WレジスタにFレジスタを代入
SUBLW 0x0A ;Wレジスタから値を引く
BNZ READ_3_END ;結果が0以外ならジャンプ
READ_3_START
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_3_ON ;ジャンプ
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_3_ON ;ジャンプ;
READ_3_OFF
BCF READ_BUF,3 ;指定ビットに0を立てる
goto READ_3_END ;ジャンプ;
READ_3_ON
BSF READ_BUF,3 ;指定ビットに1を立てる
READ_3_END
;----------------------------------------------------------------------
;4ビット目の取得
;----------------------------------------------------------------------
READ_4_INIT
MOVFW READ_COUNTER ;WレジスタにFレジスタを代入
SUBLW 0x08 ;Wレジスタから値を引く
BNZ READ_4_END ;結果が0以外ならジャンプ
READ_4_START
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_4_ON ;ジャンプ
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_4_ON ;ジャンプ;
READ_4_OFF
BCF READ_BUF,4 ;指定ビットに0を立てる
goto READ_4_END ;ジャンプ;
READ_4_ON
BSF READ_BUF,4 ;指定ビットに1を立てる
READ_4_END
;----------------------------------------------------------------------
;5ビット目の取得
;----------------------------------------------------------------------
READ_5_INIT
MOVFW READ_COUNTER ;WレジスタにFレジスタを代入
SUBLW 0x06 ;Wレジスタから値を引く
BNZ READ_5_END ;結果が0以外ならジャンプ
READ_5_START
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_5_ON ;ジャンプ
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_5_ON ;ジャンプ;
READ_5_OFF
BCF READ_BUF,5 ;指定ビットに0を立てる
goto READ_5_END ;ジャンプ;
READ_5_ON
BSF READ_BUF,5 ;指定ビットに1を立てる
READ_5_END
;----------------------------------------------------------------------
;6ビット目の取得
;----------------------------------------------------------------------
READ_6_INIT
MOVFW READ_COUNTER ;WレジスタにFレジスタを代入
SUBLW 0x04 ;Wレジスタから値を引く
BNZ READ_6_END ;結果が0以外ならジャンプ
READ_6_START
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_6_ON ;ジャンプ
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_6_ON ;ジャンプ;
READ_6_OFF
BCF READ_BUF,6 ;指定ビットに0を立てる
goto READ_6_END ;ジャンプ;
READ_6_ON
BSF READ_BUF,6 ;指定ビットに1を立てる
READ_6_END
;----------------------------------------------------------------------
;7ビット目の取得
;----------------------------------------------------------------------
READ_7_INIT
MOVFW READ_COUNTER ;WレジスタにFレジスタを代入
SUBLW 0x02 ;Wレジスタから値を引く
BNZ READ_7_END ;結果が0以外ならジャンプ
READ_7_START
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_7_ON ;ジャンプ
BTFSC PORTA,0 ;指定ビットがゼロならスキップ
goto READ_7_ON ;ジャンプ;
READ_7_OFF
BCF READ_BUF,7 ;指定ビットに0を立てる
goto READ_7_END ;ジャンプ;
READ_7_ON
BSF READ_BUF,7 ;指定ビットに1を立てる
READ_7_END
; COMF PORTB,1 ;Fレジスタを反転
goto intret ;ジャンプ
;***************************************************************
;スタート
;***************************************************************
start
;---------------------------------------------------------------
;ポートの設定
;---------------------------------------------------------------
clrf PORTA
clrf PORTB
bsf STATUS,5 ;ページを1に切り替え
movlw 0x01
movwf TRISA ;portAをbit 1 を入力に設定
movlw 0x00
movwf TRISB ;portBを出力に設定
bcf STATUS,5 ;ページを0に切り替え
;---------------------------------------------------------------
;RB0/INT割り込みの設定
;---------------------------------------------------------------
bsf STATUS,5 ;ページを1に切り替え
bcf OPTION_REG,6 ;RB0のエッジ設定は立ち上がり
bcf STATUS,5 ;ページを0に切り替え
; bsf INTCON,4 ;RB0/INT割り込み発生許可
;---------------------------------------------------------------
;RB4〜RB7割り込みの設定
;---------------------------------------------------------------
; bsf INTCON,3 ;RB4〜RB7割り込み発生許可
;---------------------------------------------------------------
;タイマー割り込みの設定
;---------------------------------------------------------------
movlw 0x00 ;タイマー値リセット
movwf TMR0
bsf STATUS,5 ;ページを1に切り替え
bsf OPTION_REG,0 ;PS0 プリスケーラの設定
bsf OPTION_REG,1 ;PS1
bsf OPTION_REG,2 ;PS2
bsf OPTION_REG,3 ;PSA プリスケーラをTMRで使用する場合は0,WDTで使用する場合は1
bcf OPTION_REG,5 ;T0CS タイマ0の入力先 1でRA4ピン入力,0でクロック1/4入力
bcf STATUS,5 ;ページを0に切り替え
bsf INTCON,5 ;タイマ割り込み発生許可
;---------------------------------------------------------------
;割り込みの開始
;---------------------------------------------------------------
bsf INTCON,7 ;割り込み許可
;***************************************************************
;メイン
;***************************************************************
APP_INIT
;所定の変数を初期化しておかないと起動時に意図しない動作をする可能性がある
MOVLW 0x00 ;Wレジスタに値を代入
MOVWF READ_BUF ;WレジスタからFレジスタに代入
MOVLW 0x00 ;Wレジスタに値を代入
MOVWF SEND_BUF ;WレジスタからFレジスタに代入
MOVLW 0x00 ;Wレジスタに値を代入
MOVWF SEND_COUNTER ;WレジスタからFレジスタに代入
;MAX3232への出力は反転しているため、最初はHiを出力しておく必要がある
BSF PORTA,1 ;指定ビットに1を立てる
main
;-------------------------------------
;読み出し中の場合は待機するループ
;--------------------------------------
READ_WAIT
TSTF READ_COUNTER ;READ_COUNTERがゼロかテストする
BNZ READ_WAIT ;ゼロ以外のときジャンプ
READ_WAIT_END
;-------------------------------------
MOVFW READ_BUF ;WレジスタにFレジスタを代入
MOVWF PORTB ;FレジスタにWレジスタを代入
;-------------------------------------
;送信中の場合は待機するループ
;-------------------------------------
SEND_WAIT
TSTF SEND_BUF ;SEND_BUFがゼロかテストする
BNZ SEND_WAIT ;ゼロ以外のときジャンプ
SEND_WAIT_END
;-------------------------------------
MOVFW PORTB ;WレジスタにFレジスタを代入
MOVWF SEND_BUF ;FレジスタにWレジスタを代入
goto main
; call wait_loop
; COMF PORTB,1 ;Fレジスタを反転
;---------------------------------------------------------------
;ウエイト
;---------------------------------------------------------------
wait_loop
MOVLW 0x00
MOVWF wait_val1
wait_loop1
MOVLW 0x00
MOVWF wait_val2
wait_loop2 NOP
decfsz wait_val2,F
goto wait_loop2
decfsz wait_val1,F
goto wait_loop1
return
END
20060915 作成
▲トップページ
>
マイコンなど