トップページへ

PSoCで遊ぶぞ!

突然の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 を搭載した実験用基板を作りました.あとから部品を追加できるスペースを 充分とって...のつもりが,何かもういっぱいですねえ(笑).

実験用基板の写真です.上から5Vの外部電源をつなぐこともできますし, USBの方から5Vをもらうこともできます. たかが実験用にコネクタ変換基板なんぞおごっちゃって,と,お怒りごもっとも.すいません,なにせ 初心者なんで,いろいろ経験してみたくて無駄ばかりしています.
中央下にあるLEDに線をつないで,まずはPSoCチュートリアルの 実行から.右にLCDディスプレイが見えますがとりあえず置いてあるだけでまた結線してません.

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円.

その裏面.

Invention Board Clone の部分の配線図と部品配置図です.部品の定数とかは回路図を見てください. Board 内の Vcc と Gnd をピンで出してしまっていますが,Vcc は,たとえば LCDディスプレイを USBの電源を借りて使いたい場合,などにほしくなります.Gnd は PSoC チップの 14 番からとれば いいので不要ですが,ま,なんとなくつけちゃってそのままです(笑).
PSoCチップへ向かう3本のISSP用の線(XRES, SCLK, SDATA) は,ジャンパーで切り離せるようにしました.

やっと LCD ディスプレイを結線したのでテスト.ちゃんと動いています. LCD ディスプレイは定番品,秋月バックライトつきです. ポート2につなぎました.めんどうなのでLED の点灯テストと同時にやっちゃってます.
さっきの写真とちょっと変わっている部分がありますが,恥ずかしいので内緒(笑). (えーん,コントラスト調整を付け忘れたんだよう...)
PICとか他のマイコンの開発環境のことは良く知らないのですが,ここまでの 手順は,ハードウェアは(自分が初心者なので)ともかく.ソフトウェアに関してはかなり簡単です. PSoC Designer というソフト,無料なのにものすごくよく出来てます.

ページの先頭へ

PSoC Designer のバージョンアップ

PSoCのファームウェア開発用ソフトウェアである PSoC Designer は,最初CD-ROMに入っていた Ver.4.0 を 使っていましたが,Cypress社のサイトで入手できるVer.4.1でも, Cコンパイラの評価版ライセンスキーが使えることを パステルマジックの掲示板 で知ったので,入れ替えてしまいました.
おそらくレジストリの設定が残っていたのか,いったんVer.4.0を アンインストールしてからVer.4.1をインストールしたにもかかわらず,Cコンパイラのライセンスキー は登録済みの状態になっていました.

ページの先頭へ

FlashTempを試す

PSoC は,チップ内部に温度計をもっていて,その値を読み出すことができます.FlashTempと呼ばれています. 外付けなしでできる実験なんておしゃれさん(笑). パステルマジックの掲示板でも盛り上がっています. わたしもぜひ参戦,ということでやってみました.

ソフトウェアが動いているところ.2枚の写真はほとんど同じですが,LCDディスプレイの (0,15)の座標のところに「o」がついたり消えたりしていることにご注意ください.なんか ピカピカさせとかないと動いているかどうかわからんのですもん.え?LED使えよって? あーそーかー気がつかなかった(笑).うーん,気温は25度ぐらいのはずなんですが,13度とか 出てるぞ.
しばらくつけておいたら,16度とか20度ぐらいの指示が出ています.皆さん許せます?(笑) まあ,異常な温度上昇を監視するための簡単な仕掛けなんでしょうから,あんまり期待しても しょうがないのでしょうが...

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_Clock24_MHz (SysClk/1)
32K_SelectInternal
PLL_ModeDisable
Sleep_Timer512_Hz
VC1= SysClk/N16
VC2= VC1/N8
VC3 SourceSysClk/1
VC3 Divider1
SysClk SourceInternal 24_MHz
SysClk*2 DisableNo
Analog PowerSC On/Ref Low
Ref Mux(Vdd/2)+/-BandGap
AGndBypassDisable
Op-Amp BiasLow
A_Buff_PowerLow
SwitchModePumpOFF
Trip Voltage [LVD (SMP)]4.64V (5.00V)
LVDThrottleBackDisable
Supply Voltage5.0V
Watchdog EnableDisable

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);
}

ページの先頭へ
トップページへ