手持ちの水晶発振子・水晶発振器を使ってみる (2012年2月)
基準周波数 12.8MHzのプログラム6coun.asmです。
手持ちの水晶発振子や発振器を使う場合はプログラムの変更が必要です。




プログラム


 ;---------------------------------------------------------------------------------------------------------------------------

TITLE "<6桁周波数カウウンタ->"
SUBTITLE "< >"
LIST P=16F84A
INCLUDE "P16F84A.inc"

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _HS_OSC

;--------------------------------------------------------------------------------------------------------------------------
; 基準周波数は 12.8MHz の水晶発振器用になっています。 他の周波数の水晶発振子や水晶発振器を使用する場合は 変更が必要です。
;--------------------------------------------------------------------------------------------------------------------------
; [ メモリ-割り当て ]

wait_cn EQU 0CH
wait_cn2 EQU 0DH
cn EQU 0EH

x_0 EQU 010H ;Xは、必ず #10h 番地に置いてね
x_1 EQU 011H
x_2 EQU 012H
x_3 EQU 013H

vfo_0 EQU 018H ;#18h番地;Lo(VFO)
vfo_1 EQU 019H
vfo_2 EQU 01AH
vfo_3 EQU 01BH

;dec は必ず#20h番地に; 10進格納場所( 10バイト )dec_top

dec_0 EQU 020H ;計算結果 1000MHzの桁
dec_1 EQU 021H ;計算結果 100MHzの桁
dec_2 EQU 022H ;計算結果  10MHzの桁
dec_3 EQU 023H ;計算結果  1MHzの桁
dec_4 EQU 024H ;計算結果 100KHzの桁
dec_5 EQU 025H ;計算結果  10KHzの桁
dec_6 EQU 026H ;計算結果  1KHzの桁
dec_7 EQU 027H ;計算結果  100Hzの桁
dec_8 EQU 028H ;計算結果  10Hzの桁
dec_9 EQU 029H ;計算結果  1Hzの桁

val_0 EQU 02AH ; 変換したい値(32ビット)
val_1 EQU 02BH ; 変換したい値(32ビット)
val_2 EQU 02CH ; 変換したい値(32ビット)
val_3 EQU 02DH ; 変換したい値(32ビット)

val_m EQU 02EH ; 一時余り格納場所(サブルーチンで使用)

N EQU 02FH ;prescaler 1/N= ×4倍

mode EQU 031H ;RB1がLの時10MHz桁以下表示。RB1がHの時1MHz桁以下表示

overf EQU 034H

dsp_0 EQU 039H ;7セグメントLED表示 1桁目
dsp_1 EQU 03AH ;7セグメントLED表示 2桁目
dsp_2 EQU 03BH ;7セグメントLED表示 3桁目
dsp_3 EQU 03CH ;7セグメントLED表示 4桁目
dsp_4 EQU 03DH ;7セグメントLED表示 5桁目
dsp_5 EQU 03EH ;7セグメントLED表示 6桁目

;--------------------------------------------------------------------------------------------------------------------------

ORG 0000H
GOTO start
ORG 0004H
GOTO start

;--------------------------------------------------------------------------------------------------------------------------

;7seg 表示 DP表示無し

t_fig ADDWF PCL,F
RETLW 007H ;7セグメントLED表示DATA [0]
RETLW 017H ;7セグメントLED表示DATA [1]
RETLW 087H ;7セグメントLED表示DATA [2]
RETLW 097H ;7セグメントLED表示DATA [3]
RETLW 047H ;7セグメントLED表示DATA [4]
RETLW 057H ;7セグメントLED表示DATA [5]
RETLW 0C7H ;7セグメントLED表示DATA [6]
RETLW 0D7H ;7セグメントLED表示DATA [7]
RETLW 027H ;7セグメントLED表示DATA [8]
RETLW 037H ;7セグメントLED表示DATA [9]
RETLW 0A7H ;7セグメントLED表示DATA [ブランク]
RETLW 0B7H ;7セグメントLED表示DATA [ブランク]
RETLW 067H ;7セグメントLED表示DATA [ブランク]
RETLW 077H ;7セグメントLED表示DATA [ブランク]
RETLW 0E7H ;7セグメントLED表示DATA [ブランク]
RETLW 0F7H ;7セグメントLED表示DATA [ブランク]
SLEEP

;7seg 表示 DP表示有り

