Knowledge
   

MiniEval1でLED点灯

$10で手に入れた評価キット続編です。この評価ボードだけで何かできないかな〜と思い、 LEDを点灯させるサンプルプログラムを作ってみました。


2005/10/07

PSoCのMiniEval1でLED点灯

GPIOのお勉強
というわけで、仕事も何気にヘヴィだったりするので、だらだら〜っと休息期間を取っているわけですが、 ぼちぼちっとPSoCを触り始めています。まずは、GPIOを使ってみようと思います。 「GPIOってなんぞや?」なんて思ったんですが、要は「汎用入出力」のことのようです。 MiniEval1には、スイッチとLEDが実装されていますので、「スイッチを押すとLEDが点灯する」という、 単純なプログラムを組んでみようと思います。

PSoCのI/Oポート
I/Oポートには、High Z、High Z Analog、Open Drain High、Open DrainLow、Pull Up、Pull Down、Strong、Strong Slowの 8つのモードがあります。「初めてのPSoC」に解説が書いてありましたが、まだまだ勉強不足。 とりあえずLEDを点灯させるためには「StrongでOK」と理解しました。また、スイッチは、MiniEval1では、VCCにぶら下がっていますので (+5Vにつながっている)、PSoC内で処理をするためには、Pull Downとすればよさそうです。

プロジェクト作って、ごごごっと行ってみよう!
SCREEN SHOT
クリックで拡大します。
というわけで、まずは「PSoC Designer」を起動します。そうすると、「Start」というダイアログが表示されまして、 新プロジェクトを作ったり、今まで作ったプロジェクトを読み込むことができます。ここでは迷わず「Start new project」をクリックします。
SCREEN SHOT
クリックで拡大します。
プロジェクト名は、「LEDSW」としました。「LEDをSWで点灯させるから」です。もっと長い名前でも大丈夫です。
SCREEN SHOT
クリックで拡大します。
今回は、「CY8C27443-24PXI」を使っていますので、以下の画面のように設定します。チップを切り替えるには、 ダイアログ左にある「View Catalog」をクリックして選択メニューを開き、そこから選択します。 また、せっかく「Cコンパイラ」が使えるので、「Generate 'Main' file using:」は、「C」を選択します。 なんで、「CY8C27443-24PXI」を使っているかというと、なんとなく、モジュール規模が少ない方が最初は理解しやすいかな〜と思ったので、 こっちにしました。ちなみに、「CY8C29...」になると、デジタルブロック数やROMが倍だそうです。
SCREEN SHOT
クリックで拡大します。
というわけで、「Device Editor」の「Selection(モジュール選択画面)」が開きました。
SCREEN SHOT
クリックで拡大します。
今回のプログラムでは、モジュールを使わないので、そのままさくさくっと結線作業を行います。 普通は、モジュールを追加しますので、ここで、A/Dコンバータ等を追加して、それから結線作業となるのですが、 今回、I/Oをちょっといじるだけのプログラムですので、モジュールは使いません。 メニューから「Interconnect」を選択する事によって、画面を移動します。

I/Oの設定
SCREEN SHOT
クリックで拡大します。
これが「Interconnect」の画面です。「モジュールが無いのに、結線がいるの?」と思われるのかもしれませんが、実は、 この画面からI/Oの設定をします。
先に説明したとおり、各I/Oポートはモードを持っており、入力/出力を切り替えたり、プルアップ、プルダウンの設定をすることができます。
SCREEN SHOT
クリックで拡大します。
「Interconnect」画面の左下の方にあるのが、I/O設定のための画面です。まずはスイッチの設定から行きます。
スイッチは、P1[4]に接続されていますので、Port_1_4の「Drive」の列をクリックすると、モードを選択できるようになります。 8つのモードが表示されますが、この中から「Pull Down」を選択します。これで、後でコードを生成した時に、 このための初期化コードが生成されます。
SCREEN SHOT
クリックで拡大します。
これでOKです。
SCREEN SHOT
クリックで拡大します。
引き続き、LEDの方も設定します。LEDは、P2[0]〜[3]につながっていますので、どれでもいいんですが、ここでは、 P2[0]を使います。同じように選択し、「Strong」を選択します。これ、要は普通の出力みたいです。
SCREEN SHOT
クリックで拡大します。
さてっと、ソースコードを生成します。ここまで、なんだかリッチな画面でいろいろ編集してきましたが、 実は、これ、自動生成されるソースコードのための設定作業です。例えば、「ポートをプルダウン」という設定をしましたが、 これも「そのための初期化コードを生成」するためのものです。
では、「Generate Application」します。
SCREEN SHOT
クリックで拡大します。
お、なにやら完了した模様。

