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とすればよさそうです。
プロジェクト作って、ごごごっと行ってみよう!
クリックで拡大します。
|
というわけで、まずは「PSoC Designer」を起動します。そうすると、「Start」というダイアログが表示されまして、
新プロジェクトを作ったり、今まで作ったプロジェクトを読み込むことができます。ここでは迷わず「Start new project」をクリックします。
|
クリックで拡大します。
|
プロジェクト名は、「LEDSW」としました。「LEDをSWで点灯させるから」です。もっと長い名前でも大丈夫です。
|
クリックで拡大します。
|
今回は、「CY8C27443-24PXI」を使っていますので、以下の画面のように設定します。チップを切り替えるには、
ダイアログ左にある「View Catalog」をクリックして選択メニューを開き、そこから選択します。
また、せっかく「Cコンパイラ」が使えるので、「Generate 'Main' file using:」は、「C」を選択します。
なんで、「CY8C27443-24PXI」を使っているかというと、なんとなく、モジュール規模が少ない方が最初は理解しやすいかな〜と思ったので、
こっちにしました。ちなみに、「CY8C29...」になると、デジタルブロック数やROMが倍だそうです。
|
クリックで拡大します。
|
というわけで、「Device Editor」の「Selection(モジュール選択画面)」が開きました。
|
クリックで拡大します。
|
今回のプログラムでは、モジュールを使わないので、そのままさくさくっと結線作業を行います。
普通は、モジュールを追加しますので、ここで、A/Dコンバータ等を追加して、それから結線作業となるのですが、
今回、I/Oをちょっといじるだけのプログラムですので、モジュールは使いません。
メニューから「Interconnect」を選択する事によって、画面を移動します。
|
I/Oの設定
クリックで拡大します。
|
これが「Interconnect」の画面です。「モジュールが無いのに、結線がいるの?」と思われるのかもしれませんが、実は、
この画面からI/Oの設定をします。
先に説明したとおり、各I/Oポートはモードを持っており、入力/出力を切り替えたり、プルアップ、プルダウンの設定をすることができます。
|
クリックで拡大します。
|
「Interconnect」画面の左下の方にあるのが、I/O設定のための画面です。まずはスイッチの設定から行きます。
スイッチは、P1[4]に接続されていますので、Port_1_4の「Drive」の列をクリックすると、モードを選択できるようになります。
8つのモードが表示されますが、この中から「Pull Down」を選択します。これで、後でコードを生成した時に、
このための初期化コードが生成されます。
|
クリックで拡大します。
|
これでOKです。
|
クリックで拡大します。
|
引き続き、LEDの方も設定します。LEDは、P2[0]〜[3]につながっていますので、どれでもいいんですが、ここでは、
P2[0]を使います。同じように選択し、「Strong」を選択します。これ、要は普通の出力みたいです。
|
クリックで拡大します。
|
さてっと、ソースコードを生成します。ここまで、なんだかリッチな画面でいろいろ編集してきましたが、
実は、これ、自動生成されるソースコードのための設定作業です。例えば、「ポートをプルダウン」という設定をしましたが、
これも「そのための初期化コードを生成」するためのものです。
では、「Generate Application」します。
|
クリックで拡大します。
|
お、なにやら完了した模様。
|
コーディング
クリックで拡大します。
|
ちょこっとですが、コーディングします。先に説明したとおり、初期化コードなどは既に「Generate Application」で生成されていますので、
後は、本体を書くだけです。マイコンプログラミングをやっていると、まず最初に「モジュール初期化のコードをどう書くか?」というところで、
マイコンのハードウェアマニュアルとにらめっこになるのですが、PSoC Designerを使っている場合は、この苦労が少なくてすみそうです。
それでは、「Application Editor」へ行きます。
|
クリックで拡大します。
|
これが「Application Editor」です。よくある統合環境の画面ですね〜。
|
クリックで拡大します。
|
ソースファイルを開きます。開くには、左のツリーから選択します。他にもいろいろソースコードが入っており、
覗いて見るとおもしろいかもしれません。自動生成されたコードも入っています。また、モジュールを追加した場合、
それ関係のソースコードも入ります。
|
クリックで拡大します。
|
それでは、「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
}
}
エディタ上で日本語を入力すると、文字化けする事に気づいてしまいました…。うちの環境だけかな〜。
|
クリックで拡大します。
|
それではビルドします。
|
クリックで拡大します。
|
無事、ビルド完了したようです。
|
PSoCへの書き込み
クリックで拡大します。
|
というわけで、パソコンにUSBケーブルで、MiniEval1、CY3210-MiniProgを接続します。もちろん、もっと前から接続していても構いません。
そして、「PSoC Designer」の「Program Part」のアイコンをクリックします。実行されるのは「PSoC Programmer」ですので、
Windowsメニューの方から起動しても言いのですが、「PSoC Designer」から起動すると、プロジェクトの情報が引き継がれるので便利です。
|
クリックで拡大します。
|
じゃん、「PSoC Programmer」です。起動すると、いきなりPSoCと接続されます。
|
クリックで拡大します。
|
「Program」ボタンを押すと…。
|
クリックで拡大します。
|
ごごごっとプログラムが転送されます。「成功!」と出てますので、大丈夫です。
なぜか「PSoC Programmer」の動作ログ表示は、新しい方が上です(「PSoC Designer」では、新しい方が下)。
|
プログラムの実行
クリックで拡大します。
|
それでは、動作させてみます。「PSoC Programmer」から電源ON!します。これは便利です。CY3210-MiniProgからMiniEval1に電源が供給され、
そのままプログラムを走らせる事ができます。
注意は、「このチェックボックスの表示にはウソがある」ことです。下の方に表示されているステータスのところを見る方が正しいです。
|
クリックで点灯します。
|
というわけで、「スイッチを押すと、LEDが点灯する」プログラムの完成〜です。
|
というわけで…
というわけで、ここまで、だだだっと作って見ましたが、これを応用すると、とりあえず「デジタルコンパスの値をLEDで表示」というのは簡単にできそうです。
そのときは、入力ポートは「Pull Down」じゃなくて、別のにする必要があると思いますけど、プログラム自体は、ちょっと直すだけでOKそうです。
しばらくは、この評価ボードだけで遊んでみようと思います(とか言いながら、今、RS232CのI/F作ってたりして…)。
|