t_fig_dp ADDWF PCL,F
RETLW 00FH ;7セグメントLED表示DATA [0]
RETLW 01FH ;7セグメントLED表示DATA [1]
RETLW 08FH ;7セグメントLED表示DATA [2]
RETLW 09FH ;7セグメントLED表示DATA [3]
RETLW 04FH ;7セグメントLED表示DATA [4]
RETLW 05FH ;7セグメントLED表示DATA [5]
RETLW 0CFH ;7セグメントLED表示DATA [6]
RETLW 0DFH ;7セグメントLED表示DATA [7]
RETLW 02FH ;7セグメントLED表示DATA [8]
RETLW 03FH ;7セグメントLED表示DATA [9]
RETLW 0A7H ;7セグメントLED表示DATA [ブランク]
RETLW 0B7H ;7セグメントLED表示DATA [ブランク]
RETLW 067H ;7セグメントLED表示DATA [ブランク]
RETLW 077H ;7セグメントLED表示DATA [ブランク]
RETLW 0E7H ;7セグメントLED表示DATA [ブランク]
RETLW 0F7H ;7セグメントLED表示DATA [ブランク]
SLEEP

;--------------------------------------------------------------------------------------------------------------------------

start
CALL wt255ms ;待機時間(何もしない) 255ms

CLRF TMR0 ;TMR0をクリア

BSF STATUS,5 ;バンク1
CLRWDT ;prescalerをクリア
MOVLW 067H ;prescaler 1/256 set ;RBプルアップ; 立ち上がりカウント
MOVWF OPTION_REG

BCF STATUS,5 ;バンク0

CLRF PORTA ;PORTAをすべてクリア L
CLRF PORTB ;PORTBをすべてクリア L
CLRF dsp_5 ;dsp_5のデ−タをクリア
CLRF dsp_4 ;dsp_4をデ−タをクリア
CLRF dsp_3 ;dsp_3をデ−タをクリア
CLRF dsp_2 ;dsp_2をデ−タをクリア
CLRF dsp_1 ;dsp_1をデ−タをクリア
CLRF dsp_0 ;dsp_0をデ−タをクリア

NOP
GOTO f_counter

;--------------------------------------------------------------------------------------------------------------------------

dp_on BSF STATUS,5 ;バンク1

MOVLW 000H ;rb.0-rb.7ピンをout に !rb,#00000000b
MOVWF TRISB ;trisb
BCF STATUS,5 ;バンク0
RETURN



;--------------------------------------------------------------------------------------------------------------------------
; 100Hz/10Hzのモ−ドの判断をする


dp_off BSF STATUS,5 ;バンク1
MOVLW 00FH ;rb.0-rb.3ピンをIN に !rb,#00001111b
MOVWF TRISB ;trisb
BCF STATUS,5 ;バンク0

BSF PORTB,7 ;TC4511 A=B=C=D=1 15としてa-g=Lにする
BSF PORTB,6 ;TC4511 A=B=C=D=1 15としてa-g=Lにする
BSF PORTB,5 ;TC4511 A=B=C=D=1 15としてa-g=Lにする
BSF PORTB,4 ;TC4511 A=B=C=D=1 15としてa-g=Lにする

NOP
NOP
MOVF PORTB,W ;W←portb PORTBのRB0,RB1,RB2,RB3デ-タ取り込み
;(RB7)(RB6)(RB5)(RB4)(RB3)(RB2)(RB1)(RB0)
; 0 0 0 0 1 1 1 1 RB0〜RB3スイッチOFFの場合
; OUT OUT OUT OUT I N I N I N I N

ANDLW 00FH ;portb4-7 masking (RB7)(RB6)(RB5)(RB4) 0 に (RB3)(RB2)(RB1)(RB0) 1 に

;(RB7)(RB6)(RB5)(RB4)(RB3)(RB2)(RB1)(RB0)
; 0 0 0 0 1 1 1 1   比較DATA ANDLW
; 0 0 0 0 1 1 1 1 入力DATA RB0〜RB3スイッチOFFの場合
; OUT OUT OUT OUT I N I N I N I N
; 0 0 0 0 1 1 1 1 DATA RB0〜RB7比較結果

;  A B
; AND 0 0 0
; AND 1 0 0
; AND 0 1 0
; AND 1 1 1

MOVWF mode ;portb4-7 RB0,RB1,RB2,RB3 はスイッチがONの所が 0 に DATA RB4,RB5,RB6,RB7 は 0 に

