突然のPSoC(Programmable System-on-Chip)です. トランジスタ技術誌に2004年4月号から連載されている 記事「PSoCマイコンで行こう!」が面白そうで,また, 電子マスカットさん のところの掲示板でも 「これから遊ぶならPSoCがいいよ」とおすすめされちゃったこともあって,ええい遊んでみるぜっ, ということになったのでした.
PSoCをはじめるには,何はともあれご本尊のPSoCチップと,ファームウェアを開発してチップに書き込むための 環境が必要です.ともかく必要なものを買わなくてば.
「PSoCマイコンで行こう!」の著者の パステルマジック代表の桑野雅彦さんのサイト で,PSoCデバイス CY8C27443(@500円)と,PSoCインベンションセット2(@3,000円)を購入しました. PSoCインベンションセット2とは,PSoCの開発用ソフトウェアと,PSoC Invention Boardを 作るために必要な USB通信チップであるCY7C64013(SOP版,専用カスタマイズ済)のセットです.
PSoC Invention Board とは,PSoC を開発した米国 Cypress 社が開催したPSoCの開発コンテストの参加者用に 開発されたもので,PSoCチップとUSB通信チップが搭載されており,コンピュータとつないで PSoC にプログ ラムを書き込むことができます. (パステルマジックのショップのページに写真が あります.なかなかかっちょいいですね.) PSoCライターや正規の開発ツールを購入しなくても,気軽にPSoCを使って みることができるようになっています.
残念ながらコンテスト終了後は PSoC Invention Board を直接買うことができません.
ちょっと前まで,パステルマジックでミニディベロップメントキットとして手持ち分を売ってくださっていたのですが,いまは売り切れです.
そこで,実は Invention Board の回路図は公開されています
ので,CY7C64013という USB通信チップが手に入れば(ただしInvention Board 用のファームウェアが
書き込まれていないとだめですが)Invention BoardのCloneを自作することができます.
PSoC チップを抜差しできるように作れば,PSoCライターとして利用できます.
また,Invention Board にはISSP(In-System Serial Programming)用の端子がついていて,
これを基板に実装された PSoC デバイスにつなぐことで(もちろん接続のためのポイントは
用意しておかないといけませんが),ファームウェアを実装後に変更する芸当が可能になっています.
PSoC Invention Board Clone を搭載した実験用基板を作りました.あとから部品を追加できるスペースを 充分とって...のつもりが,何かもういっぱいですねえ(笑).
![]() |
USB通信チップです.販売されているのはチップのみですので,今回はサンハヤトのICB-010という基板を
買ってきて,チップを半田付けして,DIPの28ピンICサイズになるようにしました.ICソケットに挿せる
太さのピンを千石電商の2階で買ったら300円もして高かった... SOPの半田付けは今回初体験で,最初みごとに失敗しました.結局テスターで調べて,ちゃんとついてい ない端子のやりなおし.半分以上アウトでした.適当にはんだを流すのではだめで,まじめに1ピン1ピン こてをあてるやり方がよさそうです.ただし過熱には注意と.フラックスをたっぷり塗っておくと, こてをあてたピンのまわりのフラックスが蒸発してよくわかりますね(笑).接写するとフラックスぼこぼこ 状態が目立って恥ずかしい... とりあえず言い訳すると,ICB-010の場合,チップを載せると,「ランド」とかいうんでしょうか, ICピンをつけるための場所がほとんど隠れて見えなくなってしまうんで,半田がなじんでいるかどうか よくわからなくて...各方面からルーペをすすめられました.うーん,確かにいるよなあ... なになに,「100円ショップの老眼鏡もおすすめですよ」ですって?なるほど...(しかし老眼は 本当にそろそろやってきそうだ...) |
![]() |
これが PSoC チップの CY8C27443 です.ちなみに,いま秋月電子通商で売っている 26443 という PSoCチップは,
このInvention Board ではあいにくと書き込めません.チップにプログラムを書き込むための ISSP の通信
プロトコルが変更されてしまっているためです. 26443 に書ける安価なPSoC ライターはまだ知られていません(桑野さんの試作品ぐらいしかない ではないのかな)ので, 現時点(2004-07-01)で気軽にPSoCを楽しむなら,パステルマジックの商品を買うのがベストだといえます. なにしろ評価版とはいえCコンパイラのライセンスつきですからね.正規にライセンスを買うと16,000円ですから, ホビーのための出費としては覚悟がいります. [追加 2004-07-30] Invention Board を使って 26443 ライターを作ることができました.詳しくはこちら. |
![]() |
基板の裏面です.うーんばっちい... |
![]() |
Invention Board Clone の部分だけ拡大しました. 3.3V用の3端子レギュレータは東芝のTA48M003Fです.千石で1個100円. |
![]() |
その裏面. |
![]() |
やっと LCD ディスプレイを結線したのでテスト.ちゃんと動いています.
LCD ディスプレイは定番品,秋月の
バックライトつきです.
ポート2につなぎました.めんどうなのでLED の点灯テストと同時にやっちゃってます. さっきの写真とちょっと変わっている部分がありますが,恥ずかしいので内緒(笑). (えーん,コントラスト調整を付け忘れたんだよう...) PICとか他のマイコンの開発環境のことは良く知らないのですが,ここまでの 手順は,ハードウェアは(自分が初心者なので)ともかく.ソフトウェアに関してはかなり簡単です. PSoC Designer というソフト,無料なのにものすごくよく出来てます. |
PSoCのファームウェア開発用ソフトウェアである PSoC Designer は,最初CD-ROMに入っていた Ver.4.0 を
使っていましたが,Cypress社のサイトで入手できるVer.4.1でも,
Cコンパイラの評価版ライセンスキーが使えることを
パステルマジックの掲示板
で知ったので,入れ替えてしまいました.
おそらくレジストリの設定が残っていたのか,いったんVer.4.0を
アンインストールしてからVer.4.1をインストールしたにもかかわらず,Cコンパイラのライセンスキー
は登録済みの状態になっていました.
PSoC は,チップ内部に温度計をもっていて,その値を読み出すことができます.FlashTempと呼ばれています. 外付けなしでできる実験なんておしゃれさん(笑). パステルマジックの掲示板でも盛り上がっています. わたしもぜひ参戦,ということでやってみました.
![]() |
PSoC Designer の Ver.4.0 を使った場合,この写真のように,温度の指示はかなり 高め(40度以上近く)に出ます. |
2つの違いは,自動的に作られる FlashTemp_1.inc にありました. パステルマジックの掲示板で 知った情報です.温度算出のパラメタが変わっているんですね.一応バグフィックスなのかしらん. チップバージョンの違いかなあとか,26xxx系と27xxx系で変わっちゃったとかかなあとか, 妄想はたくましくできますが...
FlashTemp_1.inc Ver.2.0 (in PSoC Designer Ver.4.0 build 865) |
FlashTemp_1_iOFFSET: equ 7300h FlashTemp_1_iGAIN: equ 0350h |
FlashTemp_1.inc Ver.2.1 (in PSoC Designer Ver.4.1 build 931) |
FlashTemp_1_iOFFSET: equ 3B00h FlashTemp_1_iGAIN: equ 0375h |
グローバルリソースパラメタとCプログラムは以下のとおり.K.I.さんのサイトの「PSoCを使ってみよう」のページの書き方を見習って...
Global Resource | |
CPU_Clock | 24_MHz (SysClk/1) |
32K_Select | Internal |
PLL_Mode | Disable |
Sleep_Timer | 512_Hz |
VC1= SysClk/N | 16 |
VC2= VC1/N | 8 |
VC3 Source | SysClk/1 |
VC3 Divider | 1 |
SysClk Source | Internal 24_MHz |
SysClk*2 Disable | No |
Analog Power | SC On/Ref Low |
Ref Mux | (Vdd/2)+/-BandGap |
AGndBypass | Disable |
Op-Amp Bias | Low |
A_Buff_Power | Low |
SwitchModePump | OFF |
Trip Voltage [LVD (SMP)] | 4.64V (5.00V) |
LVDThrottleBack | Disable |
Supply Voltage | 5.0V |
Watchdog Enable | Disable |
C語プログラム | |
#include <m8c.h> // part specific constants and macros #include "PSoCAPI.h" // PSoC API definitions for all User Modules // 1バイト符号つき整数を符号つき10進表記の文字列に変換する. void BytetoIntStr(int c, int keta, char *buf) { int i; buf[keta+1] = '\0'; buf[0] = (c < 0)? '-': ' '; c = (c < 0)? -c: c; for (i = keta; i > 0; i--) { buf[i] = (c > 0)? ((c % 10) + '0'): ' '; c /= 10; } } const char celciusstr[3] = {(char)0xdf, 'C', '\0' }; // 「℃」 #define SMPLSTPHLF 128 // LCD画面右上隅の「o」の点滅のタイミングを決める. #define SMPLSTP (SMPLSTPHLF*2) // 温度表示更新のタイミングを決める. void main() { char cTemp; // 温度(観測値) int count; // 観測回数 long sumcT; // 観測値の和 char rTemp; // 温度(平均値) char intstr[5]; // 温度の10進表記文字列 // FlashTemp の実装は,定期的に割り込みをかけて,計測値を // 読み出しているようです.故に次の1文が必要. M8C_EnableGInt; // LCD ディスプレイ表示の初期設定. LCD_1_Start(); LCD_1_Position(0,0); LCD_1_PrCString("PSoC LCD"); LCD_1_Position(1,0); LCD_1_PrCString("FlashTemp"); LCD_1_Position(1,14); LCD_1_PrCString(celciusstr); FlashTemp_1_Start(); // 温度計測スタート. count = 0; sumcT = 0; do { if (FlashTemp_1_fIsData()) { // 温度データが準備できました. cTemp = FlashTemp_1_cGetData(); // 温度データを読み出します.ここでFlashTempは停止(仕様). sumcT += cTemp; // 温度値を積算します. if (++count == SMPLSTP) { // SMPLSTP 回ごとに平均をとって結果を表示します. rTemp = sumcT / count; // 平均値を計算します. LCD_1_Position(0,15); LCD_1_PrCString("o"); // 画面右上隅に「o」を表示. LCD_1_Position(0,12); LCD_1_PrHexByte(rTemp); // 温度を16進数でも表示. BytetoIntStr(rTemp, 3, intstr); // 10進表記を求めて... LCD_1_Position(1,10); LCD_1_PrString(intstr); // 10進数で温度を表示. count = 0; sumcT = 0; } else if (count == SMPLSTPHLF) { LCD_1_Position(0,15); LCD_1_PrCString(" "); // 画面右上隅の「o」を消す.これで点滅. } FlashTemp_1_Start(); // また温度計測を始めます. } } while (TRUE); } |