PIC32MM0064GPL028 + MCC でCLCを試してみる。

PWMをやりながらMCCを眺めていたらロジックっぽい絵の描いてあるアイコンがあった。
Configurable Logic Cell(CLC)というやつのようだ。
ロジック自体をほとんど知らないわけだが、ANDだのORだのを出力してくれるなら便利だし、それ以外の機能は想像つかない。
早速試してみる。

さっきまでSCCPをやっていたので、SCCP2とSCCP3でそれぞれ異なる周期のクロックを出せるようになっている。
そちらの設定は以下の通り。


CLC1を追加して以下のように設定する。

最初はなんじゃこりゃと思ったが、よく見て赤線のようにたどれば単純で、単に2つの信号のANDを取っているだけだ。
出力先を下のように設定した。

ロジアナで見るとこうなる。

上から順にSCCP2、SCCP3、CLC1の出力だ。
つまり、3段あるうちの上の2段の信号のANDを取ったものが下の段に表示されている。
赤外線リモコンみたいに一定周期の搬送波が必要なものを作るのにすぐにでも使えそうな機能だ。
PIC16Fとかで同じような機能があったように思うが、PIC32MMの方がロジック記号でビジュアル的に分かりやすい。




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

相変わらず行き当たりばったり、出たとこ勝負、解説は斜めに読む、でPWMをやってみる。
実はこのお題、「PIC32MM0064GPL028 – MCCを使ってMCCPでPWMもどきのLチカ。 –」でもやっているが、見事にかじっただけで放置してある。
今回もそうならないようにしたいという身持ちだけはある、毎回そうだが…。

System Moduleは以下の通り。
ほとんど初期状態で、2つだけ変更してある。

Single output modules (SCCP)とMultiple output modules (MCCP)があって前回はMCCPをかじってみたわけだが、Singleの方が簡単じゃないの?
ってだけの理由で、今回はSCCPをやってみることにした。
MCCPからSCCP2を追加する。

にしてもいろんな項目があって迷うので、ちょっと調べてみた。
すると。ここに「Dual edge compare mode, buffered.」が従来のPWMじゃね?
って書いてる人がいたのでそれを選んでみる。

あと、赤線の部分は適当な値を入れておく。
SCCP2で使うピンが設定できるようになるので、Pin Managerで以下のように出力をRA1に割り当てておく。

Analogの機能も持っているピンの場合はPin ModuleでAnalogのチェックを外しておく。

GenerateしてPICに書き込んで3ピンの出力を調べると下のようになる。

毎度のことだが、ここまでプログラムはまだ1行も書いてない。
出力されるパルスについて詳しく見ると以下の通り。

クロックは8MHzでTimer Periodを0x7FFFに設定した。
1クロック当たり1 ÷ 8000000 = 125nsを32767(0x7FFF)回カウントする。
計算上 125ns × 32767回 = 4ms となって実測値の4ms(244Hz)と合っている。
これがPWMの周期になるということだ。
問題はデューティー比なわけだが、パルスの先頭の幅は、実測では681usとなってクロック換算では5448クロック分となる(681×1000÷125)。
これは、Primary Compare ValueとSecondary Compare Valueの差5461(0x3FFF-0x2AAA)にほぼ等しい値となる。
Secondary Compare Valueだけ変更して0x5000としてみた。

実測値は1196usということだ。
( 0x5000 – 0x2AAA ) × 125ns = 9558 × 125ns = 1195us
となって、これも計算値と合う。
Secondary Compare ValueとPrimary Compare Valueの差でHighの時間が決まるとみていいだろう。
結局のところ、Primary Compare Value分のクロックを数えたらHighにし、Secondary Compare Value分になったらLowにするという作業をTimer Periodの周期で行うってことだろう。

というわけで、何となく出てくるものの様子はわかった。
PWMの定番、LEDを滑らかに点滅させてみる。

ロジアナで出力を見ると上のようにグラデーションになる。

上のプロジェクトのパッケージファイルはこちら。
Project Package of SCCP2 LED Blinking Sample for PIC32MM0064GPL028 (1431 ダウンロード )

