最近 PIC32MM0064GPL028 で遊んでいる。
「PIC32MM0064GPL028 – MPLAB Code Configuratorを使ってTimer1の割り込みでLチカさせる。 –」
「PIC32MM0064GPL028 – MPLAB Code Configuratorを使ってUART1でシリアル出力させてみる。 –」
Timerが1個しかないかと思ったら、Capture/Compare/PWM/Timer (CCP) modules というのが、とりあえずTimerの機能も持っているらしい。
その中には、Single output modules (SCCPs) というのと Multiple output modules (MCCPs) というのがある。
SCCP は 1つの PWM 出力を持ち、MCCP は最大で6つのさまざまな出力を持つんだって。
ここでは、単純に Timer1 以外にもういくつか Timer が使いたいというだけなので、MCCPを1つ使って 16-Bit の Timer を2つ用意してみる。
とはいっても、全体をちゃんと把握していないので、以下の設定で試してみる。
割り込みを有効にする。
システムのクロックを1MHzにして、それをMCCPのソースとして用いる。
もちろん1MHzならわざわざPLL使う必要は無いが、練習なのでわざわざ面倒なことをやってみた。
タイマーは16ビットとし、Pimary Timer Period = 0x5DC(1500)、Secondary Timer Period = 0x7D0(2000)、Prescaler = 1:64 とする。
これでGenerateすると、mccp1_tmr.cの中にタイマーの割り込み処理が2か所作成されるので、そこへお決まりのLチカ動作を書き込んで、実行させる(※)。
自動生成されたプログラム中のCCT1とCCP1の区別が良く分からないが、
CCT1 –> LATB7(16pin) –> Logic Analyzer 1ch(Brown)
CCP1 –> LATB15(26pin) –> Logic Analyzer 0ch(Black)
というようにつないで実際にパルスを見てみる。
結果、
CCT1 –> LATB7(16pin) –> Logic Analyzer 1ch(Brown) –> 96ms
CCP1 –> LATB15(26pin) –> Logic Analyzer 0ch(Black) –> 128ms
となった。
1000000 / 64 / 1500 = 10.42Hz(96ms)
1000000 / 64 / 2000 = 7.81Hz(128ms)
MCCでの記述と、実際に生成されるコードとの関係は下のようになっている。
Reference Manualのブロック図では以下のとおり。
3つのタイマーをそれぞれ異なる周期で使ってLチカしているので下のようにバラバラな点滅になる。
こんなんで、Timerだけを取っても16ビットのが7つも使えてたったの175円ですぜ、奥さん。
参考
「PIC32MM0064GPL028 + MCC でPWMを試してみる。」
(※)追記(2019/02/05)
この記事を最初に書いた時のバージョンがはっきりしないが、現状で
IDE v5.10
XC32 v2.15
MCC v3.66
MCCの出力するコードに
MCCP1_TMR_PrimaryTimerCallBack();
MCCP1_TMR_SecondaryTimerCallBack();
が追加されたのでわかりやすくなった。
mccp1_tmr.cの該当部分に以下のように書けば2つのLチカができる。
出力をRB6、RB7とした例になっている。