まずはパルスをポート直結で読んでみます。電圧は7V程あるので、単純に抵抗で分圧して5V以下になるようにして、ポーリングで1→0となるタイミングでカウントしてたところ、ちゃんと読み出すことができました。
これだとポーリングで電力を消費するので、INT0で割り込みを掛ける方式も試行してみましたが、これもちゃんと読めました。
同時に、Timer0で1秒の周期を拵えて、そのタイミングで"."を出すようにしました。
秋月ボードには20MHzの水晶が載っていて、内部でFoscが48MHzになるように設定しています。Timer0を「T0CS(Timer0 Clock Source Select bit)=0」にすると、Internal instruction cycle clock単位となって、1カウントはFosc/4=12Mzになります。
これで1秒を作るには1:256のプリスケーラを噛ませて1/(1/(12*1000*1000)*256) = 46875カウントになります。
Timer0は16ビットのアップカウンタとして使えて、ラップアラウンド(0xFFFF → 0x0000)のタイミングで割り込んでくれるので、0xFFFF-46875(0xB71B) = 0x48e5を書きこんでスタートさせれば、ちょうど1s後に割り込みが発生することになります。
ちなみに、googleで「46875を16進数で」と検索すると0xB71Bと出てきます。
さて、とりあえず実験としてはOKですが、いくつか問題があります。
- このガイガーカウンターは、一回の検知(クリック音)でパルスが2~3回出てしまいます。これを全部数えてしまわないように不感時間(dead time)を設ける必要があります。
- パルスをポートに直結すると、電圧の降下量がポートのH/Lのスレッショルドにうまくはまらないと、検出ミスを起こします(実際、弱いパルスが出ると無視してしまう現象が起きました)。これを避けるために、スレッショルドを調整できるようにコンパレータを使うことにしました。
0 件のコメント:
コメントを投稿