使い方のコツは、ずばり、「データシートを読め」です。
http://www.cypress.com/portal/server.pt
最初に一歩は、桑野雅彦 著 "はじめての PSoC
マイコン" です。
基本的な開発方法
いくつか作ってみてわかったことは、基本的な使い方は、PSoC
Designer のデータシート表示機能やサイプレスセミコンダクターのサイトで資料を調べるべきであるということです。各モジュールについてはデータシートがあり、これに各モジュールの機能、設定項目の説明、関数の説明、簡単な例が掲載されています。ホームページでの検索の方法は、さほど難しいわけではなく、ホームページ右上の
Search 欄にモジュール名を入力して Enter するだけです。14ビットADコンバーターならば、ADCINC14
と入力すれば、検索結果でほぼトップでデータシートが表示されます。当然、英語だったりするわけで、せかされている開発だと、なかなかうっとおしい気分にさせられますが、あるだけましと考えましょう。
2006年8月、PSoC ライターと C
コンパイラのセットが秋月電子通商にあるのを発見してしまいました。調べてみると、これがもはやワンチップマイコンとは呼べないような想像を絶する
IC でした。(かなり、大げさですね。) 簡単に説明すると、ワンチップマイコンにいろいろな機能に変化できるデジタルとアナログのモジュールを複数個搭載し、それらの配置もかなり自由に換えられるという
IC
です。周波数フィルターも、パソコン上でマウスのクリックとキーボードからの数値入力だけで設計製作できてしまいます。はっきり言って、小生のような生半可なアナログ電子回路技術者は職が無くなる危険性すら感じる
IC です。
まあ、そんなわけで自らの保身のため、いや、好奇心を満たすため使ってみることにしました。
"はじめての PSoC マイコン" に出ている 最初の例題の動画 です。秋月で販売しているキットに付属する
MiniEval とは LED
のピン番号が異なるのでそこだけ変更しました。内部クロックを分周して、2個の
PWM
モジュレータで点滅させるという純然たるハードウエアによる構成です。
ライセンスについて
秋月電子通商で販売している PSoC C
コンパイラには暗証番号が書かれています。これを Cypress
にサイトからのアクセス、電子メールあるいは郵便で送ることで、ライセンスコードを入手することができます。そのライセンスコードを
PSoC Designer へ入力すれば C 言語が使用可能になります。ただ単に
PSoC のハードウエア機能だけをプログラミングするだけならば、C
言語は必ずしも必要ではありません。アセンブラで使用する方法については
PSoC
ライターに入っている小冊子に説明されています。マクロアセンブラですので、_main
に関数を記述し、ループさせるだけです。
ライセンスの申し込みは、多少問題があるようです。最初、サイトから申し込みましたが、一週間経ってもライセンスが送られて来ませんでした。仕方が無く、英文でメールを書いて送ったら、数時間後にライセンスが来ました。最初から、電子メールで送った方がよいかもしれません。
PSoC Designer 4.3 のインストール
WindowsXPにインストールするとWIndowsロゴテストにパスしていないからインストールしないようにと、かなり怖い内容の警告が出ます。また、MiniProg
を差し込んで USB
ドライバーがインストールされる場合も同様な警告がでます。無視して差し支えないようです。Windows2000
では、このような警告は出ませんでした。
PSoC Designer の warning
"はじめての PSoC マイコン"
の最初の課題を入れてビルドすると下記のような警告が出ます。
!W warning: area 'pwmled_RAM' not defined in startup file './obj/boot.o'
and
does not have an link time address.
おそらく、RAM
を初期化していないとか、記述がないとかそんな意味だと思います。いずれにしても、この状態でプログラミングしても、動作しましたので問題ないように思います。
C言語について
C Language Compiler User Guide など一通りのマニュアルが、付属のCDあるいはサイトから入手可能です。しかし、あまり親切な内容ではありません。このユーザーガイドの冒頭には、カーニハンのCプログラミング言語を読めと書いてあります。関数の説明もあっさりとしたものです。C言語の構造がわかっていて、ヘッダーファイルから必要な関数名と使用方法を読み取れるぐらいのスキルが必要です。PIC
マイコンのように数多くの日本語解説書と丁寧なC言語マニュアルが入手できる環境とはかなり違います。
ハードウエア領域へのアクセス
”はじめての〜”本(参考文献1)には、あまり詳しい記述が掲載されていませんが、ソースを読んでいると何となく察しがつきます。関数が用意されており、その関数名、引数、戻り値は、ヘッダーファイルに書いてあります。たとえば、上記の例で
PWM16_1 のレジスタにアクセスする関数は、pwm16_1.h
の中に定義されており、下記のようになっています。
//-------------------------------------------------
// Prototypes of the PWM16_1 API.
//-------------------------------------------------
extern void PWM16_1_EnableInt(void); // Proxy Class 1
extern void PWM16_1_DisableInt(void); // Proxy Class 1
extern void PWM16_1_Start(void); // Proxy Class 1
extern void PWM16_1_Stop(void); // Proxy Class 1
extern WORD PWM16_1_wReadCounter(void); // Proxy Class 2
extern void PWM16_1_WritePeriod(WORD wPeriod); // Proxy Class 1
extern WORD PWM16_1_wReadPulseWidth(void); // Proxy Class 1
extern void PWM16_1_WritePulseWidth(WORD wPulseWidth);// Proxy Class 1
何となく察しがつきますが、機能は上から、割り込み許可、割り込み禁止、スタート、ストップ、カウンター値の読み出し、周期の設定、パルス幅の読み出し?、パルス幅の書き込み でしょうか。試しに、下記のようなプログラムを書くと、周期的にパルス幅が変化する動作になります。
void main()
{
unsigned int a;
// Insert your main routine code here.
PWM16_1_Start();
PWM16_2_Start();
while(1){
PWM16_1_WritePulseWidth(500);
PWM16_2_WritePulseWidth(8000);
for(a=0;a<65000;a++);
PWM16_1_WritePulseWidth(8000);
PWM16_2_WritePulseWidth(500);
for(a=0;a<65000;a++);
}
}
点滅のタイミングをそろえようとすれば、こういう書き方になるのでしょうか。
void main()
{
unsigned int a;
// Insert your main routine code here.
PWM16_1_Start();
PWM16_2_Start();
while(1){
PWM16_1_Stop();
PWM16_2_Stop();
PWM16_1_WritePulseWidth(500);
PWM16_2_WritePulseWidth(8000);
PWM16_1_Start();
PWM16_2_Start();
for(a=0;a<65000;a++);
PWM16_1_Stop();
PWM16_2_Stop();
PWM16_1_WritePulseWidth(8000);
PWM16_2_WritePulseWidth(500);
PWM16_1_Start();
PWM16_2_Start();
for(a=0;a<65000;a++);
}
}
アナログ電圧を入力して、PWM で出力する。
デジタルでアナログ信号を伝送したい場合など、RS232Cなどのシリアルに変換するという方法が考えられますが、PWM
で簡便に行うこともよくあります。PSoC は、14bitAD、16bit分解能の PWM
モジュールがあるので、入力を4回加算して、擬似的な 16bit
データ出力にしてみました。実は、これはCプログラムより、ハードウエア側のモジュール設定が肝心で、こちらをよくよく調べながら設定しないと、速度が遅かったり、出力が出なかったりします。16bit
PWM は、クロックを6万5千回数えて1パルスを出力するので、元のクロックに比べ周波数が、約5桁ダウンします。数
MHz のクロックを入れても数十 Hz にしかならないのです。簡単なLPFで電圧を復元しようとすると、セットリングタイムが非常に長いものになります。です。この点については、PWM周波数を速く見せかける方法が、アプリケーションノートに記述されています。
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
void main(void)
{
int dat, n;
M8C_EnableGInt;
ADCINC14_1_Start(ADCINC14_1_HIGHPOWER);
PWM16_1_Start();
TX8_1_Start(TX8_1_PARITY_NONE);
ADCINC14_1_GetSamples(0);
while(1){
dat =0;
for(n=0;n<4;n++){
while(ADCINC14_1_fIsDataAvailable() == 0);
dat = dat + ADCINC14_1_iGetData();
ADCINC14_1_ClearFlag();
}
//for_end
PWM16_1_WritePulseWidth(dat);
} //while_end
}
参考書
以前、トランジスタ技術などで特集が組まれていたようですが、一般に入手できる参考書は、下記の2冊だけのようです。
1. 桑野雅彦 著 "はじめての PSoC マイコン" CQ出版社 2200円+税
一通りの紹介と例題が数点といった感じです。最初のチュートリアルとしては内容はこんなものではないでしょうか。PSoCを製造している
Cypress
社から出ているリファレンスマニュアルを斜め読みした限りでは、機能、設定も膨大でこのぐらいのページ数ではこのぐらいしか書けないのかなという印象を受けます。各モジュールの設定などの詳細な説明はほとんどないです。PSoC
Designer を起動して、添付 CD
の設定例を参考にする、という使い方がぴったりかなと思います。
2. Robert Ashby "Designer's Guide To The Cypress Psoc" Newnes(Elsevier) \6,700ぐらい
構成が上記の本とは全く異なります。PSoCそのものの説明が詳しく各モジュールや各設定についての説明もあります。上記が用例集であるとすれば、こちらはマニュアル本というところでしょうか。アセンブラの記述が多く、C
ではピンと来ないところもあります。この本では、Dynamic Reconfigration
について、Multiple Configrations
という題目で一章を使って説明しています。Dynamic Reconfigration
については、PSoC Designer IDE User Guide の6章に10ページほどの記述があります。