;(RB7)(RB6)(RB5)(RB4)(RB3)(RB2)(RB1)(RB0)
; 0 0 0 0 1 1 1 1 DATA RB0〜RB7比較結果を mode に書き込む

MOVLW 001H
MOVWF wait_cn
CALL wait_ms
RETURN

;--------------------------------------------------------------------------------------------------------------------------

c_main025 CLRF vfo_0
CLRF vfo_1
CLRF vfo_2
CLRF vfo_3

CLRWDT
CLRF TMR0 ;カウンタTMR0をクリア

BSF STATUS,5 ;バンク1


MOVLW 018H ;ra.3ピンをIN=high impedance/TMR0の開始

;--------------------------------------------------------------------------------------------------------------------------
; ゲートタイム開始  (開始→終了)時間をストップウォッチで測定して250msになるようにプログラムを変更
;              すれば、いろいろな水晶発振子や水晶発振器が使用できます。たぶん? 8cycle
;--------------------------------------------------------------------------------------------------------------------------
MOVWF TRISA ;trisA | 1cycle
BCF STATUS,5 ;バンク0 | 1cycle
NOP ; | 1cycle
NOP ; | 1cycle
CALL t250sec ; | 2cycle
BSF STATUS,5 ;1 バンク1 | 1cycle
MOVLW 010H ;1 ra.3ピンをout;TMR0の停止 | 1cycle
MOVWF TRISA ;1 trisA ここまで 3cycle
;--------------------------------------------------------------------------------------------------------------------------
; ゲートタイム終了
;--------------------------------------------------------------------------------------------------------------------------

BCF TRISA,3 ;1

BCF STATUS,5 ;バンク0

BCF PORTA,3
CALL dl5 ;overflow check after last check

NOP
MOVF TMR0,W ;TMR0のdataをvfo[1]に
MOVWF vfo_1

INCF vfo_0,F
toggle DECF vfo_0,F
BCF PORTA,3 ;port Ra4のトグル
BSF PORTA,3
NOP
NOP

MOVF TMR0,W
SUBWF vfo_1,W ;vfo[1]-TMR0=0であれば Z=1
BTFSC STATUS,2
GOTO toggle
DECF vfo_0,F ;vfo[0]への prescaler値の取り込み完。
RETURN

;--------------------------------------------------------------------------------------------------------------------------
; 総ステップ数 − 10  残りのステップ数を t250sec で作る
; 
; t250sec ;104+(1+1+1+1+1+1+1+1)+(1+1+1)+(799874)+1=799990 steps
; Breakpoint → MOVLW 021H ;1 1+(33*3cycle+2+2)=104
; MOVWF wait_cn ;1
; CALL wait_us ;2cycle
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; DECFSZ cn,F ;1
; GOTO display ;2
;
; NOP ;1
; Breakpoint → RETURN ;2
;
; 上記の様にブレークポイントを設定すると RETURN 一つ前の NOP までを カウントする
;
; この間のステップ数は 800000-10=799990 です。
;  t250sec  のプログラムで 残りの 7999990 ステップを 作ります。
;
;
;  下記の場合 8ステップだけど ステップを計算しやすくする為?に t250sec 最後の RETURN の2ステップを含めて 10 ステップとします。
; ******************************************************************************
; Breakpoint → MOVWF TRISA ;trisA | 1cycle
; BCF STATUS,5 ;バンク0 | 1cycle
; NOP ; | 1cycle
; NOP ; | 1cycle
; CALL ttt ; | 2cycle
; BSF STATUS,5 ;1 バンク1 | 1cycle
; MOVLW 010H ;1 ra.3ピンをout;TMR0の停止 | 1cycle
; Breakpoint → MOVWF TRISA ;1 trisA ここまで 3cycle
; ******************************************************************************
;
;--------------------------------------------------------------------------------------------------------------------------


t250sec
; 103+(1+1+1+1+1+1+1+1)+(1+1+1)+(799874)+1= 799990 steps
; ---------------- 112 (112 step) ------------------
; ---------- 104 (104 step) -------------

MOVLW 021H ;1 1+(33*3cycle+2+2)=10
MOVWF wait_cn ;1
CALL wait_us ;2cycle

; ---------- 8 (8 step) -------------

NOP
NOP

NOP
NOP
NOP
NOP
NOP
NOP

