PSoC ってどんな石?

(クリックして拡大)
PSoCブロック図と仕様
さて、いきなりであるがPSoCの内部ブロック図である。まぁ、初物を前にするとつばを三回くらい眉の上に塗りたくなる人はありきたりな8ビットのワンチップマイコンだなと思っておいてもいい。PSoCをPSoCたらしめているのが黄色く塗られたデジタルPSoCブロックとアナログPSoCブロックである。これから書いていく内容もこの両PSoCブロックの操り方に終始する。そのほかの細かい所は暇があればいずれ書くかもしれないけど、まぁ興味が沸いたら英文マニュアルをツラツラと眺めても面白いんじゃないかと思う。
というところで、一気にすっ飛ばしてもいいのだけど、とりあえず一応お約束の能書きが無いと寂しいので書いてみる。


分類 項目 仕様 備考
CPUコア アーキテクチャ M8C Cypressオリジナル
ハーバードアーキテクチャ
動作クロック(@5V) max24MHz レジスタ設定でクロック可変
動作クロック(@3.3V) max12MHz
処理性能 max4MIPS  
電源電圧 SMP不使用時 5V
または
3.3V
SMP:
Switch Mode Pump
(スイッチング型昇圧回路)
SMP使用時 1.2V  
発振回路 内蔵発振回路 32KHz/24MHz 内蔵発振回路使用時は外部のCRや水晶などは不要
外部発振回路 32KHz/24MHz  
内部メモリ フラッシュROM 32Kバイト  
SRAM 2kバイト 256バイト×8バンク
MAC 構成 8×8乗算+16ビット加算 積和演算用
IデジタルI/O ソース(吐出) 10mA スロープコントロール有
シンク(吸込) 25mA
プルアップ/ダウン ピン毎に設定 オープンドレイン/オープンソースも可
アナログI/O アナログ入力ピン数
(マルチプレックス)
max8本  
アナログ入力ピン数
(非マルチプレックス)
max4本  
アナログ出力ピン数 max4本  
アナログ出力電流 40mA  
PSoCブロック デジタルPSoC 8個  
アナログPSoC 12個 4個はコンティニュアス、
8個はスイッチドキャパシタ
その他 WDT    
パワーONリセット    
スリープタイマー    

PSoCの遊び方はちょっと違う
 ワンチップマイコン系の説明なんかでは、ブロック図を眺めたら、プログラミング環境を構築して、一応I/Oポートまわりのレジスタの説明でもやって、「さぁポートを叩いてLEDの点滅でもやってみましょうや」とやる。その後は内蔵されているモジュールのレジスタ説明等をやりながらボチボチを動かしていくというのが王道というものだろう。
 PSoCも一応立派なワンチップマイコンなので、このようなアプローチをすることももちろん可能ではある。ISSP(インシステム・シリアルプログラミング)の名のとおり、昔のPICのように特別な電圧を掛けたりしなくても3本(リセット、クロック、データ)の信号線で書き換えすることができるワンチップマイコンとして使ってみてもなかなか便利には違いない。
 ただ、こういうアプローチはPSoCらしくないのだ。とりあえずこのチュートリアルで遊んでいく上ではPSoCはマイコンだというイメージは忘れて、M8コアは単にPSoCブロックの初期化やら雑用処理の為に付けられたプロセッサだと思ってしまうほうがいい。

PSoCのからくり
 Cypressのサイトやら広告でよく見かける絵がこれ(細かいバージョンアップはなされているけども、大体同じような雰囲気)。結構うまく表現している絵だとは思うのだけども、ただ、これって「知っている人には分かる」という類のもので、知らない人には企業向けで内部構成を特注できるデバイスかという程度に思われるんじゃないだろうかという気もする。
 実際のPSoCはここにあるように、I2Cだのフィルタだのアンプだのカウンタだのというモジュールを選んできて、必要に応じて相互に内部結線を決めてやると、その通りのものに変身してしまうというデバイスなのである。
 と、言われても「?」マークが頭の中を飛び回ってしまうに違いない。からくりはこうである。 とりあえず、上の方に乗せたブロック図をもう一度眺めてみよう。赤く囲んだデジタルPSoCブロック、アナログPSoCブロックというものがPSoCの肝。

 まず、