PIC32MM0064GPL028 関連記事一覧




PIC32MM0064GPL028 + ST7735 でプログラム・メモリに置いた画像を表示させる。 - 表示する -

PIC32MM0064GPL028 + ST7735 でプログラム・メモリに置いた画像を表示させる。 – データの準備 –
あるいは
PIC32MM0064GPL028 + ST7735 でプログラム・メモリに置いた画像を表示させる。- データの準備GIMP編 –
の続き。

ここからは PIC32MM0064GPL028 + ST7735 での作業だ。
というか、MPLAB X + MCC + XC32 での作業だけど。

1.44インチのカラー液晶のドライブICであるST7735のデータ・シートには以下のようにある。

そもそもフルカラーではなかったんだな。

用意したBMPファイルは、色数には限りがあるものの色データ的には3バイト分持っているので、
262k colors, RGB 6-6-6-bit input
ってやつにすればいいだろう。
そのまま送ればいいようにも思うし、2ビットは0にしなきゃいけないような気もする。
それに間のD8の1ってのもよくわからない。
D0~D7があって、さらにD8があるのだ。

とにかくこうやってみた。

表示できた。


Arduinoから移植した時の設定と変えたのは下に示した部分だけだ。

上に書いた、今回選んだ方式の display data formatsってやつに設定するコマンドだ。

この要領で画像を3枚持つとメモリが一杯になる。

ST7735方式のうち、ここで選んだものでデータを用意すると、
128 × 128 × 18 = 294912 bits = 36 KiB
用意したBMP画像は、
128 × 128 + 54 + 256 × 4 = 17462 bytes = 17KiB
なので、こちらの方がサイズは小さくて済む。
実際はCのデータ文に直すときにパレットのダミー・データは捨ててるので、さらに256バイトだけ小さい。

ST7735方式の一番データの少ない場合は、
128 × 128 × 12 = 196608 bits = 24576 bites = 24 KiB
となって、ここでやったBMPの減色方法よりサイズは大きくなる。
BMPファイルのもっとデータの少ない場合の16色では、
128 × 128 + 54 + 16 × 4 = 16502 bytes = 16KiB
となって、色的に悲しい割にサイズにお得感が全く無い。
結局、見た目的にパレット方式ってどうよ、ってことに尽きる気がする。
上に載せたように肌色の多いお姉ちゃん画像ならたぶんパレット方式の勝ちだろう。

プロジェクトのZIPパッケージをBOOTHで販売中
MPLAB X IDE Project Package ZIP File On Sale

PIC32MM0064GPL028 関連記事一覧




PIC32MM0064GPL028 + ST7735 でプログラム・メモリに置いた画像を表示させる。 - データの準備 -

1.44インチのカラー液晶だが、ArduinoのライブラリとかだとSDカードを取り付けてそこから読み込んだ画像を表示したりしている。
1.44inchカラー液晶+Arduino Nano クローン+SDカード で画像表示する。
それでもいいんだが、せっかくプログラム・メモリが65535bytesもあるんだから画像くらい持てるだろう。

圧縮した画像をデコードするほどの技量は無いので、そのままのデータで置きたい。
仮にフルカラーだと、128 × 128 × 3 = 49152 bytes となって1枚しか持てなくてちょっと寂しい。
PSPの減色処理のメニューを見ると下のようになっていて、

16色か256色ってとこだろう。
256色8ビットとすれば、 128 × 128 × 1 = 16384 bytes となって3~4枚持てそうだ。

調べてみる。
ここあたりを参考にさせていただいた。
http://www.umekkii.jp/data/computer/file_format/bitmap.cgi

自分なりに解釈したところをまとめると以下の通り。
色情報が1ピクセルあたり8ビットになるというのはいい。
256色というのは、使われている代表的な色を256色に集約してその色のテーブル(パレット)を持つということのようだ。
各ピクセルは、その256色のうちのどの色でそのピクセルを表示するかを色の番号(インデックス)で持っている。
そもそもBMPファイルには、ヘッダ、パレット、画像データの順にデータが書いてある。
ある画像を減色して8ビット化したもののパレットを表示したのが下の絵だ。