;*************************************************************************
; 残りのステップ 799990 - 3 = 799987 が display で作るステップ
; 繰返回数×(6×1065+6+1+2+)-1 なので
; 繰返回数×(6×1065+6+1+2+)-1=799987
; 繰返回数×(6×1065+6+1+2+)=799987-1
; 繰返回数×(6×1065+6+1+2+)=799986
;          繰返回数=799986/(6×1065+6+1+2+)
; 繰返回数=799986/(6399)
; 繰返回数=125.01734646...
;
; 繰返回数は125回とします。
;
;  ここでのステップ数は 125×(6×1065+6+1+2)-1=799874
;
; MOVLW 07DH ;1 display 繰り返し回数設定
; MOVWF cn ;1
; NOP ;1
;      3ステップを加えます
;      799874+3=799877 ステップになります。
;
; RETURN の前の NOP 1ステップを加えます
;      799877+1=799878 ステップになります。
;
;      残りのステップは? 799990-7998878=112
;
;      残り 112 ステップ
;
;*************************************************************************

; ---------------- (3step) ------------------
MOVLW 07DH ;1 display 繰り返し回数設定
MOVWF cn ;1
NOP ;1

display
; ---------------- 125*(6*1065+6+1+2)-1=799874 (799874 step) ------------------
MOVF dsp_5,W ;10MHz桁 ;1
BTFSC mode,0
CALL t_fig_dp ;2cycle /3cycle ;2+4
BTFSS mode,0
CALL t_fig ;2cycle /3cycle ;2+4
MOVWF PORTB ;1
BCF PORTB,0 ;1
CALL delay329 ;2+1052
NOP ;1
BSF PORTB,0 ;1 (=1065)

MOVF dsp_4,W ;1MHz桁
BTFSC mode,0
CALL t_fig ;2cycle /3cycle ;2+4
BTFSS mode,0
CALL t_fig_dp ;2cycle /3cycle ;2+4
MOVWF PORTB ;1
BCF PORTB,1 ;1
CALL delay329 ;2+1052
NOP ;1
BSF PORTB,1 ;1 (=1065)

MOVF dsp_3,W ;100kHz桁
CALL t_fig ;2cycle /3cycle ;2+4
MOVWF PORTB ;1
BCF PORTB,2 ;1
CALL delay329 ;2+1052
NOP ;1
BSF PORTB,2 ;1

MOVF dsp_2,W ;10kHz桁
BTFSC mode,0
CALL t_fig_dp ;2cycle /3cycle ;2+4
BTFSS mode,0
CALL t_fig ;2cycle /3cycle ;2+4
MOVWF PORTB ;1
BCF PORTA,2 ;1
CALL delay329 ;2+1052
NOP ;1
BSF PORTA,2 ;1

MOVF dsp_1,W ;1kHz桁
BTFSC mode,0
CALL t_fig ;2cycle /3cycle ;2+4
BTFSS mode,0
CALL t_fig_dp ;2cycle /3cycle ;2+4
MOVWF PORTB ;1
BCF PORTA,1 ;1
CALL delay329 ;2+1052
NOP ;1
BSF PORTA,1 ;1

MOVF dsp_0,W ;100Hz桁
CALL t_fig ;2cycle /3cycle ;2+4
MOVWF PORTB ;1
BCF PORTA,0 ;1
CALL delay329 ;2+1052
NOP ;1
BSF PORTA,0 ;1

DECFSZ cn,F ;1
GOTO display ;2

; ---------------- 1 (799874 step) ------------------
NOP ;1
; ---------------- 112 + 3 + 799874 + 1 (799990 step) -----

RETURN ;2

;--------------------------------------------------------------------------------------------------------------------------





delay329
; NOP ;1052step

; [1051steps=328.0 usecのルーチン]

delay328
MOVLW 0FDH ;1+(252*3cycle+2+2)+3=764
MOVWF wait_cn ;1cycle | |
CALL wait_us ;2cycle | |

MOVLW 05AH ;1+(89*3cycle+2+2)+15= 287
MOVWF wait_cn ;1cycle | |
CALL wait_us ;2cycle | |

dl5 MOVF INTCON,W ;1cycle | |
MOVWF overf ;1cycle | |
BCF STATUS,0 ;1cycle | |
MOVLW 001H ;1cycle | 16cy |
BTFSC overf,2 ;2cycle | |
ADDWF vfo_2,F ;0 | |
BTFSC STATUS,0 ;2cycle | |
ADDWF vfo_3,F ;0 | |
BTFSC overf,2 ;2cycle | |
BCF INTCON,2 ;0cycle | |
RETURN ;2cycle | |