デジタルPSoCと書かれているものはカウンタ、PWM、乱数ジェネレータ、UART、I2Cコントローラなどにモード切替できるマルチファンクションなI/Oブロックなのである。一般のワンチップマイコンだと、だいたい「シリアル○チャンネル、カウンタ○本」と決めうちされているけども、PSoCの場合には一つのブロックが複数の機能に切り替わるようになっている。カウンタなどは1つのデジタルPSoCブロックで8ビットカウンタなので、16ビットカウンタが欲しければ二つを連結するという具合にして実現する。こういう機能を持ったデジタルPSoCブロックが16個内蔵されている。(CY8C29466の場合)

 
アナログPSoCブロックはというと、アナログの汎用デバイスといえばピン!とくるとおり、中身はオペアンプ、そして「肝」とも言えるスイッチドキャパシタによる回路である。中身はというと下の図のように、3種類のものが4組、合計12個のブロックが内蔵されている。「うわぁ!」と泣き出したくなるかも知れない。トラ技の連載では回数が限られた中での紹介ということもあってスイッチドキャパシタの説明ははずせなかったけども、これから「マターリ」と遊んでいくならこんなものは「ふーん」という程度に思っておいてもかまわない。なぜなら、これらを使ったお役立ちモジュールはCypressが用意してくれているので、それらを組み合わせて利用する分にはこんな細々した話はすっ飛ばしても使えるからである。
 要するにこのスイッチだのなんだのをいじってやるとフィルタになったADCが構成できたりするのだということだけ頭の片隅に入れておいてもらえればいい。

 そして、これらのマルチファンクションブロック相互の結線やI/Oピンとの間の接続もFPGAほどではないにしても、それなりの自由度をもってプログラマブルになっていて、2入力1出力の論理演算回路がPSoCブロック間接続バスに入っていたりと、なかなかにお役立ちである。

 このようにマルチファンクションのブロックの設定と、これらのブロック間の相互結線をプログラマブルにしたデバイス、それがPSoCなのである。つまり、PSoCブロックの設定と、内部の配線の設定によって内部構成を切替えることで、自分好みのI/Oを用意したり、場合によっては複数の機能ブロックを組み合わせた独自回路にしてしまおうというのである。

 更にこの設定がいわゆるPLDやCPLDとは違ってレジスタベースであること、つまり
CPUのレジスタ設定で行われるというところがミソである。デバイスの初期化は初期化データのテーブルを見てCPUが起動時に設定しているのだけども、これを動作中にダイナミックに変更することも当たり前のようにできる。ダイナミック・リコンフィグレーションと言うのだろうけども、これはツール(PSoC Designer)でもサポートされている。


 こんな仕掛けで一応実現できるとはいえ、こんな設定を毎回手作業でやったり、制御用のプログラムを組むというのは著しく面倒である。特にアナログPSoCブロックなんて考えたくもないと思うに違いない。
 たとえばシリアルポートを使いたいときに、設定レジスタをいちいち調べてこっちのビットを立てるとパリティがこれで、このレジスタのエンプティフラグが立ったらデータを書き込んで・・などというのを調べながらプログラムを書くというのは勉強にはいいかもしれないけれども面倒くさいことこの上ない。「俺がやりたいのはレジスタのビット操作ではなくて、データを送りたいということなのだ」と思うのは当然である。
 ということで、CypressではPSoCブロックを使った機能ブロック(ユーザモジュールと呼んでいる)をあらかじめ用意して、これをペタペタと貼り付けてやると必要な初期化ルーチンはもちろんのこと、基本的な操作を行うI/Oルーチンまで自動生成してくれるというとってもお役立ちなツールを用意している。
 これがPSoC Designerと呼ばれるツール。だいたいこのツールが自動生成してくれるI/Oルーチン(マニュアルではAPIと呼んでいる)を呼ぶだけで事足りてしまうので、レジスタマップを調べる必要性もほとんど無いのも美味なるところである。
たとえば、LCDコントローラ(秋月液晶が使える・・はず)だと、
  char str[ ] = "User Module";
  LCD_1_Start();    //LCDコントローラ機能スタート
  LCD_1_Position(0,4);   //0行目の4カラム目へ移動
  LCD_1_PrCString("PsoC LCD");  //文字列出力
  LCD_1_Position(1,2);  //1行目の2カラム目へ移動
  LCD_1_PrString(str);  //上で設定した"User Module”を出力
てな具合にするだけで



