;**************************************************************************** ;* ;* チーズ・スパイス ラジコン制御用プログラム ;* 4MHz 12C509A PICプログラム MPASM版 ;* ;* 製作参考記事 (1). 飯島幹雄氏のチーズ・スティック改造 ;* (2). Kazuhiko Kawada 機体発見用ブザー ;* ;* 製作協力 西口氏 (受信機出力パルス波形図を見せてもらえた) ;* 黒澤氏 (デバック用の送信機&受信機を借りた) ;* (テスト空撮で機体を貸してくれて操縦もしてくれた) ;* ;* Version 0.2 2001/11/10 << ラジコン飛行機フライト写真 by じゃま >> ;**************************************************************************** ; ; PIC12C509Aの各ピン ; GP0 7pin IN: 受信機からのパルス ; GP1 6pin IN: スタートSW(Hi:プログラムスタート) ; GP2 5pin IN: DIP−SW[1] ; GP3 4pin IN: DIP−SW[2] ; GP4 3pin OUT:CAM・シャッターSW(Low:ON) ; GP5 2pin OUT:CAM・モードSW(Low:ON) ; Vcc 1pin ; GND 8pin ; ; #define IFEQ BTFSC STATUS,Z #define IFNE BTFSS STATUS,Z #define IFCS BTFSC STATUS,C #define IFCC BTFSS STATUS,C #define IFBS BTFSS STATUS,C #define IFBC BTFSC STATUS,C LIST P=12C509 #include "P12C509.INC" ;------------- ;定数 ;------------- EPCOUNT equ D'3' ; パルス幅確定カウント ;------------- ; 変数 ;------------- r1 EQU 07 ;一時的に使用するレジスタ r2 EQU 08 ; r3 EQU 09 ; tm1 EQU 0A ; tm2 EQU 0B ; tm3 EQU 0C ; DIPMODE EQU 0D ; DIP mode FLG SHOT EQU 0E ; ショット許可フラグ(0:可能, 1:不可) LIMIT1 EQU 0F ; ショート・パルス幅スレッショルド値 LIMIT2 EQU 10 ; ロング・パルス幅スレッショルド値 MODE1 EQU 11 ; MODE1 MODE2 EQU 12 ; MODE2 WCOUNT EQU 13 ; パルス幅カウント退避 PSCOUNT EQU 14 ; パルス幅(S)確定フラグ(ダウンカウント式) PLCOUNT EQU 15 ; パルス幅(L)確定フラグ(ダウンカウント式) ORG 0 GOTO START ;******************************************************************* ;* 入力パルスがLowになるのを待つ ;* タイムアウトは5.1ms(正常なパルスは2ms以内) ;* ;* INPUT.... ;* OUTPUT... Wレジ: 1=タイムアウトしていない 0=タイムアウト ;* r1: 待った時間(*20μs) ;* r2,r3: 不定 ;******************************************************************* waitForL clrf r1 ;待ち時間のカウント、20μs毎に+1 waitForL02 nop btfss GPIO,0 ;入力Hならスキップ retlw 1 ;w=1でリターン(タイムアウトしてないという意味) ;入力Hの場合 nop movlw D'4' ;この下のループ(3cyc)の繰り返し数 入力の周期が20μsになるように movwf r2 waitForL01 decfsz r2,f ;r2を-1して0になったらスキップ goto waitForL01 ;0になるまでループ incfsz r1,f ;待ち時間カウンタを+1 goto waitForL02 ;カウントが256に達してなければ入力チェックから繰り返す retlw 0 ;w=0でリターン(タイムアウトしたという意味) ;******************************************************************* ;* 入力パルスがHighになるのを待つ ;* タイムアウトは51ms(正常なパルスは20ms程度) ;* ;* INPUT.... ;* OUTPUT... Wレジ: 1=タイムアウトしていない 0=タイムアウト ;* r1: 待った時間(*約200μs) ;* r2,r3: 不定 ;******************************************************************* waitForH clrf r1 ;r3が200μs毎に+1 waitForH03 movlw D'33' movwf r3 ;待ち時間のカウント、6μs毎に-1 waitForH02 nop btfsc GPIO,0 ;入力Lならスキップ retlw 1 ;w=1でリターン(タイムアウトしてないという意味) ;入力Lの場合 decfsz r3,f ;待ち時間カウンタを-1 goto waitForH02 ; 次の入力を繰り返す ;r3が0になった incfsz r1,f ;300μs毎に+1 goto waitForH03 ;256カウントに達してないときは、また10回の入力チェックから繰り返す retlw 0 ;w=0でリターン(タイムアウトしたという意味) ;*********************************** ;* ;* プログラム RESET スタート ;* ;*********************************** START BCF STATUS,PA0 ; PAGE=0 MOVLW B'00110000' ; GP4,GP5 Hでオフ MOVWF GPIO MOVLW B'00001111' ; GP0..3 INPUT, GP4..5 OUTPUT TRIS GPIO NOP MOVLW B'10010011' ; PRESCALER=TMR0 1:16 OPTION ;----------------------------- ; RAM CLEAR ;----------------------------- MOVLW 07 MOVWF FSR START01 CLRF INDF INCF FSR,F MOVLW B'00011111' ANDWF FSR,W IFNE GOTO START01 CLRF FSR ;----------------------------- ; 変数の初期設定 ;----------------------------- MOVLW 0 MOVWF SHOT ; ショット許可とする MOVLW EPCOUNT MOVWF PSCOUNT ; パルス幅(S)確定フラグRESET(ダウンカウント=3) MOVWF PLCOUNT ; パルス幅(L)確定フラグRESET(ダウンカウント=3) MOVLW D'60' MOVWF LIMIT1 ; ショート・パルス幅スレッショルド値のSET MOVLW D'90' MOVWF LIMIT2 ; ロング・パルス幅スレッショルド値のSET MOVLW 1 MOVWF MODE1 ; MODE1 パラメータ比較値 MOVLW 2 MOVWF MODE2 ; MODE2 パラメータ比較値 ;******************************************* ;* ;* メインループ ;* ;******************************************* MAIN BTFSC GPIO,1 ; START−SWはオンか GOTO MAIN2 MOVLW EPCOUNT MOVWF PSCOUNT MOVWF PLCOUNT MAIN2 BTFSS GPIO,1 ; チャタリング防止の為、再確認 GOTO MAIN ;---------------------------------------------- ; DIP−SW チェック ; GP2=0 GP3=0 .. mode0: 自動シャッター(受信パルス無視) ; GP2=1 GP3=0 .. mode1: 単発シャッター(受信パルス応答) ; GP2=0 GP3=1 .. mode2: 2発シャッター(同上)(予備モード) ; GP2=1 GP3=1 .. mode3: 3発シャッター(同上)(予備モード) ;---------------------------------------------- BTFSC GPIO,3 GOTO DIPXX BTFSC GPIO,2 GOTO DIP01 DIP00 MOVLW 0 ; mode0 SET GOTO DIPEND DIP01 MOVLW 1 ; mode1 SET GOTO DIPEND DIPXX BTFSC GPIO,2 GOTO DIP03 DIP02 MOVLW 2 ; mode2 SET GOTO DIPEND DIP03 MOVLW 3 ; mode3 SET DIPEND MOVWF DIPMODE ; mode SET ;--------------------------- ; モード分岐 ;--------------------------- MOVF DIPMODE,F ; modeチェック IFEQ GOTO AUTORUN ; mode0 自動シャッター処理 ;********************************************** ;* ;* 受信パルス応答処理 ;* ;********************************************** ;--------------------------------------- ; パルス入力がLowになるのを待つ ;--------------------------------------- CALL waitForL IORLW 0 IFEQ GOTO PRCVFAIL ; パルス入力タイムアウト ;--------------------------------------- ; パルス入力がHighになるのを待つ ;--------------------------------------- CALL waitForH IORLW 0 IFEQ GOTO PRCVFAIL ; パルス入力タイムアウト ;--------------------------------------- ; パルス入力がLowになるのを待つ ;--------------------------------------- CALL waitForL IORLW 0 IFEQ GOTO PRCVFAIL ; パルス入力タイムアウト ;-------------------------------------------- ; Highのパルス幅をチェック ; 1.8ms(90カウント)以上をロング幅とする ;-------------------------------------------- MOVF r1,W ; 入力Lまで待った時間(=パルス幅) SUBWF LIMIT2,W ; ロング幅チェック IFCC GOTO PRCV040 ; ショート幅 ;-------------------------------------------- ; High−ロング幅の確定チェック ; 3回連続してHigh−ロング幅なら確定 ;-------------------------------------------- DECFSZ PLCOUNT,F GOTO MAIN ;-------------------------------------------- ; High−ロング幅の処理 ; ショット可能ならシャッター処理へ ;-------------------------------------------- MOVF SHOT,W IFEQ GOTO SHOTPRO ; シャッター処理へ ;-------------------------------------------- ; ショット不可 <処理パス> ;-------------------------------------------- MOVLW EPCOUNT MOVWF PSCOUNT MOVWF PLCOUNT GOTO MAIN ;-------------------------------------------- ; Highのパルス幅をチェック ; 1.2ms(60カウント)以下をショート幅とする ;-------------------------------------------- PRCV040 MOVF r1,W ; 入力Lまで待った時間(=パルス幅)を退避 MOVWF WCOUNT MOVF LIMIT1,W SUBWF WCOUNT,W ; ショート幅チェック IFCC GOTO PRCV060 ; パルス幅ミスマッチ ;-------------------------------------------- ; High−ショート幅の確定チェック ; 3回連続してHigh−ショート幅なら確定 ;-------------------------------------------- DECFSZ PSCOUNT,F GOTO MAIN ;-------------------------------------------- ; High−ショート幅の処理 ;-------------------------------------------- MOVLW 0 MOVWF SHOT ; ショット許可とする PRCV060 MOVLW EPCOUNT MOVWF PSCOUNT MOVWF PLCOUNT GOTO MAIN ;********************************************** ;* ;* 受信パルス応答シャッター処理 ;* ;********************************************** SHOTPRO ;---------------------------------- ; カメラ(ウエイクアップ) ;---------------------------------- BCF GPIO,5 ; モードSW ON CALL WAITS ; 待ち BSF GPIO,5 ; モードSW OFF CALL WAIT CALL WAIT ;---------------------------------- ; カメラシャッター処理(1発目) ;---------------------------------- BCF GPIO,4 ; シャッターSW ON CALL WAITS ; 待ち BSF GPIO,4 ; シャッターSW OFF CALL WAIT MOVF DIPMODE,W ; mode チェック SUBWF MODE1,W IFEQ GOTO SHOTEND ;---------------------------------- ; カメラシャッター処理(2発目) ;---------------------------------- BCF GPIO,4 ; シャッターSW ON CALL WAITS ; 待ち BSF GPIO,4 ; シャッターSW OFF CALL WAIT MOVF DIPMODE,W ; mode チェック SUBWF MODE2,W IFEQ GOTO SHOTEND ;---------------------------------- ; カメラシャッター処理(3発目) ;---------------------------------- BCF GPIO,4 ; シャッターSW ON CALL WAITS ; 待ち BSF GPIO,4 ; シャッターSW OFF CALL WAIT ;---------------------------------- ; カメラ(スタンバイ・モード移行) ;---------------------------------- SHOTEND BCF GPIO,5 ; モードSW ON CALL WAITS ; 待ち BSF GPIO,5 ; モードSW OFF CALL WAIT CALL WAIT BCF GPIO,4 ; シャッターSW ON CALL WAITS ; 待ち BSF GPIO,4 ; シャッターSW OFF ; MOVLW EPCOUNT MOVWF PSCOUNT MOVWF PLCOUNT MOVLW 1 MOVWF SHOT ; ショット済み(不可)とする ; GOTO MAIN ;********************************************** ;* ;* 受信パルス入力タイムアウト処理 ;* ;********************************************** PRCVFAIL MOVLW EPCOUNT MOVWF PSCOUNT MOVWF PLCOUNT GOTO MAIN ;********************************************** ;* ;* mode0 自動シャッター処理 ;* ;********************************************** AUTORUN BTFSS GPIO,1 ; START−SWはOFFか GOTO MAIN ; 初期へ GOTO BWAIT ; インターバルタイマールーチンへ BWAITR ;---------------------------------- ; カメラシャッター処理(自動単発) ;---------------------------------- CANON00 BCF GPIO,5 ; モードSW ON CALL WAITS ; 待ち BSF GPIO,5 ; モードSW OFF CALL WAIT CALL WAIT BCF GPIO,4 ; シャッターSW ON CALL WAITS ; 待ち BSF GPIO,4 ; シャッターSW OFF CALL WAIT CALL WAIT BCF GPIO,5 ; モードSW ON CALL WAITS ; 待ち BSF GPIO,5 ; モードSW OFF CALL WAIT CALL WAIT BCF GPIO,4 ; シャッターSW ON CALL WAITS ; 待ち BSF GPIO,4 ; シャッターSW OFF GOTO MAIN ; 初期へ ;======================================== ; ロングタイマー サブルーチン ;======================================== WAIT MOVLW D'2' MOVWF tm1 WAIT2 CLRF tm3 WAIT0 CLRF tm2 WAIT1 NOP DECFSZ tm2,F GOTO WAIT1 DECFSZ tm3,F GOTO WAIT0 DECFSZ tm1,F GOTO WAIT2 RETLW 0 ;======================================== ; ショートタイマー サブルーチン ;======================================== WAITS MOVLW D'1' MOVWF tm1 WAITS2 MOVLW D'180' MOVWF tm3 WAITS0 CLRF tm2 WAITS1 NOP DECFSZ tm2,F GOTO WAITS1 DECFSZ tm3,F GOTO WAITS0 DECFSZ tm1,F GOTO WAITS2 RETLW 0 ;---------------------------------------- ; インターバルタイマー処理 ; 15秒タイマー (暫定値です) ;---------------------------------------- BWAIT MOVLW D'30' MOVWF tm1 BWAIT2 CLRF tm3 BWAIT0 CLRF tm2 BWAIT1 NOP BTFSS GPIO,1 ; START−SWはOFFか GOTO MAIN ; 初期へ DECFSZ tm2,F GOTO BWAIT1 DECFSZ tm3,F GOTO BWAIT0 DECFSZ tm1,F GOTO BWAIT2 GOTO BWAITR END