calc0 ;単なるFreq. counterの計算はここから
MOVLW 004H ;N:TD7104P 逓倍数x4
MOVWF N

CALL mult_vN ;x=VFO*N逓倍 。x[3]-x[0]に逓倍後のVFOが入っている.

calc1 MOVF x_3,W
MOVWF val_3
MOVF x_2,W
MOVWF val_2
MOVF x_1,W
MOVWF val_1
MOVF x_0,W
MOVWF val_0
CALL dcmain ;16進-10進変換
RETURN

;--------------------------------------------------------------------------------------------------------------------------

wt15ms MOVLW 00FH
MOVWF wait_cn ; wait 15ms
GOTO wait_ms
;--------------------------------------------------------------------------------------------------------------------------

wait_us DECFSZ wait_cn,F ;3 steps=1.2μsのカウント
GOTO wait_us
RETURN

; [msオーダーのウェイト]

wt255ms MOVLW 0FFH
MOVWF wait_cn
wait_ms MOVLW 000H
MOVWF wait_cn2
wait_ms1 NOP
NOP
NOP
NOP
NOP
NOP
NOP

DECFSZ wait_cn2,F
GOTO wait_ms1
DECFSZ wait_cn,F
GOTO wait_ms
RETURN

;--------------------------------------------------------------------------------------------------------------------------
; 32ビットバイナリ→10進変換
; valに32ビットデータを置く。(val[3]:val[2]:val[1]:va[0])
; dcmainをコールする。 decに答えが格納される。
; (dec[0]:dec[1]:...:dec[8]:dec[9]) dec[0]が最上位桁でdec[9]が最下位桁
; 変換後valは破壊される。
; sample: val = 00:00:04:D2 h
; dec = 00:00:00:00:00:00:01:02:03:04
; dec(0):dec(1):(2):(3):(4):(5):(6):(7):(8):dec(9)
; (1,234)


dcmain MOVLW 02AH ; 格納場所初期値
MOVWF FSR
CALL devide
CALL devide
CALL devide
CALL devide
CALL devide

CALL devide
CALL devide
CALL devide
CALL devide
CALL devide

; ---------------------------------
; ゼロブランクの処理
; ---------------------------------
BTFSC mode,0 ;
GOTO ZERO_10
MOVLW 007H ;Zero Blank処置 最小100Hz表示
GOTO ZERO_100
ZERO_10 MOVLW 008H ;Zero Blank処置 最小10Hz表示

ZERO_100
MOVWF cn
MOVLW 020H ; dec[0]格納場所初期値
MOVWF FSR
zb1 MOVF INDF,W
BTFSS STATUS,2 ;if dec[]=00, then continue, else return
RETURN
MOVF INDF,W
BTFSC STATUS,2
MOVLW 00BH
MOVWF INDF
INCF FSR,F
DECFSZ cn,F
GOTO zb1
RETURN

; ÷10サブルーチン
; 10で除算します

devide MOVLW 020H
MOVWF cn
CLRF val_m

devide0 BCF STATUS,0
RLF val_0,F
RLF val_1,F
RLF val_2,F
RLF val_3,F
RLF val_m,F

MOVLW 0F6H
ADDWF val_m,W
BTFSC STATUS,0
MOVWF val_m
BTFSC STATUS,0
INCF val_0,F
DECFSZ cn,F
GOTO devide0
DECF FSR,F
MOVF val_m,W ; 余り
MOVWF INDF
RETURN

; [end of 10進変換]

;--------------------------------------------------------------------------------------------------------------------------
; 掛け算 x[32bit]=vfo[32bit] * N[8bit]
; vfoに32ビットデータを置く (vfo[3]:vfo[2]:vfo[1]:vfo[0])
; Nに 8ビットデータを置く。 N ; 最大 #255です。
; xに答えが格納される。 (x[3]:x[2]:x[1]:x[0])
; 変換後 N は破壊されない。

mult_vN CLRF x_3
CLRF x_2
CLRF x_1
CLRF x_0
MOVLW 008H
MOVWF cn

mult0 BTFSS N,0
GOTO mutpas
MOVF vfo_0,W
ADDWF x_0,F
MOVLW 001H
BTFSC STATUS,0
ADDWF x_1,F
BTFSC STATUS,0
ADDWF x_2,F
BTFSC STATUS,0
ADDWF x_3,F
MOVF vfo_1,W
ADDWF x_1,F
MOVLW 001H
BTFSC STATUS,0
ADDWF x_2,F
BTFSC STATUS,0
ADDWF x_3,F
MOVF vfo_2,W
ADDWF x_2,F
MOVLW 001H
BTFSC STATUS,0
ADDWF x_3,F
MOVF vfo_3,W
ADDWF x_3,F