という表示が行える。今までのワンチップマイコンで「液晶に文字が出た!」と喜んでいたのは一体なんだったのかな?と思う位のお手軽さである。これを行う為の下位のプログラムはブラックボックスではなく、「ソースコード」として生成されるので、中で何をやっているのかを知りたければ読むこともできるし、必要とあらば修正してしまうこともできなくはない。


 というわけで、PSoCの開発は基本的にこのツールで行うのが一番楽でいい。PSoC Designer自体はCypressのWebから無料でダウンロードできるけども、こちらの開発言語はアセンブラのみ。実はCコンパイラも含まれているのだけども、ライセンスキーが無いと解除されず、宝の持ち腐れ状態になっている。この解除キー、別途2万円弱で買うのが正規ルートだけども、セミナーやなんやで無償の「お試しキー」がもらえたりするので、そちらも要チェック。
お試しキーはサイズ制限などはないけども、PSoC Designerのバージョンアップに伴って使えなくなる可能性もあるだろうなというのが、有識者の見解だそうだ。

ユーザモジュール
じゃあ、いったいユーザモジュールってどんな物が用意されているんだよ!ということになるのでそれを軽く整理したのが下の表。実はこの表もすでに古い。というのは、ユーザモジュールはサービスパックだの何だので次々に追加されているため。とにかく盛りだくさんなので、ここでは説明しきれない。興味があれば、PSoC Designerをインストールした先に入ってるドキュメントを参照のこと。英文なのがちょっと辛いけどね。

PSoC Designerで用意されているユーザモジュール
分類 種別 仕様
A/Dコンバータ インクリメンタル型 12ビット
14ビット
7〜13ビット可変
ΔΣ型 8ビット
11ビット
2入力インクリメンタル型 7〜13ビット可変
SAR(逐次比較)型 6ビット
3入力インクリメンタル型 7〜13ビット可変
アンプ 反転増幅 -47.0倍まで18段階に設定可
コンパレータ 比較電圧はプログラマブル
インスツルメンテーションアンプ 差動入力型増幅器
PGA(プログラマブルゲインアンプ) 非反転型+48.0倍まで32段階に可変
Analog Comm DTMFダイヤラ DTMF信号(電話のピッポッパのあの音)を出力
カウンタ バイナリカウンタ 8/16/24/32ビット
D/Aコンバータ 単純出力 6/8/9ビット
(2の補数)
極性/レンジ切替 6/8ビット
DigitalComm CRC16 16ビットCRCジェネレータ
I2CHW(内蔵コントローラ制御) マスタ/スレーブとも可
max400kbps
I2Cマスタ(ソフト制御) max100kbps
IrDA 送信/受信
非同期シリアル 送信/受信/送受信(全二重)
SPI SPIマスタ/スレーブ
フィルタ バンドパスフィルタ 2-pole/4-pole
(パラメータ算出用Excelワークシートあり)
ローパスフィルタ 2-pole
(パラメータ算出用Excelワークシートあり)
Generic スイッチドキャパシタ スイッチドキャパシタ型のアナログPSoCブロックそのもの
Misc Digital デジタルインバータ デジタル信号反転
E2PROM 内蔵フラッシュを使ったEEPROMエミュレーション
LCDコントローラ 日立HD44780A準拠(秋月液晶もこのタイプ)の液晶コントロール
マルチプレクサ アナログ入力マルチプレクサ 4入力1出力
出力はCTブロック(非スイッチドキャパシタ型のアナログPSoCブロック)と接続
基準電圧マルチプレクサ アナログ動作の基準電圧セレクタ
PWM 単出力PWM 8/16ビット
2相デッドバンドPWM 8/16ビット
PRS 疑似乱数生成 2〜8/16/24/32ビット疑似乱数
温度計 PSoC内蔵の温度計 ー40℃〜+85℃:8ビット出力
タイマ バイナリ型 8/16/24/32ビット

とりあえず次!とにかくいじってみよう
なんだか分かったようなわからないような感じがしているんじゃないかと思うけど、こういうものはいじってみないとなかなか分からないのが普通だから心配することはない。
とりあえず、動画でも出したようなごく簡単な例題を元にPSoC Designerの使い方を説明するのでそちらを眺めればもう少し「感じ」がつかめるだろうと思う(全然わかんねぇ!と言う方にはごめんなさいである)