PIC32MX220F032B + Nokia 5110 Graphic LCD (MPLAB Harmony Configurator)

PIC32MX220F032BでNokia 5110 Graphic LCDを駆動してみる。
MPLAB Harmony Configuratorで基本部分の設定をする。
どうも、Harmonyを使いこなせていないので、システムまわりの設定はHarmonyの吐き出すコードを使うけど、肝心のSPI出力の部分はHarmonyと無関係に手で書く。
というより、どういうスタイルがいいのか良く分かっていない。
Harmonyの吐き出すコードの意味や使い方が全く分かっていない。

肝心なSPIの設定を先に書くが、項目が多いのと、なのにちゃんと調べずにやっているのとで、なんとなく理解したつもりで設定しているのが赤線の部分だけだ。
pic32mx220f032b_nokia5110_mhc_01
クロックはこんな感じだが、
pic32mx220f032b_nokia5110_mhc_02
Clock Confifurator(タブではClock Diagram)でやった方が分かりやすい。
pic32mx220f032b_nokia5110_mhc_03
特に変わったところはなく、PIC32MXではみんなずっとこの設定で動かしている。
SPIがらみの設定が何かあるのかもしれないが、上のSPIのところで1MHzにしたらちゃんと1MHzになったので、それ以上追及していない。
pic32mx220f032b_nokia5110_mhc_04
下は初期化部分の信号の様子をみたところ。
pic32mx220f032b_nokia5110_mhc_05
実際にSPIで信号を送っている部分は手書きで以下のように書いた。
pic32mx220f032b_nokia5110_mhc_06
MHCが吐き出す膨大なコードの中に、該当する部分が無いか探してみたが、探し疲れた。
スキル不足で、コードが追えないので、やむを得ない。
結局、当座はこれでいいやということにした。
そのほかの部分は「PIC24FJ64GA002 + Nokia 5110 Graphic LCD (PCD8544) – 初期化成功まで –」で書いたコードとほとんど同じだ。
違うのはピンの設定くらい。
pic32mx220f032b_nokia5110_mhc_07
pic32mx220f032b_nokia5110_mhc_08
20161105164341




PIC32MM0064GPL028 – MPLAB Code Configuratorを使ってMCCPの割り込みでLチカさせる。 –

最近 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での記述と、実際に生成されるコードとの関係は下のようになっている。
pic32mm0064gpl028_mccp1_161026_04
Reference Manualのブロック図では以下のとおり。
pic32mm0064gpl028_mccp1_161026_06
3つのタイマーをそれぞれ異なる周期で使ってLチカしているので下のようにバラバラな点滅になる。

こんなんで、Timerだけを取っても16ビットのが7つも使えてたったの175円ですぜ、奥さん。

参考
PIC32MM0064GPL028 + MCC でPWMを試してみる。

PIC32MM0064GPL028関連記事一覧

