goo blog サービス終了のお知らせ 

インドアプレーンとロボット

趣味のロボットとインドアプレーンを紹介します。 K O B A R A

プログラム

2007-11-12 00:48:18 | 飛行機 技術情報

PICのプログラムを少し勉強してみました。
LEDピカピカも良いのですが、少し実用的なものという事で、
赤外センサの受けている信号を1個ずつ分けて各ポートに出すだけで
サーボやアンプの信号として使え、そのまま受信機としても使えます。
このプログラムは田中さんの”PICマイコンでつくるインドアプレーン”の本に詳しく解説されていて、プログラムもあるのですが、
あまり読むと同じ物になってしまいそうなので、横目でながめつつ、自分なりにプログラムを組んでみました、
そしてやっと何とか動くプログラムになりました




上がセンサの出力信号 下が各ポートに出力される信号






恥ずかしながら、ソースです。


        LIST	P=12F629
	INCLUDE	P12F629.INC

CB = _CPD_OFF			;データEEPROMもプログラム・メモリも
CB &= _CP_OFF			;コード・プロテクトしない。
CB &= _BODEN_OFF		;ブラウンアウト・リセットを使わない。
CB &= _MCLRE_OFF		;MCLRリセットを使わない。
CB &= _PWRTE_ON			;パワーアップ・タイマを使う。
CB &= _WDT_OFF			;ウォッチドッグ・タイマを使わない。
CB &= _INTRC_OSC_NOCLKOUT 	;内部発振器を使う。

	__CONFIG CB

		
C1	equ	20h		;タイマカウンター
C2	equ	21h		;カウンター上位


	org	0		;電源onスタート
	bsf	STATUS,RP0	;バンク 1 にする。

	call	3FFh
	movwf	OSCCAL		;内部発信校正値の書き込み

	movlw	b'00001000'	;入出力ポートの設定GP3のみ入力
	movwf	TRISIO		;他は出力設定

	bcf	STATUS,RP0	;バンク 0 にする。
	
	movlw	b'00000111'	;GP0~GP2までのコンパレータ解除
	movwf	CMCON


;////////////////////////////////////////////////////////////

				;メインルーチン

MAIN	clrf	GPIO		;出力ポートクリア
	
LOOP	btfss	GPIO,3		;入力LOならループ	
	goto	LOOP
	
	movlw	d'250'
	movwf	C2		;カウンタ250セット
	
M1	btfss	GPIO,3		;入力LOならループ	
	goto	LOOP	

	nop	
	nop
	nop			;10us×250回=2.5ms
	nop
	nop	
			
	decfsz	C2,F		;C2-1=0なら先頭ブランク発見
	goto	M1

M2	btfsc	GPIO,3		;入力HIならループ
	goto	M2		;先頭の立下り待ち
	
	bsf	GPIO,0		;GP0をHIにする
	
	call	T700us		;GP3入力立ち上がり待ち
	
M3	btfsc	GPIO,3		;入力HIならループ
	goto	M3		;次の立下り待ち
	
	bcf	GPIO,0		;GP0をLOにする
	bsf	GPIO,1		;GP1をHIにする
	
	call	T700us		;GP3入力立ち上がり待ち	
	
M4	btfsc	GPIO,3		;入力HIならループ
	goto	M4		;次の立下り待ち
	
	bcf	GPIO,1		;GP1をLOにする
	bsf	GPIO,2		;GP2をHIにする
	
	call	T700us		;GP3入力立ち上がり待ち	
	
M5	btfsc	GPIO,3		;入力HIならループ
	goto	M5		;次の立下り待ち
	
	bcf	GPIO,2		;GP2をLOにする
	bsf	GPIO,4		;GP4をHIにする
	
	call	T700us		;GP3入力立ち上がり待ち
	
M6	btfsc	GPIO,3		;入力HIならループ
	goto	M6		;次の立下り待ち
	
	bcf	GPIO,4		;GP4をLOにする
	
		
	goto	LOOP


;/////////////////////////////////////////////////////////////

T700us	movlw	d'161'		;約700μsのタイマループ
	movwf	C1

T700J1	nop
	decfsz	C1,F
	goto	T700J1
	nop
	return

;/////////////////////////////////////////////////////////////


	end