10,000,000分周の1PIC化
2019-06-19
タイトルの件は半年以上前に2つのPICで片付けていることなんですが、旧ローカルさんに「CLCを使って1PIC化できるよね」とアドバイスを頂き、手が空いたら何とか1PIC化を試してみようと思っていた宿題です。そして、使用するPICF16F18313・・・いわゆるPIC16F1シリーズ(5桁PIC)はタイマやCCPモジュールの仕様が改善していることから、これらの機能を上手く使うと「もう少し簡単にできるんじゃなかろうか」と当たりを付け、近年無かった会社の忙しさの中で、毎日帰宅してからちょっとずつ実験をしていました。
まずは条件・・・今回の必要スペックは、10MHzのクロックを1千万分の1に分周して1Hzを得ること、さらに作りかけの周波数カウンタで使用するプリスケーラの分周比(1/64)に対し上手くカウントできる”1.5625Hz”を出力できるようにすることが必要です。この周波数の切り替えには1つのポートをスイッチ代わりに使いますが、この辺りはI/Oポート処理の話で難儀なことはありません。
一方、周波数の分周には考慮の為所があります。このICは6ポート(RA0~5)を具備、その内1ポート(RA3)は入力専用です。つまり、このポート以外は双方向に使えます。さらに、外部から10MHzの基準クロックを貰うとすると、RA5はこの役目を果たす必要があります。
残り4ポート・・・まぁ数的には全く問題ありませんが、個々のタイマの分周能力を考えると最低2つ、何れかのポートを使ってをシリアルに接続して動作させる必要があります。
さて、PIC16F18313には旧来の”Timer0”とは仕様が異なる”New Version”が搭載されています。
・8ビットのカウンタが拡張され、16ビットでも動作させることが可能
・8ビットのカウンタ2つ(TMR0HとTMR0Lの比較)で「ソフト手間要らず」の周期カウンタを構成可能
⇒その上、指定したピンに出力ができる
最後の「指定したピンに出力ができる」・・・が実はミソで、この機能はCCPモジュールでCompareモード(Timer1を使用)、PWMモード(Timer2を使用)でも同様に出力指定したピンにクロックが出せますから、組み合わせは様々に考えられます。ただ、分周出力の拡張性を考えると、16ビット動作が十八番のTimer1を組み込んでおいた方が有利です。
最初は「Fosc/4⇒Timer2⇒Timer1⇒1Hzを出力」と考えてあれこれ弄ってみたんですが、どうも上手く動作しない
そこで、「Fosc/4⇒Timer1⇒Timer0⇒1Hz」という流れにしたら上手く動かすことができました。
自分的備忘録として、もう少し詳しく記しておきます。
∴これで1Hz
Timer1の出力とTimer0の入力は1ポートで賄えるため、結構経済的にポートアサインが可能です
今回は分周機能と1Hz/1.5625Hzの切り替えだけですから、4ポートで実現できてしまいました。個々のタイマを同期モードで動かすことを忘れないように

実験風景です。上方のソケットに刺さっているのは10MHzの発振器、下方がPICです。クロックはRA5に入れ、RA4をTimer1とTimer0との接点、RA2が出力です。RA0がクロック切り替えポート。
得られた波形はこんな感じ。

下の青い方が1Hzの立ち上がり、黄色が10MHzクロックです。これで安定していますから、恐らく上手くいった・・・ってことで、青い方の波形は如何に

まぁ、ざっとこんな感じになりました。
今回は1Hz出力を狙いましたが、実はTimer0の分周はたったの「2」ですから、少なくともあと1/100はイケます。即ち、0.01Hz・・・100秒のクロックを作ることもできます。
と、言うわけで、どうやら”宿題”は片付きました。さぁて、作りかけの周波数カウンタはどうしよう
まずは条件・・・今回の必要スペックは、10MHzのクロックを1千万分の1に分周して1Hzを得ること、さらに作りかけの周波数カウンタで使用するプリスケーラの分周比(1/64)に対し上手くカウントできる”1.5625Hz”を出力できるようにすることが必要です。この周波数の切り替えには1つのポートをスイッチ代わりに使いますが、この辺りはI/Oポート処理の話で難儀なことはありません。
一方、周波数の分周には考慮の為所があります。このICは6ポート(RA0~5)を具備、その内1ポート(RA3)は入力専用です。つまり、このポート以外は双方向に使えます。さらに、外部から10MHzの基準クロックを貰うとすると、RA5はこの役目を果たす必要があります。
残り4ポート・・・まぁ数的には全く問題ありませんが、個々のタイマの分周能力を考えると最低2つ、何れかのポートを使ってをシリアルに接続して動作させる必要があります。
さて、PIC16F18313には旧来の”Timer0”とは仕様が異なる”New Version”が搭載されています。
・8ビットのカウンタが拡張され、16ビットでも動作させることが可能
・8ビットのカウンタ2つ(TMR0HとTMR0Lの比較)で「ソフト手間要らず」の周期カウンタを構成可能
⇒その上、指定したピンに出力ができる
最後の「指定したピンに出力ができる」・・・が実はミソで、この機能はCCPモジュールでCompareモード(Timer1を使用)、PWMモード(Timer2を使用)でも同様に出力指定したピンにクロックが出せますから、組み合わせは様々に考えられます。ただ、分周出力の拡張性を考えると、16ビット動作が十八番のTimer1を組み込んでおいた方が有利です。
最初は「Fosc/4⇒Timer2⇒Timer1⇒1Hzを出力」と考えてあれこれ弄ってみたんですが、どうも上手く動作しない

自分的備忘録として、もう少し詳しく記しておきます。
① Timer1のクロックにFosc/4を入力
② Timer1のプリスケーラで1/8
② Timer1のプリスケーラで1/8
③ CCP1H:Lに15625分周(15625-1)を設定
④ Timer1を使ってCCP1をCompareモードで動作させる
⇒一致時にTimer1をクリア、トグルするモード(1/2)
⇒一致時にTimer1をクリア、トグルするモード(1/2)
⑥ TMR0H:TMR0Lを2:1に設定(1/2分周)
⑦ ポストスケーラで1/5分周
∴これで1Hz
Timer1の出力とTimer0の入力は1ポートで賄えるため、結構経済的にポートアサインが可能です



実験風景です。上方のソケットに刺さっているのは10MHzの発振器、下方がPICです。クロックはRA5に入れ、RA4をTimer1とTimer0との接点、RA2が出力です。RA0がクロック切り替えポート。
得られた波形はこんな感じ。

下の青い方が1Hzの立ち上がり、黄色が10MHzクロックです。これで安定していますから、恐らく上手くいった・・・ってことで、青い方の波形は如何に


まぁ、ざっとこんな感じになりました。
今回は1Hz出力を狙いましたが、実はTimer0の分周はたったの「2」ですから、少なくともあと1/100はイケます。即ち、0.01Hz・・・100秒のクロックを作ることもできます。
と、言うわけで、どうやら”宿題”は片付きました。さぁて、作りかけの周波数カウンタはどうしよう

- 関連記事
-
- リプルフィルタの検証
- やはり〇〇クオリティ・・・でも改良したら使えそうな同軸切替器
- 10,000,000分周の1PIC化
- 10MHzのBPF・バッファのシミュレーションとプチ実験
- インバータによるバッファの出力電力