- 5780. 1秒遅延ルーチン作成で困っています [透明人間] 2005/08/07 12:59
- 本やWEBを参考にしながら、理解を深めるために
以下のコードで1秒間隔でLED点滅を試みましたが、
どうも、点滅間隔が速過ぎてうまくいきません。
コードで間違っているところがあればご指摘をお願いします・・・・。
※ちなみにPIC16F628で内部クロック4MHzの為、
1命令の実行時間を1μsとしています。
(コードは遅延ルーチンのみ)
DLY_1000
movlw d'100'
movwf cnt3
loop3
movlw d'98'
movwf cnt2
nop
nop
nop
nop
nop
loop2
movlw d'33'
movwf cnt1
loop1
decfsz cnt1,f
goto loop1
decfsz cnt2,f
goto loop2
decfsz cnt3,f
goto loop3
;rest 9695cycle
movlw d'13'
movwf cnt5
loop5
movlw d'255'
movwf cnt4
loop4
decfsz cnt4,f
goto loop4
decfsz cnt5,f
goto loop5
;rest 463cycle
movlw d'154'
movwf cnt6
loop6
decfsz cnt6,f
goto loop6
return
- 5786. Re: 1秒遅延ルーチン作成で困っています [nyannnyannko] 2005/08/08 13:16
- プログラム自体に大きな問題は見つかりません。
CONFIG で ウオッチドグタイマーを無効にしてみてください。
クロックの数え方をちょっと間違っているようなので
↓を参考に数えなおして見て下さいね。
;-----------------------------------------------
radix dec
;;;;;;; call DLY_1000 ;2
DLY_1000
movlw 100 ;3
movwf cnt3 ;4
loop3
movlw 98 ; (1)
movwf cnt2 ; (2)
nop ; (3)
nop ; (4)
nop ; (5)
nop ; (6)
nop ; (7)
loop2
movlw 33 ; (-) {1}
movwf cnt1 ; (-) {2}
loop1
decfsz cnt1,f ; (-) {-} [1] --
goto loop1 ; (-) {100} [3] 98=[3]*33-1
decfsz cnt2,f ; (-) {101}
goto loop2 ; (-) {103} 10093={103}*98-1
decfsz cnt3,f ; (10101)
goto loop3 ; (10103) 1010299=(10103)*100-1
;rest 9695cycle
movlw 13 ;1010304
movwf cnt5 ;1010305
loop5
movlw 255 ; {1}
movwf cnt4 ; {2}
loop4
decfsz cnt4,f ; {-} [1]
goto loop4 ; {766} [3] 764=[3]*255-1
decfsz cnt5,f ; {767}
goto loop5 ; {769} 9996={769}*13-1
;rest 463cycle
movlw 154 ;1020302
movwf cnt6 ;1020303
loop6
decfsz cnt6,f ; [1]
goto loop6 ;1020764 [3] 461=[3]*154-1
return ;1020766
;-----------------------------------------------
◎簡単なクロック数の数え方 MPLAB SIM に数えてもらう方法
MPLAB IDE の 上の方に ↓ が並んでいるでしょう。
File Edit View Project Debugger Programmer Tools Configure Window Help
この中のDebuggerからSelect Tool→MPLAB SIMを選択します。
もう一度DebuggerからSettings→Osc/Trace 内の20MHzを4MHzに変更します。
再びDebuggerからStopWatchを選んでStopwatch窓を表示させます。
__CONFIG _WDT_OFF
ORG 0
call DLY_1000
goto 0
を追加してアセンブル後 goto 0 をダブルクリックして
赤い(B)マークを表示させておきます。
Debugger から Run を実行すると call〜return までのクロック数と
実行時間が表示されます。
- 5789. Re: 1秒遅延ルーチン作成で困っています [透明人間] 2005/08/08 17:02
- 早速のお返事ありがとうございます!!
貴殿のコードを参考にしつつ、やり直したいと
思います。おぉ、クロック数を数えるツールが開発環境にあったんですね。情報をありがとうございます。
それと質問時に開発環境を書き忘れていました。
どうも、すいませんでした。
- 5792. Re: 1秒遅延ルーチン作成で困っています [PIC_FAN] 2005/08/08 21:32
- もしかしたら cnt1--のADRESSが重なったりしていませんか?
以前痛い目にあったものですから・・・
- 5793. Re: 1秒遅延ルーチン作成で困っています [nyannnyannko] 2005/08/09 10:13
◎ADRESS の 重複を防ぐ RAM 定義の方法 (C言語の enum 型と同じ方法)
CBLOCK 0x020
cnt1: 1
cnt2: 1
cnt3: 1
cnt4: 1
cnt5: 1
cnt6: 1
ram_zzz:
ENDC
これで↓と全く同じ様に定義されます。
cnt1 EQU 0x20
cnt2 EQU 0x21
cnt3 EQU 0x22
cnt4 EQU 0x23
cnt5 EQU 0x24
cnt6 EQU 0x25
http://ww1.microchip.com/downloads/en/DeviceDoc/33014J.pdf
DS33014J-page 54
RAM エリアをオーバーしてもお構いなしなので、ram_zzz のアドレスが
範囲内に収まっているか確認する方が良いでしょう。
- 5811. Re: 1秒遅延ルーチン作成で困っています [透明人間] 2005/08/10 13:44
- 返事が大変遅れました。すいません。
もしかしらたら、それもあるかもしれませんね。
見直してみます。
>もしかしたら cnt1--のADRESSが重なったりしていませんか?
>以前痛い目にあったものですから・・・
- 5812. Re: 1秒遅延ルーチン作成で困っています [透明人間] 2005/08/10 13:44
- 返事が大変遅れました。すいません。
もしかしらたら、それもあるかもしれませんね。
見直してみます。
>もしかしたら cnt1--のADRESSが重なったりしていませんか?
>以前痛い目にあったものですから・・・
- 5813. Re: 1秒遅延ルーチン作成で困っています [透明人間] 2005/08/10 13:55
- >>5789のPIC_FANさんのアドバイスと合わせて
コードを書き直してみたいと思います。
>◎ADRESS の 重複を防ぐ RAM 定義の方法 (C言語の enum 型と同じ方法)
> CBLOCK 0x020
>cnt1: 1
>cnt2: 1
>cnt3: 1
>cnt4: 1
>cnt5: 1
>cnt6: 1
>ram_zzz:
> ENDC
>
>これで↓と全く同じ様に定義されます。
>cnt1 EQU 0x20
>cnt2 EQU 0x21
>cnt3 EQU 0x22
>cnt4 EQU 0x23
>cnt5 EQU 0x24
>cnt6 EQU 0x25
>
>http://ww1.microchip.com/downloads/en/DeviceDoc/33014J.pdf
>DS33014J-page 54
>
>RAM エリアをオーバーしてもお構いなしなので、ram_zzz のアドレスが
>範囲内に収まっているか確認する方が良いでしょう。
>
- 5826. Re: 1秒遅延ルーチン作成で困っています [komi] 2005/08/13 13:33
- 初めて書きこみます。
蛇足になりますが、
NOP命令を使わずに
GOTO $+1 を使うと同じ命令サイズで2倍の時間を消費できますよ。
ループで時間を稼いでいるようなので効果は微々たるものですが。
- 5840. Re: 1秒遅延ルーチン作成で困っています [透明人間] 2005/08/14 19:56
- GOTO $+1ですか。
ありがとうございます!!
覚えておきます!!
>初めて書きこみます。
>
>蛇足になりますが、
>NOP命令を使わずに
GOTO $+1
>GOTO $+1 を使うと同じ命令サイズで2倍の時間を消費できますよ。
>ループで時間を稼いでいるようなので効果は微々たるものですが。