RC2014で使われているクロックは、7.3728Mhzでこの数値から1ステート(1クロック)に掛かる時間を計算すると計算式は1/7.3728*10^16となる。

これを計算すると、0.135633…..と出てくるので小数第3位くらいで丸めて0.136µsとして扱うことにする。

まずは使いそうな命令のステート数とそれに掛かる時間をまとめておく。

  • INC,DEC 8ビット演算の場合 4ステート 1.36µs
  • NOP 4ステート 1.36µs
  • JP 10ステート 1.36µs
  • CALL 17ステート 2.312µs

まずは100µsのサブルーチンを作成後、それを数回呼び出して10msのサブルーチンを作ってみる。

色々試行錯誤をしてみたが0.5msほどの誤差が出てくる。

よくわからないのでとりあえず本に書いてある5秒のルーチンを作ってLEDを点滅させてみる。

0.25秒ほどの誤差があった。

10msのループで、100µsのルーチンを100回呼び出すのに掛かるCALLの時間は合計で231.2µs掛かる。

100µsのループと10msのループの微調整をやってみた。

まず100µsのループの必要な回数は、100/(0.136 * 22)で求められる。よって33回ループすれば大体100µsの待ち時間を得ることができる。

10ms側ではCALLにより231.2µsの誤差があるのでこれを考えて100µs側のループの回数を減らしていく。10ms側は一回のCALLによって約2µsほどかかるので100µsのループを2回ほど減らす。

10ms側のループでNOPを入れて調整していく。

今回待ち時間の計算をやってみてDelay関数やSleep関数の有り難みがわかった気がした。PICなどのプログラムの最初で周波数の宣言がなぜ必要なのかもよくわかった。