手持ちの水晶発振子・水晶発振器を使ってみる (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ステップです。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
----------------------------------------------------
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
カット&トライで作ってみました。 MPLABの使い方が正しいかは???です。 (英語わかりません!!) |
||||||||||||||||||||||||||||||||||