• ベストアンサー

アセンブラによるウェイト(WAIT)サブルーチンの作成

タイトルのことについて、0.08(ms)から0.3(ms)くらいで簡単に調整可能なプログラムを作成したいのですが、調整可能というのがネックになってよく分からないので教えていただきたいです。 PIC16F84です。発振子は20(MHz)です。プログラムリストを示していただけるとうれしいです。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • paspas
  • ベストアンサー率52% (47/90)
回答No.2

PICは1サイクルを4クロックで実行します。従って1サイクル実行するには、50ns*4=200nsecです。 CNT1;-----------カウント値1 CNT2;-----------カウント値2 L1;-------------ループカウンタ1 L2;-------------ループカウンタ2 とします。 MOVF CNT1,W;---------WにCNT1を読み込む(1) MOVWF L1;-------------L1にCNT1をセット(2) LB1 MOVF CNT2,W;---------WにCNT2を読み込む(3) MOVWF L2;-------------L2にCNT2をセット(4) LB2 DECFSZ CNT2,F;-------CNT2を減算、0ならスキップ(5) GOTO LB2;------------(6) DECFSZ CNT1,F;-------CNT1を減算、0ならスキップ(7) GOTO LB1;------------(7) RETUEN;---------------(8) MOV命令は1サイクルです。 GOTO命令は2サイクルです。 DECFSZ命令はスキップする場合2サイクル、スキップしない場合は1サイクルです。 CNT2を調整して(3)~(6)で0.01mSECのwaitを作っておけば、CNT1を変更するだけで、0.08~0.3msecのwaitを作れます。正確さを求めるのであれば、内側ループ内にNOP命令などを入れて、若干調整が必要かもしれません。

ZZR1200
質問者

お礼

CNTの数値を変えればいいんですね!分かりました!ありがとうございます。

その他の回答 (1)

回答No.1

;*************************** ; Timer Subroutines ;*************************** ; 0.4msec Timer Subroutine TIM10 MOVLW 0F9H ;1 MOVWF CNT1 ;1+1=2 TIMLP1 NOP DECFSZ CNT1,F ;1+1+2=4 GOTO TIMLP1 ;2+4*249-1=997 RETURN ;997+1=998*0.4usec=0.4msec 下記のURLのサンプルから引っ張って来ました。 あとはご自身で宜しく。

参考URL:
http://www.picfun.com/picframe.html
ZZR1200
質問者

お礼

回答ありがとうございます。参考になりました。

関連するQ&A