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 作成


▲トップページ > マイコンなど