果たしてちゃんと時間を刻んでるのか確かめたいが、LCDをつないでカウントを表示させるようなピンの余裕はない。
で、思いついたのが以前にもそんなことをやっていたが、内蔵のEEPROMに定期的にデータを書き込んでおき、あとで読み込んで確認するという方法。
以前はmikroBASICのサンプルそのままですぐにEEPROMへ書き込みができたが、MPLAB X配下のXC8の環境でどうしたらいいのか一向にわからない。
見つけてきたのはPIC18用に書かれたと思われるコードで、そのまま貼り付けたら真っ赤になった。
そこで、Data Sheetと首っ引きで手順を確認すると、一部不明な処理も書かれてはいるが、素人目には手順自体はData Sheetのものと同じように思えたので、若干の改造で動くんではないかと踏んで以下のように変更したら、ちゃんと内蔵EEPROMにデータを書き込むことができた。
左がもとのコード、右が改造後だ。
EECON1bits.WR=1;
を
WR=1;
だけにするというような変更が一番多いが、たまたまやったらできただけでどう書くのが正しいのかはわからない。
EECON1bits.EEPGD= 0;
EECON1bits.CFGS = 0;
の2つは、そのものがData Sheetに存在しなかったので、よく確認もせずコメント・アウトしてある。
Nop();
は、なぜか赤くなったのでコメント・アウトしてある。
INTCON=INTCON_SAVE;
の位置を変更してあるのは、書き込み終了後に割り込みが掛かって、interruptのルーチン内で面倒な分岐をしなきゃいけないかもなのを避けたつもりだ。
実際に動かしてみたら、ストップ・ウオッチで1901秒を示す間に1896回点滅するという結果になった。
0.3%の違いということだが、そもそもストップ・ウォッチは正確かということと、こういう比較方法でいいのかという疑問は残る。
ちなみに、前回、内蔵のクロックでの誤差は数%のオーダーだった。
今回仕入れたC言語の知識は以下の部分に使ってある。
unsigned char TimeH;
unsigned char TimeL;
static unsigned short int EEPDATAcounter;
TimeH = EEPDATAcounter / 0x100;
TimeL = EEPDATAcounter % 0x100;
int_EEPROM_putc(EEPDATAaddress, TimeH);
int_EEPROM_putc(EEPDATAaddress + 1, TimeL);
つまり、EEPROMへは1バイトづつ書き込まなければならないが、カウンターは2バイトなので、上位1バイトと下位1バイトを分割して取り出して別々に書き込む方法だ。
追記
実はTMR0はプログラムで値を設定できるのだった。
上の計算では何が何でも256カウントしなきゃあいけないもんだと思い込んでるので、
11776000 ÷ 4 ÷ 256 ÷ 256 = 44.921875
で大体45回繰り返す、とかやってるわけだが、
11776000 ÷ 4 ÷ 256 ÷ 250 = 46
で、ぴったりにできる。
もっとも、この、TMR0に値をセットするにも何クロックか必要なわけで、それも誤差にはなるわけだ。
でも、それは補正可能だなあ。
で、このことは、はるか昔に1度は学んでいたのだった。
唐突に興味を持つ–>右往左往する–>知る–>喜ぶ–>飽きる–>放置する–>忘れる–>唐突に興味を持つ
の無限ループ。
ただ、最近はプログラムにXC8を使っているので、このプログラム自体の実行による時間のロスを補正することはできるらしい。
mikroBASICの時にはそこまで踏み込んでなかったが、そもそもmikroBASICではその補正が難しいようなことがどこかに書いてあった気が。