上は119番のパレットを示しており、色は R:169, G:82, B:84 と記録されている。
あるピクセルを表示しようとする場合の手順は以下の通り。
1.ピクセルのデータとして1バイトのデータを読んでくる。
 データは0~255のいずれかだ。
 ここでは 119 とする。
2.その番号に対応した120セット目のパレット・データを読みに行く。
 順に 0x54, 0x52, 0xA9, 0x00 と書いてある。
 これは BGR の順だ。
 最後に1バイト(0x00)のダミーを加えて4バイトで1セットとなっている。
 256セット、256 × 4 = 1024 bytes 書いてある。
3.液晶の表示ピクセルの青を0x54、緑を0x52、赤を0xA9で光らせる。
4.以上をピクセル数だけ繰り返す。

BMPファイルのデータをCのデータ・ファイルにするプログラムをVB6で作った。

この1.44インチのカラー液晶に実際に写真を表示させる話は「PIC32MM0064GPL028 + ST7735 でプログラム・メモリに置いた画像を表示させる。 – 表示する –
へ続く。

GIMP編は以下から
PIC32MM0064GPL028 + ST7735 でプログラム・メモリに置いた画像を表示させる。- データの準備GIMP編 –

PIC32MM0064GPL028 関連記事一覧




PIC32MM0064GPL028 + ST7735 – SPIの設定 –

PIC24FJ64GA002 + ST7735 は一応カラー・チャートの表示まで出来ているつもりでいた。
1.44inchカラー液晶 + PIC24FJ64GA002 とりあえず初期化と矩形の描画

最近は PIC32MM0064GPL028 ばっかり使っているので、続きは PIC24FJ64GA002 + ST7735 でなくて PIC32MM0064GPL028 + ST7735 で行こう。

クロック、SPI、待ちのdelay用のタイマー、全てMCCで設定した。
PIC24FJ64GA002 + ST7735 のコードをそのまま持ってきてそのまま使う。
SPIのピンだけ場所が変わるのでそこだけ差し替える。

動かない。
何も表示されない。
PIC24FJ64GA002 + ST7735 で表示されることを確認してそのモジュールをそのまま持ってきているので液晶の問題ではない。
ロジアナで信号を確認するとちゃんと正しいコードが送られている。
謎。

SPIの設定をとりあえず下のようにしてみたらちゃんと動いた。

でも、ロジアナで確認したじゃん。
ロジアナで表示される16進コードだけ見ていては違いがわからないから誤解した。

こうして並べてみるとクロックの立ち上がり、立ち下がりが逆だ。

そもそも、設定を全く見ずに初期設定のままで何とかなると思ってる方が甘いわけだ。
動かなくて悩んでやっとナニコレっていう全く逆の手順。
ここまできてやっとデータシート、じゃなくてSection 23. Serial Peripheral Interface (SPI)というマニュアルを読んでみると下のような図があった。

データ・シートの図は私にはごちゃごちゃでわかりずらいので、自分が斜めに読んであくまでもMCCのEasy Setupの範囲で関係ありそうな部分だけ抜き出してある。
赤枠は、いまとりあえず何だかわからんけど動いている設定だ。
CKEとCKPについては、マニュアルにあるレジスタの説明から端折って来て下に載せた。

SMPも同様に下の通り。

さらに、下はST7735のデータシートの写しだ。

クロックがLowからHighへ変わるところで読み込むよって意味だと思う。
ついでにこの絵も。

わざわざ上向きの矢印が書いてあって分かりやすい。

で、これをPIC32のマニュアルの図と比べると、確かに今動いてる設定は条件に合ってそうだ。

設定を変更する前は、CKP=0, CKE=0 だったので、クロックの下がるところが中央に来ていてうまくなかったんだろうと分かる。
ここまでの理解で行くと、CKP=0, CKE=1 でも良さそうだが、案の定、見た目は問題無く動く。
じゃあ、とにかく立ち上がりを拾うってことで、サンプルの場所を中央から後方へ変えれば、CKP=0, CKE=0 や CKP=1, CKE=1 でもいけるのか。
これは動かなかった。
どこをデータ始めとするかとか、まだここで見ていない設定が関係してくるのだろう。