(※)追記(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とした例になっている。




PIC32MM0064GPL028 – MPLAB Code Configuratorを使ってUART1でシリアル出力させてみる。 –

PIC32MM0064GPL028 – MPLAB Code Configuratorを使ってTimer1の割り込みでLチカさせる。 –」の続き。

System Module は初期設定のままだ。
pic32mm0064gpl028_uart1_161025_01
pic32mm0064gpl028_uart1_161025_02
動作確認のLチカ用のピン設定をするが、もし隠れていたらこうやって窓を表示させることができる()。
pic32mm0064gpl028_uart1_161025_03
設定したいピンを右クリックして、ここではoutputに設定する。
pic32mm0064gpl028_uart1_161025_04
アナログ機能も持っているピンの場合は、チェックを外しておく。
pic32mm0064gpl028_uart1_161025_05
ピンの設定については「MPLAB Code Configurator – ピン関連の設定をする窓 –」にまとめた。
Lチカとシリアル送信のタイミングはTimer1で取ろうと思うので、以下のように用意する。
pic32mm0064gpl028_uart1_161025_06
今回の主題であるUART1も設定する。
こちらは初期設定のままだ。
pic32mm0064gpl028_uart1_161025_07
この段階でシリアル通信に使うピンについてもPin Managerに表示される。
使うピンは下のようにカギをかけた状態にする。

これを参考に、U1RX(26ピン)をUSBシリアル変換モジュールのTXに、U1TX(25ピン)をUSBシリアル変換モジュールのRXに接続する。
TX – RX をそれぞれつなぐということだ。

Generateする。
pic32mm0064gpl028_uart1_161025_08
Lチカ関連は以前にも書いたので省略する。
自動生成される uart1.c を眺めてみると、出力動作はこんな感じでやるらしいと分かる。
pic32mm0064gpl028_uart1_161025_09
ここで初めてReference Manualに目を通すと、

UxSTAbits.UTXBF: Transmit Buffer Full Status bit (read-only)
1 = Transmit buffer is full
0 = Transmit buffer is not full, at least one more character can be written

UxTXREG: UARTx Transmit Register
This register provides the data to be transmitted.

などど書かれている。
とりあえずは、この関数を直接呼んでみる。
Timer1 の割り込み発生時に呼ばれる TMR1_CallBack(); 内に以下のように書いた。
pic32mm0064gpl028_uart1_161025_10
赤枠内はいわゆるLチカだ。
青枠は「SAHARA」の6文字のアスキー・コードと、CRとLFのコードをUART1に送っている。
コンパイルして実行すると、USBシリアル変換モジュールを経て、PC上のターミナル・ソフトにちゃんと表示される。
pic32mm0064gpl028_uart1_161025_11
上の設定のままなら1秒間隔で繰り返し「SAHARA」が表示されるわけだ。
相変わらず、拍子抜けするくらいに簡単だ。
下に示したような文字列を表示する関数を用意してみる。
pic32mm0064gpl028_uart1_161025_12
この場合は下の赤線のようなコードを追加すれば、文字列を送信することが出来、若干実用的にはなる。

キー入力した文字のコードに1加えて返すだけの、よくあるシンプルな例なら、自動で生成される main.c の中の main() 内のwhileループの中に、
UART1_Write(UART1_Read()+1);
と書くだけでいい。
pic32mm0064gpl028_uart1_161025_13

なお、文字を送る場合で速度を変えてみたら、MCCで設定可能な最高速度の460800bpsでも文字化けせずに送れた。

PIC32MM0064GPL028関連記事一覧


行方不明の窓を出す方法に関しては、MCCのバージョンが変わると設定方法が少し変わったりする。
v3.65では以下のものが役立ちそう。




PIC32MM0064GPL028 - MPLAB Code Configuratorを使ってTimer1の割り込みでLチカさせる。 -

PIC32MM0064GPL028 – Lチカ用の回路の準備。 –」あるいは「PIC32MM0064GPL028 – Lチカ用の回路の準備(DIP編) –」の続き。
いよいよ、MPLAB Code Configurator(MCC)を使ってTimer1の割り込みでLチカさせてみる。

PIC32なんだからHarmonyが使えるのかと思ったら、このチップがリストに無かった。
MPLAB Code Configuratorは対応しているようだ。
このあたりの棲み分けがずっと分からずにいる。
両方対応しているものもあるし、よくわからない。
ちなみに、PIC32MMでMCCが対応しているのは以下のチップだ(2016/10/25)。
[crayon-671749b263c30626522332/]
プロジェクトを作り、MCCを起動する。

まずSystemまわりを設定する。

初期設定から変更した部分を赤で囲ってあるが、MCCのバージョンによってこの初期設定が違うような気もするので、他も変更が必要かもしれない。

LEDを3つつけてみる。

Analogにチェックが入ってないことを確認する。
私の環境ではRA0とRB15にチェックが入っていたので外した。

Timer1を使う。

500msで点滅させる。

Generate
pic32mm0064gpl028_mcc_t1_lblink_07
tmr1.cからTMR1_Start( void )をコピペしてきて、
pic32mm0064gpl028_mcc_t1_lblink_08
main.cのint main(void){のSYSTEM_Initialize();の次あたりへコピペし、voidを消してセミコロンを入れる。
pic32mm0064gpl028_mcc_t1_lblink_09
tmr1.cへ戻って、TMR1_ISR()に
[crayon-671749b263c37404621878/]
を書き込む()。
pic32mm0064gpl028_mcc_t1_lblink_10
今までのところ、まともなキー入力はこれが最初だ。
ビルドする。

PICに書き込む。

Lチカ完成。
LチカだけならArduino並みの簡単さだ。
データシートを1度も見てない。
実際のブレッドボードの写真。

2, 16, 26の各ピンから>抵抗>LED>GND と3組のLEDと電流制限抵抗をつないである。
PICkit3との接続は、白=GND、赤=電源、緑=MCLR(1ピン)、茶=PGD1(4ピン)、青=PGC1(5ピン)に配線してある。

()
TMR1_ISR(){でなくTMR1_CallBack( void ){に書く方があとで融通が利くのかもしれない。

ここでは、callbackをカウントせずに済む設定なのでどちらでもいい。

追記(2021/09/18)
クロックは4つから選択できる。

ダイアグラムでは以下のようになっている。

LPRCは32kHzの内部クロック、PBCLKは8MHzの内部クロック、SOSCは外部接続のクロックだ。
T1CKは18ピンからの外部入力だ。

上でもやったように、普通はPBCLKを使うことになるだろう。

PIC32MM0064GPL028 – MPLAB Code Configuratorを使ってUART1でシリアル出力させてみる。 –」へ続く。

PIC32MM0064GPL028関連記事一覧




PIC32MM0064GPL028 - Lチカ用の回路の準備。 -

このページはハンダ付けオタみたいな内容になっています。
普通にDIP品を使う方の参考にはなりませんのでこちら「PIC32MM0064GPL028 – Lチカ用の回路の準備(DIP編) –」へどうぞ。
なお、開発環境の準備については以下でどうぞ。
MPLAB X IDE 5.45 をインストールする。

PIC32MM0064GPL028のSOICパッケージを変換基板に取り付けてブレッド・ボードに載せ、MPLAB Code Configurator(MCC)を使ってTimer1の割り込みでLチカさせてみる。
まずは、テスト用の回路をブレッド・ボードに組むまで。
秋月の変換基板に載せるのだが、あわよくば無傷で外してプリント基板に実装できるように、小細工をしてみた。
底に紙を何枚か貼って、足をフットプリントから浮かしてはんだ付けしてみた。
20161019193640
上がそのまま載せた状態で、下が浮かした状態だ。
20161019193640-1
はんだ付けするときにはんだを多めにする必要があるが、外すときは足が浮いているので、はんだを吸い取ればうまく外せるかなと期待している。
期待しているだけで、やってみてないので、うまくそうなるかはわからない。
20161019202235
基板の足は、Arduino Nanoにつけていたのを外して取り付ける。
20161019202531
秋月のリードフレームの手持ちがもっとあるつもりでいたら、数が足りなかったので流用だ。
はんだ付けしてなくてよかった。
PIC32MXの載っていたブレッド・ボードを流用して、
20161019203255
そのままチップだけ入れ替える。
20161019204644
300milだったのが700mil程度の幅になるので、他のパーツを若干寄せないとささらないが、19ピン以外に変更は無い。
PIC32MM0064GPL028 – MPLAB Code Configuratorを使ってTimer1の割り込みでLチカさせる。 –」へ続く。
PIC32MM0064GPL028関連記事一覧




PIC32MX120F032B – HarmonyのPWMでLEDを柔らかく点滅させてみる –

PIC32MX120F032B – HarmonyでPWMをやってみる –」で、LEDをPWNで薄暗く点灯させたので、今度は優しく点滅させてみる。
どういうやり方がベストなのか知らないが、とりあえずデューティー比を決めるOC1RSの値を変更して実現する。
こんな、泥臭いコードになる。
pic32mx120f032b_pwm_harmony_delay_01
delayが必要になったので、ついでにタイマーを追加して、Interrupt Flagをチェックする1msの待ち関数を作った。
pic32mx120f032b_pwm_harmony_delay_02
pic32mx120f032b_pwm_harmony_delay_03
こんな感じ。

新たに知ったことは、Timer1だけは特別だということ。
OCにTimer2を使ったので、同じつもりでTimer1を使ったら、いろいろ設定が違って予定通りの時間にならなかった。
そもそもカウント用のクロックのソースが違う。
今回は、Timer3に変えて解決した。()
pic32mx120f032b_pwm_harmony_delay_04

()
後でもう一度試してみたら、今回の使い方では違いがなかった。
クロックも同じものが使えた。
うまくいかなかったのは何だったのか良く分からなくなった。
ただ、Timer1とTimer2以降の2種類が違う機能を持っていることは確かだ。




PIC32MX120F032B – HarmonyでPWMをやってみる –

PIC32MX120F032B – PWMをやってみる –」で試したPWMを、今度はHarmonyで1からやってみる。
Clockの設定
pic32mx120f032b_pwm_harmony_test_01
Clock Diagram
pic32mx120f032b_pwm_harmony_test_02
ここで、PBCLKは40MHzになっている。
16kHzの周期のPWMにするので、40000000 / 16000 = 2500
Timer2のPR2を2500に設定する。
pic32mx120f032b_pwm_harmony_test_03
デューティー比を10%にするので、OCでPulse Wodthを250にする。
pic32mx120f032b_pwm_harmony_test_04
出力を15ピンのRB6にするには、Pin Diagramでピンをクリックするだけだ。
pic32mx120f032b_pwm_harmony_test_05
データシートを眺めて、
pic32mx120f032b_pwm_harmony_test_06
RPB7Rbits.RPB7R = 0x0005;
を手で打ち込むなんて必要は一切ない。
あとは、system_config¥default¥framework¥driver¥tmr¥src¥drv_tmr_static.c
から
DRV_TMR0_Start();
さらに、
system_config¥default¥framework¥driver¥oc¥src¥drv_oc_static.c
から
DRV_OC0_Start();
をコピーしてきて、main()内に貼り付ければ完成だ。
pic32mx120f032b_pwm_harmony_test_07
pic32mx120f032b_pwm_harmony_test_08




PIC32MX120F032B - PWMをやってみる -

例によって、まずは人様のコードをいただいてきて試す。
ここからもらってきた。
コピペしていきなりコンパイルすると、以下の2行でエラーが出た。
軽く検索したが、よくわからない。
コメントアウトして再度コンパイルしたら、エラーが出ずに完了して、書き込んだら動いた。
pic32mx120f032b_pwm_test_01

PIC32MX120F32Bを使って、基本の回路を組む。
16ピンに抵抗とLEDを接続しただけだ。
LEDの場所以外は「PIC32MX250F128B MPLABX XC32 Harmony でLチカしてみた。- 内蔵クロックで駆動 –」の写真と同じだ。

つないだLEDが暗めに点灯するので、確かにPWMで駆動しているようだ。
ロジアナで拾ってみると、周期が約2kHzとなって、16kHzだと書かれているのと食い違いがある。
pic32mx120f032b_pwm_test_02
ただ、デューティー比は合っているので、クロックがらみで違いがあるのだろう。
コメントアウトした部分で何を呼んでいるのかわからないので何とも言えないが、クロック関連をちょっと調べてみる。
以下のようなことがわかる。

PIC32MXではPripheral Bus Clock(PBCLK)によってタイマーがカウントされている。
システム・クロック(SYSCLK)の後にPBDIVで設定されるPrescalorが入ってPBCLKが作られている。
PBDIVの初期値が1:8のようだ。

今回のSYSCLKは40MHzに設定してあって、明示的にPBDIVを設定していないので、PBCLKは5MHzになっている。
というわけで、16kHzのはずが2kHzとなった。

こうやって、謎を解くと、Output Compare(OC)とTimerからPWMを作り出す仕組みもなんとなく理解できる。
今のところの理解では以下のような感じ。

周期はTimer2のPR2の値で決める。
同時にOCのOCxRSの値によってデューティー比も決まるというわけだ。
データシートのこの図がわかりやすい。
pic32mx120f032b_pwm_test_03
OC1とTimer2の例で書く。
(1)TMR2がクリアされ、デューティー比用の値がOC1RSからOC1Rにロードされる。
(2)PBCLKをカウントして、TMR2の値がOC1Rになると、OC1ピンの出力がLowになる。
(3)PBCLKのカウントを続けて、TMR2がPR2を超えると、再びデューティー比用の値がOC1RSからOC1Rにロードされ、OC1の出力がHighになる。
(4)(1)へ。




MPLAB Code Configurator – PIC32MX120F032B でTimer1のInterruptでLチカを試す –



普通にプロジェクトを作成してから、MPLAB Code Configulator(以下MCC)を起動する。
mcc_pic32mx120f032b_t1inte_01
まずはSystem Moduleの設定だが、順番に設定していけば迷うこともなく済む。
mcc_pic32mx120f032b_t1inte_02
続いて、Pin ModulはPin Managerで以下のようにした。
RB15は、設定はしたが使ってない。
mcc_pic32mx120f032b_t1inte_03
Analogの設定になっていたので、チェックを外す。
mcc_pic32mx120f032b_t1inte_04
Device ResourcesからTimerのTMR1を開く。
mcc_pic32mx120f032b_t1inte_05
下のように設定した。
mcc_pic32mx120f032b_t1inte_06
[Generate]をクリックするとコードを生成する。
tmr1.cからTMR1_Start();をコピーしてきてmain()に張り付ける。
mcc_pic32mx120f032b_t1inte_08
tmr1.cのTMR1_CallBack()に、以下のLチカの1行を追加する。
mcc_pic32mx120f032b_t1inte_09
あとはチップに書き込めば完了だ。
コードとして打ち込んだのはPORTAbits.と^=1;だけか。

実は、Harmonyでも同じものを作ってみた。
MCCの方がわかりやすい。
Harmonyは参考にしたサイトと比べながらだったが、MCCでは全く何も見ないでコードが組めた。
いったい、この2つの使い分け、棲み分けはどうなっているんだろう。
Harmonyは32BITだけが対象のようだが。

追記(2017/09/25)
ねらったわけでも何でもないが、ちょうど一年ぶりだ。
ブレッドボード上の配置写真と回路図を追加した。
久しぶりに組んでみて、MCLRのコンデンサを軽視して付けなかったら、プログラムの書き込みに余計な苦労をしたので。




PIC32MX250F128B MPLABX XC32 Harmony でLチカしてみた。(改めて見直し)

PIC32MX250F128B MPLABX XC32 Harmony でLチカしてみた。」を眺めていたら、ちょっと疑問点が出てきたので、見直している。
そもそも、ここを参考にして書いた記事だが、そのまま鵜呑みにしてコピーしただけなので細かいところまでは見ていなかった。

例えば、TMR_ID_2を指定しているのに、
picture13
Timer1を使っている。
picture221
HarmonyのHelpによれば、TMR_ID_2はTimer2だ。
harmony_help_tmr_module_id

そう思いながらコードを見直すと、T1CON = 0x8030 となっていて、Harmonyで設定したはずのPrescalerをもう一度設定していたりする。

したがって、正しくは以下のようにする。
pic32mx250f128b_harmony_led_blink_01_corr_01
pic32mx250f128b_harmony_led_blink_01_corr_02

関連記事
PIC32MX250F128B MPLABX XC32 Harmony でLチカしてみた。
PIC32MX250F128B MPLABX XC32 Harmony でLチカしてみた。- Interrupt –
PIC32MX250F128B MPLABX XC32 Harmony でLチカしてみた。- Timerを追加 –