PSoCを使ってみよう

2004/06/01 〜
K.I

Index


概要

CypressのPSoCを使ってみる。気の向いた時だけやるから、なかなか進まないかも。 これはワンチップマイコンだが、 アナログのモジュールがいろいろ載っていて組み合わせて使えるらしい。良く分かんないが、面白そうだと思っていたけど、なかなか手が出なかった。


[top]

Invention Board

PastelMagicの桑野さんが、おまけで基板を送ってくれていた。これはファームが違うみたいでInvention_Boardとしては使えない。差替えすれば動くようだが、パッケージもピン配置も全然違うし、ちょっと難しそうだ。とりあえず、これはとっておいて別に基板を作成することにする。

互換基板の作成

開発用キットのファームが焼いてある64013は、SOICとPDIPで全然ピン配置が違っている。それに配線が結構省略されていてなんか分かり難いので、PDIP用に書き直してみた。

改めて見てみると必要な配線は結構少ない。 これならブレッドボードでも十分組めそうだ。

PSoCをデザインする

部品を集めて配線も終わったので、 PastelMagicの解説を見ながら、その通りにやってみた。

プログラムする

とりあえずの感想

ファームの換装


1欲しくて探してみたけど売ってるところは少ない。Digi-Keyだと買えそうだけど手数料とか送料が高い。
2新しいことをやると大概はうまく行かないので、簡単に諦めてしまうことが多い。うまく行くと調子にのって失敗することもあるけど。。。

[top]

いろいろやってみよう

Compiler keyを入れて、Cも使えることを確認した。とりあえず PICでやってることと同じことをやってみようかな3

LCDモジュールを使ってみる

で、あっさり表示出来た。まぁ、PICで使い慣れてるということもあるけど。

温度センサモジュール

FlashTempモジュールを使ってみる。でも、ちょっといまいち。

#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules

void main()
{
        char    i;
        char    t;

        M8C_EnableGInt;                 //これは必要なのか?
        LCD_1_Start();
        LCD_1_Position(0,4);
        LCD_1_PrCString("PSoC test");
        LCD_1_Position(1,2);
        LCD_1_PrCString("FlashTemp");

        FlashTemp_1_Start();            //スタートさせる
        while (TRUE) {
          if (FlashTemp_1_fIsData()) {  //flsDataが1になるまで待つ
            t = FlashTemp_1_cGetData(); //データ取り込み
            if (!i++) {                 //表示が速過ぎるので
              LCD_1_Position(1,12);
              LCD_1_PrHexInt(t);        //256回に1回だけ表示
            }
            FlashTemp_1_Start();        //またスタートする
          }
        }
}

Parameter Value Min Max
Column Clock
(VC2)
 
24M/16/2=750k
24M/16/4=375k
24M/16/8=187.5k
125k

 
960k

 
Sample Rate 375k/255/4=368  900sps

Global Resource
CPU clock 24MHz(SysClk/1)
32K_Select Internal
PLL_Mode Diable
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
(2 BandGap) ± BandGap
AGndBypass Disable
Op-Amp Bias Low
A_Buff_Power Low
SwitchModePump OFF
Trip Voltage(LVD(SMP))4.64V(5.00V)
LVD Throttle Back Disable
Supply Voltage 5.0V
Watchdog Enable Disable

シリアル通信

と思っていましたが、 良くデータシートを見ると、Resolutionは3.3℃になってる。。。つまり、 これで良いんですねー。

ということで、貰い物ですが、とりあえずはシリアル通信も確認出来ました。

FlashTempで零下はどうなるの?

離散的な数値を返すことから、摂氏のデータを返すと一応納得したものの、零下になるとどうなるか追試してみました。

I2Cに挑戦中

SMPを使ってみたい

PSoCならPWMモジュールとTr1個でも出来そうだけど、やっぱり専用の端子があって簡単に出来るのは良いなぁ。


これは、 何か根本的に足りないものがありそうだ。スイッチングを確認してみよう。

クロックを遅くしてみる

クロックによる電流消費か。。。そうかもしれないなぁ。

SMPのインダクタ

SMPのインダクタは、 どれぐらいが良いのかな?PSoCの仕様では、 2.2uH,1uFでの規定があるからそれぐらいか。

SMPの配線長がこんなに効くとは思わなかった。 スイッチングの線は短い方が良いとは思うけど。。。ブレッドボードでは要注意だなぁ。

割込みしたい

とりあえず入力装置として、I/Oポートにタクトスイッチを配線する。

割込み許可