mutpas BCF STATUS,0
RLF vfo_0,F
RLF vfo_1,F
RLF vfo_2,F
RLF vfo_3,F
BTFSC STATUS,0
BSF vfo_0,0
BCF STATUS,0
RRF N,F
BTFSC STATUS,0
BSF N,7

DECFSZ cn,F
GOTO mult0

MOVLW 008H
MOVWF cn
multrot BCF STATUS,0
RRF vfo_3,F
RRF vfo_2,F
RRF vfo_1,F
RRF vfo_0,F
BTFSC STATUS,0
BSF vfo_3,7
DECFSZ cn,F
GOTO multrot
RETURN

; [end of 掛け算]

f_counter CALL dp_on
CALL c_main025
CALL calc0
BTFSC mode,0
GOTO Hz
MOVF dec_2,W ;計算結果  10MHzの桁
MOVWF dsp_5 ;6桁目
MOVF dec_3,W ;計算結果   1MHzの桁
MOVWF dsp_4 ;5桁目
MOVF dec_4,W ;計算結果 100kHzの桁
MOVWF dsp_3 ;4桁目
MOVF dec_5,W ;計算結果 10kHzの桁
MOVWF dsp_2 ;3桁目
MOVF dec_6,W ;計算結果 1kHzの桁
MOVWF dsp_1 ;2桁目
MOVF dec_7,W ;計算結果 100Hzの桁
MOVWF dsp_0 ;1桁目
BTFSS mode,0
GOTO MHz

Hz

MOVF dec_3,W ;計算結果  1MHzの桁
MOVWF dsp_5 ;6桁目
MOVF dec_4,W ;計算結果 100kHzの桁
MOVWF dsp_4 ;5桁目
MOVF dec_5,W ;計算結果 10kHzの桁
MOVWF dsp_3 ;4桁目
MOVF dec_6,W ;計算結果 1kHzの桁
MOVWF dsp_2 ;3桁目
MOVF dec_7,W ;計算結果 100Hzの桁
MOVWF dsp_1 ;2桁目
MOVF dec_8,W ;計算結果 10Hzの桁
MOVWF dsp_0 ;1桁目

MHz
CALL dp_off
GOTO f_counter

END


手持ちの水晶発振子を使ってみる

手持ちの水晶発振子が8MHzの場合は?
PICの動作クロックは基準周波数の1/4なので2MHzとなります。

時間=1/周波数なので1/2000000=0.00000005
1ステップの時間=0.5μSとなります。
ゲート時間は0.25秒なので 0.25/0.00000005=500000
500000ステップでゲート時間を作れます。


できるだけプログラムを変更しないようにプログラムを変更します。  


;--------------------------------------------------------------------------------------------------------------------------
; ゲートタイム開始  (開始→終了)時間をストップウォッチで測定して250msになるようにプログラムを変更
;              すれば、いろいろな水晶発振子や水晶発振器が使用できます。たぶん? 8cycle
;--------------------------------------------------------------------------------------------------------------------------
MOVWF TRISA ;trisA | 1cycle
BCF STATUS,5 ;バンク0 | 1cycle
NOP ; | 1cycle
NOP ; | 1cycle
CALL t250sec ; | 2cycle
BSF STATUS,5 ;1 バンク1 | 1cycle
MOVLW 010H ;1 ra.3ピンをout;TMR0の停止 | 1cycle
MOVWF TRISA ;1 trisA ここまで 3cycle
;--------------------------------------------------------------------------------------------------------------------------
; ゲートタイム終了
;--------------------------------------------------------------------------------------------------------------------------

全部で500000ステップの内ここでは8ステップ使用します。

残り499992ステップです。

残りのステップは下のプログラムで...
まず、プログラム分解!

;--------------------------------------------------------------------------------------------------------------------------
; ゲートタイム開始  (開始→終了)時間をストップウォッチで測定して250msになるようにプログラムを変更
;              すれば、いろいろな水晶発振子や水晶発振器が使用できます。たぶん? 8cycle
;--------------------------------------------------------------------------------------------------------------------------
MOVWF TRISA ;trisA | 1cycle
BCF STATUS,5 ;バンク0 | 1cycle
NOP ; | 1cycle
NOP ; | 1cycle
CALL t250sec ; | 2cycle
BSF STATUS,5 ;1 バンク1 | 1cycle
MOVLW 010H ;1 ra.3ピンをout;TMR0の停止 | 1cycle
MOVWF TRISA ;1 trisA ここまで 3cycle
;--------------------------------------------------------------------------------------------------------------------------
; ゲートタイム終了
;--------------------------------------------------------------------------------------------------------------------------