コーディング
SCREEN SHOT
クリックで拡大します。
ちょこっとですが、コーディングします。先に説明したとおり、初期化コードなどは既に「Generate Application」で生成されていますので、 後は、本体を書くだけです。マイコンプログラミングをやっていると、まず最初に「モジュール初期化のコードをどう書くか?」というところで、 マイコンのハードウェアマニュアルとにらめっこになるのですが、PSoC Designerを使っている場合は、この苦労が少なくてすみそうです。
それでは、「Application Editor」へ行きます。
SCREEN SHOT
クリックで拡大します。
これが「Application Editor」です。よくある統合環境の画面ですね〜。
SCREEN SHOT
クリックで拡大します。
ソースファイルを開きます。開くには、左のツリーから選択します。他にもいろいろソースコードが入っており、 覗いて見るとおもしろいかもしれません。自動生成されたコードも入っています。また、モジュールを追加した場合、 それ関係のソースコードも入ります。
SCREEN SHOT
クリックで拡大します。
それでは、「SWの情報を、LEDへ出力する」というプログラムを書きます。
I/Oポートへアクセスするためには、「PRTxDR」という変数を介してアクセスをします。こうやって使うと、 普通のマイコンと同じ感じです。例えばPORT1ならば「PRT1DR」で、それぞれのビットが、各ピンの状態に対応しています。 今回の場合、P1[4]に接続されているSWの状態を読み取るので、二進数で00010000b、つまり16進数で10hです。 また、LEDは、P2[0]ですので、二進数で00000001b、16進数で01hのデータにて、操作すればOKです。
というわけで、コードはこうなります。
while( 1 ){
  if(( PRT1DR&0x10 ) != 0 ){ // P1[4](SW) Input Check
    PRT2DR |= 0x01;          // P2[0]=H LED ON
  }
  else{
    PRT2DR &= ~0x01;         // P2[0]=L LED OFF
  }
}
エディタ上で日本語を入力すると、文字化けする事に気づいてしまいました…。うちの環境だけかな〜。
SCREEN SHOT
クリックで拡大します。
それではビルドします。
SCREEN SHOT
クリックで拡大します。
無事、ビルド完了したようです。

PSoCへの書き込み
SCREEN SHOT
クリックで拡大します。
というわけで、パソコンにUSBケーブルで、MiniEval1、CY3210-MiniProgを接続します。もちろん、もっと前から接続していても構いません。 そして、「PSoC Designer」の「Program Part」のアイコンをクリックします。実行されるのは「PSoC Programmer」ですので、 Windowsメニューの方から起動しても言いのですが、「PSoC Designer」から起動すると、プロジェクトの情報が引き継がれるので便利です。
SCREEN SHOT
クリックで拡大します。
じゃん、「PSoC Programmer」です。起動すると、いきなりPSoCと接続されます。
SCREEN SHOT
クリックで拡大します。
「Program」ボタンを押すと…。
SCREEN SHOT
クリックで拡大します。
ごごごっとプログラムが転送されます。「成功!」と出てますので、大丈夫です。
なぜか「PSoC Programmer」の動作ログ表示は、新しい方が上です(「PSoC Designer」では、新しい方が下)。

プログラムの実行
SCREEN SHOT
クリックで拡大します。
それでは、動作させてみます。「PSoC Programmer」から電源ON!します。これは便利です。CY3210-MiniProgからMiniEval1に電源が供給され、 そのままプログラムを走らせる事ができます。
注意は、「このチェックボックスの表示にはウソがある」ことです。下の方に表示されているステータスのところを見る方が正しいです。
SCREEN SHOT
クリックで点灯します。
というわけで、「スイッチを押すと、LEDが点灯する」プログラムの完成〜です。

というわけで…
というわけで、ここまで、だだだっと作って見ましたが、これを応用すると、とりあえず「デジタルコンパスの値をLEDで表示」というのは簡単にできそうです。 そのときは、入力ポートは「Pull Down」じゃなくて、別のにする必要があると思いますけど、プログラム自体は、ちょっと直すだけでOKそうです。 しばらくは、この評価ボードだけで遊んでみようと思います(とか言いながら、今、RS232CのI/F作ってたりして…)。

 


SISO-LAB Knowledge