試しになんか作ってみる:LEDと光センサ†使うモジュールを配置する†↓プロジェクトの作成がすむと、こんな感じの画面になると思います。これは、PSoCの周辺I/Oデバイスを設定するDevice Editorの画面です。 今回は、次のような機能を持つものを作ってみることにします。
明るさセンサから明るさを読み取るにはA/Dコンバータを使います。またLEDの明るさを変えるには、PWM (Pulse Width Modulation)というモジュールを使います。これは、パルスの1周期のうちでON(1)の時間を変えることで、近似的にLEDの明るさを変える、というものです。(ONの時間の比率が高いほど、明るく光る) まずは、今回使う、A/DコンバータとPWMを、使えるように選んでおきましょう。 ↓右下の「User Modules」の中に、左端に、使えるモジュールが並んでいます。 ↓そうすると、中央上側の枠の中に、PWM8モジュールが、PWM8_1という名前がついて現れます。 ↓同じように、ADCsの中のADC8を選んでおきましょう。名前はADC8_1となります。 *モジュールの色に意味はありませんので、色が違っても気にしないでください。 使うモジュールを配線する†これで、使いたいモジュールを選び終わったので、こいつらを、実際に使えるように配置をします。さきほどユーザーモジュールをダブルクリックした時点で、配置可能な場所の中から適当なところに、すでに配置が済んでいます。が、場合によっては、配置する場所を変える必要があることもあります。今回は、ちょっと事情により、ADC8_1の配置する場所を変えます。 ↓下の方にあるADC8_1の四角をドラッグして、右側の列に移動させます。 ↓同じように、PWM8_1も配置しておきます。このPWM8_1は、どこでもかまいません。 ちなみにこの画面では、次のようにして画面を拡大したり移動したりできます。
次は、ADC8_1とPWM_1を、PSoCの外につながるピンに接続します。さきほどの表を見ると、明るさセンサはP0.6に、青LEDはP1.2につながっていることがわかるので、これにあわせましょう。 まずADC_8の入力をP0.6につなぐため、次の2段階をふみます。 ↓AnalogColumnInputSelect_1がP0.4になっているので、それを選びます。 ↓出てくるメニューからPort0_6を選ぶと、こうなります。 ↓次に、ADC8_1のADC Inputと書いてあるところをクリックすると、ADC8_1の入力をどこにつなぐかを選ぶメニューが出てきます。 ↓このメニューから、AnalogColumn InputSelect_1(さっき、Port0_6を選んだやつ)を選ぶと、そこにつながります。配線を追いかけて、Port0_6につながっていることを確認しておきましょう。 次に、PWM8_1の出力を、青LEDがつながっているP1.2につなぎます。 ↓左下のほうにある「Pinout」の中にある、Port_1_2をクリックすると、そのピンの属性を設定することができます。ここでは、その中の"Select"をGlobalOutOdd_2を選びます。ref(pd19n.png,,30%) ↓このGlobalOutOdd_2というのは、右の方に縦に並んでいる配線のうちの1本で、こんなかんじでPort_1_2が接続されます。(上に書いてあるGOOというのが、GlobalOutOddの略) ↓次に、PWM8_1の下に並んでいる横線(Row_0_Ouptut_2)と、さきほどの縦線(GlobalOutOdd_2)をつなぐことにします。 ↓Row_0_Output_2の右端についている四角をクリックすると、こんな画面が現れます。このうち、GlobalOutOdd_2につながっている三角を選ぶと、その三角(バッファ)を使うかを選ぶメニューが現れるので、GlobalOutOdd_2を選びます。(デフォルトでは、このバッファはOffになっているので、結果としてRow_0_Output_2とGlobalOutOdd_2はつながっていない) ↓Row_0_Ouptut_2とGlobalOutOdd_2がつながりました。 ↓最後に、PWM8_1の出力(CompareOut)を、横線(Row_0_output_2)につないでおきます。PWM8_1のCompareOutをクリックすると、その出力をどこにつなぐかを選ぶメニューが出てくるので、Row_0_Ouptut_2を選んでおきます。 ↓PWM8_1のCompareOut出力が、Row_0_Output_2につながりました。 ↓だいぶまわりくどかったですが、結果として、PWM8_1のCompareOut出力が、青LEDがつながっているPort1_2につながっていることを確認しておきましょう。 使うモジュールを設定する†配置したPWM8_1とADC8_1に必要な設定をしておきます。まず、クロック周りの設定をします。 ↓左上の方に、PSoC全体に関係する設定をする箇所があります。この中のVC1=SysClk/N のところを16にしておきます。 PSoCの内蔵クロック(24MHz)を何分の1かに分周してVC1という名前のクロック信号として使うのですが、この分周比を16とすることで、VC1は24MHz/16=1.5MHzのクロック信号となることになります。 続いて、PWM8_1の設定を行います。主な設定項目は、
PWM8_1を上の枠の中で選ぶと、PWM8_1のパラメータの設定画面が左端中央に出てきます。とりあえず↓このように設定しておきます。 この例では、PWM8_1で使うクロック信号がVC1(さきほど1.5MHzに設定しました)、周期が255カウント、となっています。PWM8_1から出てくるパルスの周波数は、クロック信号をこの周期分カウントするのにかかる時間がそのパルスの周期なので、1.5MHz/256=5.9kHzとなります。 [けっこうはまることが多いので注意]ちなみにここにClockSyncという項目があります。これは、モジュールに与えられるクロック(ここではVC1)を、システムクロック(SYSCLK=24MHz)に同期させるかどうか、という選択です。無難なのは、Unsynchronized(同期させない)、あるいはSync to SYSCLK(SYSCLK=24MHzに同期)です。デフォルトのUse SYSCLK Directだと、せっかくClock源をVC1にしていても、文字通りSYSCLKが使われてしまい、PWM8_1は24MHzのクロックで動いてしまうので、注意。(デフォルトがこのDirectというのは、いかがなものか、と個人的には思いますが、しょうがない) 続いて、ADC8_1の設定をしましょう。 といいつつ、ADC8_1は、けっこう複雑なので、そのデータシートに目を通しておきましょう。メニューバーの中に、モジュールのデータシートを見るボタン(↓の右端)があるので、ADC8を選んで押してみましょう。 だーっと読んでみると、与えるべきクロック周波数が書かれている箇所があります↓ ADC8には、0.24MHz〜2.4MHzのクロックを与える必要があることがわかります。今の場合は、さきほどのVC1が1.5MHzでしたから、さしあたって、このVC1を与えればよさそうです。 ↓これらをふまえて、ADC8_1の設定を以下のようにしておきましょう。 これで、使うモジュール(PWM8_1とADC8_1)の設定がおわりました。 ・・・長かったですね。 プログラムを書く†↓右上の方の「Workspace Explorer」の中にある、Source Filesの中のmain.cが、プログラム本体です。 ↓そのmain.cをダブルクリックすると、プログラムを書くべきmain.cが現れます。 さて、いよいよプログラムを書くわけですが、今回はメインでやることは非常に単純で、
↓というわけで、こんなプログラムになります。 ADC10を使っている方はこちら 最初のほうのPWM8_1_Start()は、PWM8_1モジュールを使い始める関数、その次のM8C_EnableGInt〜ADC8_1_StartADC()までは、ADC8_1モジュールを使い始めるまでのおまじない、です(実はADC8_1のデータシートに載っているサンプルのまんま) メインのwhileループは、次のとおりです
ちなみにPWM8_1_WritePuseWidthなどの関数は、PWM8のデータシートに載っています。各データシートのサンプルコード(Sample Code)が参考になりそうですね。 プログラムを書き終わったら、Build → Buildでコンパイルします。 ↑無事コンパイルがおわったら、めでたしめでたし。エラーが出た場合は、そのエラーメッセージを参考に、デバッグしましょう。 書き込み†いよいよ、作成したプログラムをPSoC First Touchの小基板のPSoCに書き込んで動作させてみましょう。 PSoC First Touchの2つの部分をドッキングした状態で、PCのUSBポートに接続すると、ドライバをインストールする画面が現れるので、自動的にインストール、を選べば、あとは自動でドライバが入るはずなので、終わるまで待ちます。 Designer経由で書き込むときと、Programmerというソフトを起動して書き込む2種類があります。通常はDesigner経由で書き込む方法が楽でしょう。 ソフトのバージョンが古いと、Designer経由で書き込もうと思っても、programmerが起動するようです。 Designer経由で書き込むとき†↓PSoC DesignerのProgram → Program partを選ぶと、Program Portという画面が出てきます。 この段階ですでに、書き込み先のPSoC、書き込むプログラムが選択されているので、右下の矢印をクリックすれば書き込みが始まります。 もし動かなかったら、一度USBポートから抜いてみて、さしなおしてみてください。 programmer経由で書き込むとき†スタートメニューから、PSoC Programmerを起動してください。 ↓左上の方のPortから、使う書き込み機を選びます。 ↓無事選ばれました。ついでに、書き込み対象のPSoCであるCY8C21434を選ぶため、Device Familyは21x34を、DeviceはCY8C21434を選んでおきます。 ↓作成したプログラムをコンパイルした結果を開くため、File Loadを押すと、書き込みするファイルを選ぶ画面が現れるので、いま作ったプログラムのプロジェクトのディレクトリ(フォルダ)の下のフォルダoutputの中にある、*.hex(この場合はled_test.hex)を選んでおきます。 ↓Programを押せば、プログラムの書き込みがはじまるので、少し待ちます。(10秒くらい?) ↓書き込みが終わるとき、なぜかChecksum Failedと出るようですが、ちゃんと書き込みができているようなので、気にしないことにします。 書き込みが終わると、すぐにプログラムの動作は始まっています。どんな感じでしょう? 例題1†
|