;********************************************************************* ; ; 509A18.ASM Jan. 12, 2001 ; ; エレクトロニック・キーヤ OIKey 509 ; ; by JH2OIK / HIDAKA Hiroshi ; ; 主仕様 ; ; 1.電源入力は DC 4.5V (ブザーを使わない場合3〜4.5V) ; 2.ドットとダッシュのパドル入力はともにフルタイム記憶付き ; 3.外部発振によるスピード調整方式 ; 4.キーイング出力は送信機用とサイドトーン用の2点装備 ; 5.スイッチ切替によりバグキーモードにもなる ; 6.パワーセーブモードにより省エネができる ; ;********************************************************************* ; ; デバイス:Microchip Technology 社製 ; 8ビット マイクロコントローラ PIC12C509 ; ; クロック周波数:RC外部接続可変発振(1MHz以下) ; ; 外部接続機器 ; PICピン番号@ Vdd=電源 ; PICピン番号A OSC=発振用 RC入力 ; PICピン番号B GP4=モニター出力(ON-OFF出力) ; PICピン番号D GP2=送信機用キー出力 ; PICピン番号E GP1=DOT パドル入力 ; PICピン番号F GP0=DASH パドル入力 ; PICピン番号G Vss=GND ; ;********************************************************************* ; LIST P=12C509, R=DEC #INCLUDE ERRORLEVEL -302 ; __CONFIG _MCLRE_OFF & _CP_OFF & _WDT_OFF & _ExtRC_OSC ; ;--------------------------------------------------------------------- ; [1] レジスタの登録 ;--------------------------------------------------------------------- LIST ; #DEFINE DASH_KEY GPIO,0 ;DASH パドル #DEFINE DOT_KEY GPIO,1 ;DOT パドル #DEFINE TO_TX GPIO,2 ;送信機用キー出力 #DEFINE BUG_KEY_SW GPIO,3 ;BUG キースイッチ入力 #DEFINE TO_MONITOR GPIO,4 ;モニター出力 ; DCNT EQU H'0010' ;符号発生用カウンタのためのレジスタ DCNT2 EQU H'0011' ;符号発生用カウンタ2のためのレジスタ DCNT3 EQU H'0012' ;符号発生用カウンタ3のためのレジスタ ; KEYMEM EQU H'0013' ;キー ON-OFF メモリ用レジスタ ; LIST ; ;--------------------------------------------------------------------- ; [2] スタートプログラム(設定) ;--------------------------------------------------------------------- ; ORG 0 ;0 番地から書込む ; START BCF STATUS,PA0 ;ページ 0 (バンク 0) ; ;****** [2-1] I/O の 設定 ****************************************** ; MOVLW B'00101011' ;ポート 用途 ;------------------------------------- ;bit7=0 使用していない ;bit6=0 使用していない ;bit5=1 GP5 外部発振 CR 入力 ;bit4=0 GP4 モニタ 出力 ;bit3=1 GP3 バグキースイッチ 入力 ;bit2=0 GP2 送信機用キー 出力 ;bit1=1 GP1 DOT パドル  入力 ;bit0=1 GP0 DASH パドル  入力 ; TRIS GPIO ;GPIOに'00101011'を書込み入出力を決定 ; ; ; ;****** [2-2] OPTION の 設定 *************************************** ; MOVLW B'00010111' ;bit7=0 ピン変化ウエイクアップイネーブル ;bit6=0 弱プルアップ イネーブル ;bit5=0 タイマは内部クロック ;bit4=1 タイマ入力 HIGH→LOW でインクリメント ;bit3=0 プリスケーラはタイマに割り当て ;bit2〜0=111 プリスケーラは 1:128 ; OPTION ;OPTION レジスタに書込み ; ;****** [2-3] I/O の 初期値 *************************************** ; BSF DASH_KEY ;ダッシュパドル入力無し BSF DOT_KEY ;ドットパドル 入力無し BSF BUG_KEY_SW ;バッグキー入力無し BCF TO_TX ;送信機向けキー出力無し BCF TO_MONITOR ;モニター出力無し ; ;****** [2-4] 起動遅延 ******************************************** ; MOVLW 100 ;100 命令分の時間遅延 MOVWF DCNT ;クロック 1MHz のとき4μSec/コマンド LOOP DECFSZ DCNT,F ;2+(3*100)-1=301コマンド GOTO LOOP ; 301コマンド * 4μSec/コマンド=約1.2mSec ; ;--------------------------------------------------------------------- ; [3] パドルの開閉検出 ;--------------------------------------------------------------------- MAIN BTFSS DOT_KEY ;DOT KEY on なら GOTO DOT ;DOT [4-1] へ off なら次へシフト BTFSS DASH_KEY ;DASH KEY on なら GOTO DASH ;DASH [5-1]へ off なら次へシフト MOVF GPIO,F ;SLEEP実施前にGPIO の中身を読む SLEEP ;パワーセーブ(スリーフ)モードに入りクロック発振を ;停止して省エネを計る ;スリープ中にパドル操作があれば目を覚まして GOTO MAIN ;MAIN へ ; ;--------------------------------------------------------------------- ; [4] ドット ;--------------------------------------------------------------------- ;****** [4-1] ドットの送信 **************************************** ; DOT BSF TO_TX ;キー出力 ON BSF TO_MONITOR ;モニタ出力 ON CLRF KEYMEM ;パドルメモリをクリヤする MOVLW 5 ;5 を W レジスタに入れる MOVWF DCNT ;その値を DCNT に入れる DOTDL MOVLW 15 ;15 を W レジスタに入れる MOVWF DCNT2 ;その値を DCNT2 カウンタにセット BTFSS DASH_KEY ;ダッシュパドルが押されているか CALL DASKM ;押されているなら[6]で記憶する DOTDL2 CALL SIGSUB ;シグナルサブルーチン[7]を呼出す DECFSZ DCNT2,F ;カウントする GOTO DOTDL2 ;カウンタがゼロでなければ繰り返す DECFSZ DCNT,F ;カウントする GOTO DOTDL ;カウンタがゼロでなければ繰り返す BCF TO_TX ;キー出力 OFF BCF TO_MONITOR ;モニタ出力 OFF ; ;****** [4-2] ドットに続くスペース送信 **************************** ; MOVLW 5 ;5 を W レジスタに入れる MOVWF DCNT ;その値を DCNT に入れる SPDOT MOVLW 13 ;13 を W レジスタに入れる MOVWF DCNT2 ;DCNT2 カウンタにセット SPDOT2 BTFSS DASH_KEY ;ダッシュパドルが押されているか CALL DASKM ;押されているなら[6]で記憶する CALL SIGSUB ;シグナルサブルーチン[7]を呼出す DECFSZ DCNT2,F ;カウントする GOTO SPDOT2 ;カウンタがゼロでなければ繰り返す DECFSZ DCNT,F ;カウントする GOTO SPDOT ;カウンタがゼロでなければ繰り返す BTFSC KEYMEM,0 ;ダッシュキー ON (クリヤ) か GOTO DASH ;ON なら DASH [5-1]へ GOTO MAIN ;OFF なら MAIN へ戻る ; ; ; ; ; ; ;-------------------------------------------------------------------- ; [5] ダッシュ ;-------------------------------------------------------------------- ;****** [5-1] ダッシュ送信 **************************************** DASH BTFSS BUG_KEY_SW ;バックキー SW ON か? GOTO BUGKEY ;ON なら BUCKEY [5-3]へ OFF なら次へ BSF TO_TX ;キー出力 ON BSF TO_MONITOR ;モニタ出力 ON CLRF KEYMEM ;パドルメモリをクリヤする MOVLW 15 ;15 の値を W に入れる MOVWF DCNT ;その値を DCNT へ入れる DSHDL MOVLW 15 ;15 の値を W に入れる MOVWF DCNT2 ;その値を DCNT2 へ入れる DSHDL2 CALL SIGSUB ;シグナルサブルーチン[7]を呼出す BTFSS DOT_KEY ;ドットパドルが押されているか CALL DOTKM ;押されているなら[6]で記憶する DECFSZ DCNT2,F ;カウンタは終了したか、終了なら次にスキップ GOTO DSHDL2 ;まだなら DSHDL2 へ戻る DECFSZ DCNT,F ;カウンタは終了したか、終了なら次にスキップ GOTO DSHDL ;まだなら DSHDL へ戻る BCF TO_TX ;キー出力 OFF BCF TO_MONITOR ;モニタ出力 OFF ; ;****** [5-2] ダッシュに続くスペース送信 ************************** ; SPDSH MOVLW 5 ;5 を W レジスタへ入れる MOVWF DCNT ;その値を DCNT へ入れる SPDSH2 MOVLW 13 ;13 の値を W に入れる MOVWF DCNT2 ;その値を DCNT2 へ入れる SPDSH3 BTFSS DOT_KEY ;ドットパドルが押されているか CALL DOTKM ;押されているなら[6]で記憶する CALL SIGSUB ;シグナルサブルーチン[7]を呼出す DECFSZ DCNT2,F ;カウンタは終了したか、終了なら次にスキップ GOTO SPDSH3 ;まだなら繰り返す DECFSZ DCNT,F ;カウンタは終了したか、終了なら次にスキップ GOTO SPDSH2 ;まだなら繰り返す BTFSC KEYMEM,1 ;ドットパドル ON か GOTO DOT ;ON なら DOT [4-1]へ GOTO MAIN ;OFF なら MAIN へ戻る ; ;****** [5-3] バグキーモードでのダッシュ送信 ********************* ; BUGKEY BSF TO_TX ;キー出力 ON BSF TO_MONITOR ;モニタ出力 ON CLRF KEYMEM ;パドルメモリをクリヤする BUGDSH CALL SIGSUB ;シグナルサブルーチン[7]を呼出す BTFSS DOT_KEY ;ドットパドルが押されているか CALL DOTKM ;押されているなら記憶する BTFSC BUG_KEY_SW ;バグキー SW はまだ ON か GOTO BMEND ;SW OFF になったのでこのモードは終り BTFSS DASH_KEY ;ダッシュパドルはまだ押されているか GOTO BUGDSH ;押されているなら BUGDSH へループ BMEND BCF TO_TX ;ダッシュパドル OFFなら キー出力 OFF BCF TO_MONITOR ;モニタ出力も OFF GOTO SPDSH ;ダッシュ後のスペースサブルーチン[5-2]へ ; ;-------------------------------------------------------------------- ; [6] パドル 入力 の 記憶 ;-------------------------------------------------------------------- DOTKM MOVLW B'00000010' ;ドット パドル ON を記憶 MOVWF KEYMEM RETURN ;呼び出したプログラムに戻る ; DASKM MOVLW B'00000001' ;ダッシュ パドル ON を記憶 MOVWF KEYMEM RETURN ;呼び出したプログラムに戻る ; ;-------------------------------------------------------------------- ; [7] シグナルサブルーチン ;-------------------------------------------------------------------- SIGSUB MOVLW 80 ;80 を W レジスタに入れる MOVWF DCNT3 ;その値を DCNT3 に入れる SIG1 GOTO $+1 ;2命令分の遅延時間を取る DECFSZ DCNT3,F ;DCNT3 がゼロなら次を飛越える GOTO SIG1 ;DCNT3 がゼロでなければ SIG1 へ RETURN ;呼び出したプログラムに戻る ; END