最後に残るのはそのまだ見ぬ設定なわけだが、当面の疑問は、「PIC24FJ64GA002 + ST7735 でなぜ動いた。」ってことだ。
まあ、どうせ真面目に考えないと思うけど。

現状でのMCCの全設定一覧。


あと、必須なピンの接続一覧
[crayon-6717464a8269c808774424/]
左はモジュールのシルク印刷のまま書いてある。
SDAとSCK以外はどのピンに割り当ててもいいと思う。
右端は、元ネタにしたArduino用のライブラリでの名前で、そのまま使っている。
PIC32MM0064GPL028 関連記事一覧




PIC32MM0064GPL028 + HX1230 – スクロールさせる –

回転とかができれば平行移動はすごく簡単だ。

ただし、回転でこう
[crayon-6717464a82f2e209429207/]
だった部分を、ただこう
[crayon-6717464a82f33135986696/]
変えただけなので、最適の方法とはなっていないだろう。
数式をいじくっただけってことだ。
PIC32MM0064GPL028 関連記事一覧




PIC32MM0064GPL028 + HX1230 – 正方形の部分を90°回転させる –

ドットの移動が出来るようになれば、後は何でも可能になる。
「その処理にどれくらいの時間がかかるの?」
ということと、
「それ、必要なの?」
ということの兼ね合いで実装するかどうか決めるだけ。

正方形の部分をその中心周りに90°回転させてみた。
こういうやつね。

90°なのでグッと簡単になってこうだが。

ドットの位置に上の変換を施すというのを全ドットについて地道にやるだけだ。
何か裏技があるのかもしれないが知らない。
それでもストレスを感じるような時間ではない。
下の動画ではこれでもdelayを入れてゆっくり表示している。
あと、肝心のこの処理の必要性については今一つ不明だ。

PIC32MM0064GPL028 + HX1230 – スクロールさせる –」もやってみた。
PIC32MM0064GPL028 関連記事一覧




PIC32MM0064GPL028 + HX1230 – 線や円を描く –

PIC32MM0064GPL028 + HX1230 – 文字の表示まで –」の続き。
PICの大御所のところでLCDに線を引くコードを見かけた記憶だけあった。
http://www.picfun.com/PIC24H/app24H01.html
当時は見てもチンプンカンプンだった気がするが、今日見てみたら何となくやってることが分かる。
ので、SG12864Aという液晶用のコードだがHX1230に移植する、というか参考にさせていただくことにした。

とりあえず線を引く。
2点間を通る直線上の点の座標を順に求めていけばいいので、ここは中学生レベルの問題だ。
結局のところ、96×64の範囲の平面上のある点を特定してそのドットを点灯させるか消灯させるか、ということに尽きる。
参考にしたのは下に絵で示した(上のリンク先から拝借)の赤線の部分。

縦に8つ並ぶビットのうちのどのビットが該当する点なのかを求める部分、その点の現在の様子との整合性を取る部分、の2点だ。
8で割った余り分だけシフトするというのはホウと思った。
あと、SG12864Aにはメモリを読み出す命令があるようだ。
一方で、HX1230では現在のメモリの様子を読みだせるかどうかわからない。
そこで、PIC上に仮想メモリを用意してそこにも液晶の点灯状態を記憶させることにした。

赤線が仮想メモリだ。
LCDのメモリへのアクセス方法はHX1230の方が単純なので、大先生のコードよりすっきりしている。
以上で、「あるドットを指定して点灯状態を変える。」という処理が出来るようになった。
あとは線だろうが円だろうが、数学の平面図形の知識で何でも描けることになる。

とても表へ出せるようなコードではないが、例えば円は下のようなコードで描くことが出来る。

円の方程式ってやつだ。
ラジアン忘れてた。
角度の部分が見づらいのは、値の変化を細かくし過ぎると重くなるし、粗いと円が破線になるしでちょっと設定を決めかねているからだ。

細かな部分の詰めは必要だが、ここまでの段階での全ての集大成がこれ。

円周上の点を決めること、2点間を結ぶ線を引くこと、の2つの処理を行っている。