全部で500000ステップの内ここでは8ステップ使用します。

残り499992ステップです。  

残りのステップは下のプログラムで...
まず、プログラム分解!

基準周波数12.8MHzの場合
下記の合計ステップ数は799992です。
799992ステップの内訳を・・・

;--------------------------------------------------------------------------------------------------------------------------

t250sec
; 103+(1+1+1+1+1+1+1+1)+(1+1+1)+(799874)+1= 799990 steps
; ---------------- 112 (112 step) ------------------
; ---------- 104 (104 step) -------------

MOVLW 021H ;1 1+(33*3cycle+2+2)=10
MOVWF wait_cn ;1
CALL wait_us ;2cycle

; ---------- 8 (8 step) -------------

NOP
NOP

NOP
NOP
NOP
NOP
NOP
NOP

;*************************************************************************
; 残りのステップ 799990 - 3 = 799987 が display で作るステップ
; 繰返回数×(6×1065+6+1+2+)-1 なので
; 繰返回数×(6×1065+6+1+2+)-1=799987
; 繰返回数×(6×1065+6+1+2+)=799987-1
; 繰返回数×(6×1065+6+1+2+)=799986
;          繰返回数=799986/(6×1065+6+1+2+)
; 繰返回数=799986/(6399)
; 繰返回数=125.01734646...
;
; 繰返回数は125回とします。
;
;  ここでのステップ数は 125×(6×1065+6+1+2)-1=799874
;
; MOVLW 07DH ;1 display 繰り返し回数設定
; MOVWF cn ;1
; NOP ;1
;      3ステップを加えます
;      799874+3=799877 ステップになります。
;
; RETURN の前の NOP 1ステップを加えます
;      799877+1=799878 ステップになります。
;
;      残りのステップは? 799990-7998878=112
;
;      残り 112 ステップ
;
;*************************************************************************

; ---------------- (3step) ------------------
MOVLW 07DH ;1 display 繰り返し回数設定
MOVWF cn ;1
NOP ;1

display
; ---------------- 125*(6*1065+6+1+2)-1=799874 (799874 step) ------------------
MOVF dsp_5,W ;10MHz桁 ;1
BTFSC mode,0
CALL t_fig_dp ;2cycle /3cycle ;2+4
BTFSS mode,0
CALL t_fig ;2cycle /3cycle ;2+4
MOVWF PORTB ;1
BCF PORTB,0 ;1
CALL delay329 ;2+1052
NOP ;1
BSF PORTB,0 ;1 (=1065)

MOVF dsp_4,W ;1MHz桁
BTFSC mode,0
CALL t_fig ;2cycle /3cycle ;2+4
BTFSS mode,0
CALL t_fig_dp ;2cycle /3cycle ;2+4
MOVWF PORTB ;1
BCF PORTB,1 ;1
CALL delay329 ;2+1052
NOP ;1
BSF PORTB,1 ;1 (=1065)

MOVF dsp_3,W ;100kHz桁
CALL t_fig ;2cycle /3cycle ;2+4
MOVWF PORTB ;1
BCF PORTB,2 ;1
CALL delay329 ;2+1052
NOP ;1
BSF PORTB,2 ;1

MOVF dsp_2,W ;10kHz桁
BTFSC mode,0
CALL t_fig_dp ;2cycle /3cycle ;2+4
BTFSS mode,0
CALL t_fig ;2cycle /3cycle ;2+4
MOVWF PORTB ;1
BCF PORTA,2 ;1
CALL delay329 ;2+1052
NOP ;1
BSF PORTA,2 ;1

MOVF dsp_1,W ;1kHz桁
BTFSC mode,0
CALL t_fig ;2cycle /3cycle ;2+4
BTFSS mode,0
CALL t_fig_dp ;2cycle /3cycle ;2+4
MOVWF PORTB ;1
BCF PORTA,1 ;1
CALL delay329 ;2+1052
NOP ;1
BSF PORTA,1 ;1

