; GPS表示装置(2) ; 1/100カウンタ&OSD表示 ; 2000.09.22 (c) JJ3ZLA ; PIC16F84専用(16C84は不可) ; PA.EXE専用 .include 16f84.h .osc hs .wdt off .pwrt on .protect off ; ; タイミング入出力設定 vsyo equ ra.4 ;垂直同期 入力 pout equ rb.4 ;LED 出力 動作チェック用 pps equ rb.0 ;PPS 入力 ; RS232C用定数 btime equ 24 ;@ 8MHz rxd equ rb.5 ;RS232C DATA入力 ; スーパー出力設定 clk equ rb.1 ;スーパークロック cs equ rb.2 ;スーパーチップセレクト data equ rb.3 ;スーパーデータアウト sde equ rb.6 ;同期検出ポート org 0ch cnt10m ds 1 ;1/100sec用カウンタ w_save ds 1 ;Wレジスタ退避用 s_save ds 1 ;STATASレジスタ退避用 wait_cn ds 1 ;ウエイト用カウンタ cnt1 ds 1 ;カウンタ1 cnt2 ds 1 ;カウンタ2 ; RS DATA用定数 ch ds 1 ;汎用データ受け渡し rsw ds 1 ;ウェイト時間調整用 rcn ds 1 ;ビット数 cn ds 1 ;スーパー用カウンタ ; ビデオスーパー用定数 vcn ds 1 ;垂直同期カウンタ flg ds 1 ;RS_data flg sdef ds 1 ;SDE check intflg ds 1 ;RB0/int flg ; 時間データ用 hor ds 1 min ds 1 sec ds 1 msec ds 1 ; ; スーパーDATA用定数 tdata ds 1 ;スーパーDATA用 com ds 1 ;コマンド変換用 cma ds 1 cmb ds 1 cmc ds 1 ; ;============================================================================== ; ; プログラムスタート ; org 0 goto start ;============================================================================== ;intrrapt start org 4 movwf w_save ;wレジスタを保存 movf status,w ;statausレジスタをwレジスタに退避保存 clrf status ;statusレジスタをクリアして movwf s_save ;退避したstatusレジスタの内容を保存 checktimer0 ;TMR0 btfss intcon,2 ;T0IF タイマ割り込みかチェック goto checkint ;タイマ割り込みでない場合はRB0/INTへ nop nop ;カウンタ時間調整用 nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop movlw 64h ;タイマがすぐにカウントアップするように movwf tmr0 ;TMR0へ100(64h)を代入 bcf intcon.2 ;T0IF タイマ割り込みフラグのクリア setb intflg.1 ;タイマ割り込みのフラッグ設定 inc cnt10m ;10msカウンタに1を加算 checkint ;RB0/INT 1PPS割り込みでLOOP btfss intcon,1 ;INTF RB0の割り込みかチェック goto intend ;RB0割り込みでない場合は割り込み終了処理 movlw 64h ;タイマがすぐにカウントアップするように movwf tmr0 ;TMR0へ100(64h)を代入 bcf intcon.2 ;T0IF タイマ割り込みフラグのクリア clrf cnt10m ;10msカウンタをクリア setb intflg.0 ;RB0割り込みのフラッグ設定 setb intflg.1 ;タイマ割り込みのフラッグ設定 bcf intcon.1 ;INTF RB0割り込みフラグをクリア intend clrf status ;statusレジスタをクリア movf s_save,w ;statusレジスタを movwf status ;割り込み前の状態に復帰 swapf w_save ;wレジスタを割り込み前の状態に復帰 swapf w_save,w retfie ;intrrapt end ;============================================================================== start ; ポート初期化 mov !ra,#00010000b ;入力=RA4 他出力 mov !rb,#01100001b ;RB5 RB6 RB0入力 clr ra clr rb bsf pout mov wait_cn,#8 call tim100 ;インポーズIC安定化ウエイト bsf clk ;スーパーrb.1をH bsf cs ;スーパーrb.2をH bsf data ;スーパーrb.3をH call super ;スーパーインポーズLSI初期化 mov sdef,#1 bsf 3.5 mov 081h,#086h ;タイマ、プリスケーラ128設定 bcf 3.5 ;////////////////////////////////////////////////////// main ppsch btfsc pps ;1PPSが来るまで待つ goto ppsch mov tmr0,#64h ;TMR0へカウンタ設定 movlw 10110000b movwf intcon ;割り込み許可 (intcon=08h) loop syn1 btfsc vsyo ;垂直同期信号待ち goto syn1 mov msec,cnt10m ;msecへカウント転送 clrb intflg.1 ;タイマ割り込みフラッグクリア call rsdata ;データ読み込み btfss intflg.1 ;タイマ割り込みフラッグチェック goto syn11 call rsdata ;必要ならもう一度読み込み syn11 call transd ;時刻コマンド転送 call transm ;1/100転送 clrb intflg.0 ;RB0割り込みフラッグクリア mov vcn,#57 syn2 btfsc vsyo ;57回分くりかえし goto syn2 mov msec,cnt10m ;msecへカウント転送 call transm ;1/100転送 djnz vcn,syn2 call chksde ;映像信号検出チェック syn3 btfsc vsyo ;垂直同期信号待ち goto syn3 btfsc intflg.0 ;RB0割り込みチェック goto syn31 mov msec,cnt10m ;msecへカウント転送 call transm ;1/100転送 goto syn3 syn31 ; clrb intflg.0 goto loop ;///////////////////// 同期検出制御 chksde btfss sdef.0 ; 内部 H 外部 L goto chksd1 ; chksd0 btfss sde ; 内部モードから外部へのチェック goto sdel ret chksd1 btfsc sde ; 外部モードから内部モードへ goto sdeh ret sdel clrf intcon mov tdata,#40h ; 外部入力モード call trans00 call trans03 bcf sdef.0 goto main sdeh clrf intcon mov tdata,#45h ; 内部発振モード call trans00 call trans03 bsf sdef.0 goto main ;************************************************ ; recevie pro ;************************************************ rsdata bcf pout call receive ;時刻数値受信 mov hor,ch ;時間レジスタへ転送 call receive ;時刻数値受信 mov min,ch ;分レジスタへ転送 call receive ;時刻数値受信 mov sec,ch ;秒レジスタへ転送 bsf pout ret ;////////////////////////////////////////////////// ; 時刻数値受信ルーチン ;////////////////////////////////////////////////// receive rec10 jb rxd,rec10 ;STARTビットがくるまで待つ r1rxon mov rsw,#btime/2 ; 1/2ビット分待つ rec11 djnz rsw,rec11 mov rcn,#8 nop rec12 mov rsw,#btime rec13 djnz rsw,rec13 nop movb c,rxd ; データ入力 rr ch djnz rcn,rec12 mov rsw,#btime/2 ; 1/2ビット分待つ rec14 djnz rsw,rec14 rec15 jnb rxd,rec15 ;ストップビットを待つ mov flg,#1 ret ;1文字受信終了、戻る rs1rxc ;データが来ているかチェックし受信する jnb rxd,r1rxon ;スタートビットが立っていれば受信 clr flg ret ;********************************************* ; スーパーインポーズLSIの初期化 ;********************************************* super mov tdata,#48h ;NTSC set call trans00 call trans03 mov tdata,#51h ;4fsc interlace call trans00 call trans03 mov tdata,#00h ;RAM一括解除コマンド call trans00 call trans03 mov wait_cn,#5 call tim100 ;ウエイト mov tdata,#5ch ;sincronaize on call trans00 call trans03 mov tdata,#82h ;表示位置 set call trans00 mov tdata,#0f0h call trans01 call trans03 mov tdata,#88h ;Addres 0 0 set call trans00 mov tdata,#00h call trans01 call trans03 mov tdata,#90h ;明るさ set call trans00 mov tdata,#25h call trans01 call trans03 mov tdata,#20h ; Bak Calor Black call trans00 call trans03 mov tdata,#45h ; 内部発振モード call trans00 call trans03 mov tdata,#32h ; 黒縁どり call trans00 call trans03 mov tdata,#1ch ;display on ld on blink off call trans00 call trans03 ret ;********************************************* ; 時間文字列のスーパーインポーズ ;********************************************* ; transd mov tdata,#88h ;表示アドレス制御 0 0設定 call trans00 mov tdata,#00h call trans01 call trans03 mov tdata,#0c0h ;表示文字制御 call trans00 mov com,hor ;時間スーパー call command ;数値−コマンド変換へ mov tdata,cmb call trans01 mov tdata,cma call trans01 mov tdata,#0f4h ;':'時間区切り表示 call trans01 mov com,min ;分表示 call command ;数値−文字変換へ mov tdata,cmb call trans01 mov tdata,cma call trans01 mov tdata,#0f4h ;':'時間区切り表示 call trans01 mov com,sec ;秒表示 call command ;数値−文字変換へ mov tdata,cmb call trans01 mov tdata,cma call trans01 mov tdata,#0ffh ;2バイトコマンド終了コード call trans01 call trans03 ret ;/////////////////////msec表示 transm mov tdata,#88h ;表示アドレス制御 0 8設定 call trans00 mov tdata,#08h call trans01 call trans03 mov tdata,#0c0h ;表示文字制御 call trans00 mov tdata,#0f6h ;'.'時間区切り表示 call trans01 mov com,msec ;カウントスーパー call command ;数値−コマンド変換へ mov tdata,cmb call trans01 mov tdata,cma call trans01 mov tdata,#0ffh ;2バイトコマンド終了コード call trans01 call trans03 ret ; ;********************************************************************* ; 1バイト値をスーパーコマンド文字列に変換する 0-255 ; 変換する数を com にセットして呼ぶ ; cmc(100位),cmb(10位),cma(1位) に変換したコマンドコードが返る ;********************************************************************* ; command mov cma,#00h mov cmb,#00h mov cmc,#00h com_1 cjb com,#100,com_2 add cmc,#1 sub com,#100 goto com_1 com_2 cjb com,#10,com_3 add cmb,#1 sub com,#10 goto com_2 com_3 add cma,com ret ; ;************************************************** ; スーパーインポーズ送信出力ルーチン ;************************************************** ; trans00 bcf cs ; csをLにセット trans01 mov cn,#8 ; 繰り返しは8回 trans02 rl tdata ; rrからrlに変更dataはMSBから bcf clk ; clkをLにセット movb data,c ; Dataを送信 bsf clk ; clkをHにセット、OSD読み込み nop nop djnz cn,trans02 ; cn回繰り返し nop ret trans03 btfss data ; DataがLのとき bsf data ; Hをセット bsf cs ; csをHに戻す nop nop nop nop ret ;//////////////////////////////////////////////////// ; ウェイトルーチン ;//////////////////////////////////////////////////// ; 100msec Timer Subroutine tim100 mov cnt2,#0c7h ;199回 timlp2 call tim10 ;2+(1000+3)*199-1=199994 djnz cnt2,timlp2 ;このループは1回1003サイクル djnz wait_cn,tim100 ret ;+1=199995サイクル ;0.5msec Timer Subroutine tim10 mov cnt1,#0f9h ;249回 ここまでで2サイクル timlp1 nop djnz cnt1,timlp1 ;このループは4サイクル 2+4*249-1=997 ret ;997+1=998*0.5usec=0.5msec