PIC32MM0064GPL028 + HX1230 – 正方形の部分を90°回転させる –」もやってみた。
PIC32MM0064GPL028 関連記事一覧




PIC32MM0064GPL028 + HX1230 - 文字の表示まで -

PIC32MM0064GPL028 + HX1230 – 絵の表示まで –」でデータシートのサンプルコードまんまを試している PIC32MM0064GPL028 + HX1230 だが、フォントのデータが載ってない。
プログラム部分はある。

どう見ても8×8のドットを表示するごく普通の奴をやっているように見える。
このENGLISH_tab8x8というのがフォントのデータだろう。
この辺は一度考えてみたことがあるので、上のような単純な物なら見ただけで何となくわかる。
SSD1306でフォントや画像をどう表示するか。」でやったような方法なら面倒だが、ここではそんな面倒な事ではなさそうだ。
ただ、フォントのデータはデータシートには無い。
適当なのを探してきた。

コードはそのままデータだけ用意すれば表示できる。
フォントについて言えば、どうも、下の絵の右のようにデータ化してくれてある物は多いが、下の絵の左のようにやっているものが少ない気がする。
理由は分からない。
そういうデータの扱いをするドライバICの方がポピュラーだからかもしれない。

データシートが中国語で読めないので、右のデータに対応したデータの書き込みがこのモジュールで可能なのかわからない。
少なくともサンプル・プログラムではそうやってない。
そもそも、いろいろ面倒だし、表示するのは決まった文句だけだから絵でいいじゃん。
PIC24FJ64GB002 + MCC + Nokia 5110 Graphic LCD (PCD8544) – グラフィック表示の方法 –
上の記事ではそう考えて、絵を表示して済ませている。
つまり、今まではフォントについて真面目に考えたことがない。
今回はちょっと考えて、自分でフォントも作ってみた。

いやあ、やっぱりプロポーショナルなフォントはいい。
実際には小文字のgとかjとか下にはみ出す文字もあるので、上のように目一杯でなく下のように一回り小さめの方がかっこいい。

ま、好みの問題だ。

PIC32MM0064GPL028 + HX1230 – 線や円を描く –」へ続く。
PIC32MM0064GPL028 関連記事一覧




PIC32MM0064GPL028 + HX1230 - 絵の表示まで -

ちょっと前から某掲示板でこのHX1230というLCDの話題を出している人がいて、面白半分で買ってみた。

お決まりの手順としてまずArduinoで動作確認する。
U8g2のリストの中にちゃんと入っているので何も考えずに完了する。


購入直後の儀式はそれで終わり。

さて、PICでどうしようということだが、最近お気に入りのPIC32MM0064GPL028で動かしてみることにした。
データシートにサンプル・プログラムが載っているのでそれを拝借することにする。

ヘッダ・ファイルの名前にあるのはstc12c5a60s2というSTCMICROという会社のマイコンだ。
眺めてみたが、ピンの指定方法が違うのと、フォントやグラフィックのデータが含まれていない点だけで、他には問題なさそうだ。
どうせ遊びだから、自前のドット絵でも一枚表示出来れば成功というところだろう。

そのまま移植して、ほとんど書き換えずにそのまま絵が表示できた。

文字を表示する部分は後回しにして全部カットし、下に示した出力ピンを指定する部分だけは書き換えた。

この4ピンはMCCで設定した。
クロックもMCCを使って16MHzにしたが、あとでstc12c5a60s2をみたら最大35MHzで動くようだった。
タイミングを取るdelayの関数もただの空ループなのでクロックの差が影響するかもしれない。
そもそもBit Bangなので、PICの内蔵モジュールも何も使っていない。
もしかしたらSPIは使えるのかもしれない。
よく利用する画像データの準備サイトImageConverter (Mono)で96×64ピクセルの画像を変換しようとしたら大きすぎと言われたので上下半分ずつにしてあとで合わせた。

画像を表示するコードもデータシートのままだ。

文字の表示については別の記事「PIC32MM0064GPL028 + HX1230 – 文字の表示まで –」で。
PIC32MM0064GPL028 関連記事一覧