MOVF dsp_0,W ;100Hz桁
CALL t_fig ;2cycle /3cycle ;2+4
MOVWF PORTB ;1
BCF PORTA,0 ;1
CALL delay329 ;2+1052
NOP ;1
BSF PORTA,0 ;1

DECFSZ cn,F ;1
GOTO display ;2

; ---------------- 1 (799874 step) ------------------
NOP ;1
; ---------------- 112 + 3 + 799874 + 1 (799990 step) -----

RETURN ;2

;--------------------------------------------------------------------------------------------------------------------------

112ステップ

t250sec
; 103+(1+1+1+1+1+1+1+1)+(1+1+1)+(799874)+1= 799990 steps
; ---------------- 112 (112 step) ------------------
; ---------- 104 (104 step) -------------

MOVLW 021H ;1 1+(33*3cycle+2+2)=10
MOVWF wait_cn ;1
CALL wait_us ;2cycle

; ---------- 8 (8 step) -------------

NOP
NOP

NOP
NOP
NOP
NOP
NOP
NOP

ステップは3ステップ

; ---------------- (3step) ------------------
MOVLW 07DH ;1 display 繰り返し回数設定
MOVWF cn ;1
NOP ;1

ここまでの合計
112+3=115
ステップ

ここはループ・プログラムです。
1ループは6399ステップです。



繰り返す回数はここで指定しています。

MOVLW  07DH


回数は 07H
これは16進なので
10進に変換すると



125回繰り返します。
6399×125=799875
799875ステップ

ですが125回繰り返すと
ループから抜け出します。


DECFSZの命令は 1回実行すると

プログラムで cn に格納された 125 の数を
1回ループするごとに−1した数値を cn に格納して
125回目にループした時は cn の値は 0 なので
DECFSZ は次の命令 GOTO を実行せず
NOP命令に飛びます。


そこでステップ数が変わりますGOTO命令は 2 ステップですが
必要なステップは1ステップとなりますので

ステップ数を −1 します。

よって799875−1=7999874となります

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

ここまでの合計
115+799874=799989
   ステップ

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


1ステップ

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

ここまでの合計
1+799989=799990
   ステップ

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


2ステップ

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

合計
2+799990=799992
  ステップ

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
----------------------------------------------------

残り499992ステップをプログラムでカウントします。

3ステップ


残りステップ
499992−3=499989

499989ステップ

3ステップ


残りステップ
499989−3=499986

499986ステップ



残り499986ステップなので・・・

125×(6×1065+6+1+2)−1=799874
式から

A=繰り返し回数

A×(6×1065+6+1+2)−1=499986
=(499986+1)/(6×1065+6+1+2)
=499987/6399
≒78.13

Aは78として計算します
78×(6×1065+6+1+2)−1=499121
残りのステップは
499986-499121=869
で865ステップ

125を指定しているプログラムを78に書き換えます。


07DH
これは16進で表現してます。

10進では125になります。



78を16進にすると



4Eなので
07DH → 04EHに
変更します


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

あと残り865ステップです
残りのステップの処理をします。

囲ったプログラムのステップ数は112ステップです。
ここのプログラムを変更して865ステップしします。


ここでステップ数を稼ぎます・・


0FFHで770ステップ
になります
とりあえず021H→0FFHに変更します。



変更後囲った範囲のステップ数は
 778ステップになりました。

865−778=87
残り87ステップです

t250sec            
     MOVLW 0FFH   021H→0FFHに変更
     MOVWF wait_cn  
     CALL wait_us   

     MOVLW 0FFH     ←追加  
     MOVWF wait_cn    ←追加  
     CALL wait_us     ←追加  
    

残り87ステップ稼ぎます。
繰返し回数 A は?
1+(255×3+2+2)=770なので

A=(ステップ数−5)/3

(87−5)/3≒27

Aは27とします。

28とした場合のステップ数は?
1+27×3+2+2=86

残りのステップ数は
87−86=1

残り1ステップです

残り1ステップは
NOP を追加します。

t250sec            
     MOVLW 0FFH   021H→0FFHに変更
     MOVWF wait_cn  
     CALL wait_us   

     NOP  ←追加

     MOVLW 01BH     ←追加  
     MOVWF wait_cn    ←追加  
     CALL wait_us     ←追加  
    

NOPを追加してプログラム変更終了!


ゲート時間が0.25Sになっているか確認


ゲート時間が0.25Sになりました。

カット&トライで作ってみました。
MPLABの使い方が正しいかは???です。
(英語わかりません!!)