マニュアルを見ると、GPIOの割り込みは以下のようなステップでやれと書いてあるが、、

  1. GPIOの割込みモードを設定 → PRTxICx →これはデザイナで設定してる
  2. GPIOのbit毎の割込みを許可 → PRTxIE →これも設定されてるみたいだし
  3. GPIO割込みのマスクbitを設定 → INT_MSK0 = INT_MSK0_GPIO; →で良いと思うが
  4. 全体の割込みを許可 → M8C_EnableGInt;

割込みの手順は、 間違ってないんじゃないかな? やろうとしていることは、

Pull-Upはやめた

割込み設定自体は、そんなに間違ってなかったみたいだ。

Pull-Upのやり方

クリアする必要あるの?

割り込みが掛かるようになったのは良いんだけど、どうやってクリアするのか。

アセンブラで書いてみる

手詰りだ。。。仕方ない、割り込みをアセンブラで書いてみよう。

ljmpするだけでした

スリープしよう

電池駆動ならスリープは必須なので、これは試しておかないと。

なんか眠くなってきたので、 今日はここまでにしておこう。

まるで暗号

SLEEPは良くわからないので、 英文の説明を読むが余計分からなくなる。とりあえず、 関係ありそうな部分を適当にざっと意訳5したのをメモしておこう。頭の中で考えるよりはマシかも。。。(しかし、この英文はネイティブの人でもきっと分かり難いと思うなぁ。。。)

SLEEPに関する記述が、また悩ましい。

  1. このビットは登録後にブロックされ、 またSLEEPシーケンスの完了までクリアされない。これは、PowerDownの不安定な状態でSLEEPが中断されるのを防ぐ。割り込みが未決でEnable状態の時、完了するまでSLEEPしない。というか、SLEEPビットをセット出来ない。
  2. SLEEPからのWake-Upを有効にするのにGIEは必ずしも必要では無い。個々の割り込みの割り込みマスクのセットにより有効になる。もしGIEがセットされない場合は、システムはISRをサービスしない。しかしながらシステムは起きて、SLEEPしたポイントからの命令を実行するだろう。この場合、ユーザはマニュアルで未決の割り込みを取り除くか、或はGIEをセットしてシステムにISRを実行させる必要がある。もし、未決の割り込みを取り除かない場合、それは連続的に繰り返される。SLEEPビットがセットされ、スリープシーケンス実行、すぐにデバイスはスリープ状態になり未決の割り込みによりSLEEPビットはクリアされ、スリープを抜ける。
  3. Wake-Up後に、SLEEPの直後の命令が実行される。システムがスリープする前に、スリープ直後の命令を持ってくるためで、割り込みによりWake-Upした場合は、前もって持ってきた命令を実行し、その後にISRが実行される。(もしGIEがセットされない場合は、単に継続される)
  4. SLEEPビットのセットの前にGIEを無効にすれば安全。スリープの準備の際に割り込みが入ると、準備されずにSLEEPに入るかもしれない。準備の前にGIEを無効にして、準備が終ったら、GIEをセットすると良い。

RES_WDTへの書き込みは効果が無かった。しかし、この訳がある程度合ってるとすると、ちょっと変な仕様ではあるなぁ。Wake-Up後にSLEEP直後の命令が実行されるっていう処は関係あるかな?。。。。。うーん、わからん。でも眠いので寝る。

WDTでした

落ち着いて良く考えてみる。

EEPROMモジュール

データを記録するのに、PICではEEPROMを使うことが多いが、PSoCでは EEPROMを持っていない。代わりに、プログラムメモリ上にデータを保存するソフトモジュールがあるので、それを使ってみよう。

テストプログラム

現状のテストプログラム。簡単だけど7、とりあえずGPIO割り込みとEEPROMモジュール、それにスリープも使ってるので、少しは何かの参考になるかもしれない。

LCDのカーソル表示

LCDモジュールでは、カーソルは表示されないように設定されてるみたいだ。


3というか、アナログは良く分かんないので。。。
4途中で配線短くしたからなぁ。ショットキの足でそのままInventionBoardを跨いで繋いでたのが失敗かな。。。
5あくまで、いい加減な意訳です。くれぐれも信用しないように。。。
6PICだったら0x2100に書き込んどけば良いよね。そんな感じでやりたいんだけど。。。
7分かってしまえば簡単なんだけど、ここまで分かるのに結構掛かったなぁ。。。

[top]

落書き


[top]

リンク

PSoC関連のリンクです。PastelMagicのBBSに出入りされている方が多いです。


[top] [電気工作に戻る]
Bluefish Webpage by K.I

blog comments powered by Disqus