Author: akita

もくじ

コメント

コメントはありません。 Comments/PSoC入門:PSoC First Touch編

お名前:

PSoCとは

語弊があるかもしれませんが、「周辺I/Oデバイスを自由に設定できるマイコン」です。PSoCの概要は、この分野の日本での第一人者(?)、桑野さんの解説が参考になるでしょう。
http://www.kumikomi.net/archives/2007/09/27ftouch.php

このPSoCを、とりあえずさわってみたいよ、という向きにおすすめなのが、PSoC First Touchです↓

package.jpg

こいつの中身は、2つ↓

ft1.jpg

書き込み機(左)と、PSoCがのった小基板(右)。PCのUSBポートに書き込み機をつなぎ、小基板上のPSoCに、自分で作ったプログラムを書き込めます。小基板には、LED、明るさセンサ、ブザーなどがついていて、PSoCからつつけます。半田付けして基板を作らなくても、とりあえず遊べるのがお手軽ですね。

ft2.jpg

書き込み時は、↑こんなふうにドッキングして使います。

ftmt.png

小基板に載っているものは、↑こんな感じ。

(技術情報)
LEDや各センサなどは、それぞれPSoCの次のようなピンにつながっています。

P0.0Thermister
P0.1&P3.1CSD feedback
P0.6Light sensor
P1.2LED(B)
P1.3LED(R)
P1.4LED(G)
P1.6Buzzer
P2.0CapSense wire
P2.1〜7CapSense slider

例えばP0.1は、ポート0の1番、のピンを表しています。

開発環境の導入

まずはPSoCで遊ぶためのコンパイラなどの開発ソフトウエアを導入しておきましょう。

以下のものを導入しておきます。

  • PSoC Designer http://www.cypress.com/?id=2522&source=header
  • PSoC Programmer http://www.cypress.com/?rID=38050&source=header
    • 最初にPSoC Programmerをインストールし、その後、PSoC Desingerを入れないといけない、という仕様のようです(101008:akita追記)
    • DesignerをインストールするとProgrammerの簡素な機能は使用できるので、高度な書き込みをしない限りDesignerのみで十分のように思います。
    • ソフトウェアのダウンロードには、Cypressのアカウントが必要です。

ついでに、PSoC First Touchの付属CDに入っているマニュアルというかドキュメント(First Touch Guide.pdf)も、必要であれば参照します。(最初はいらないかな・・・)

各ソフトウエアのインストールのうち、PSoC Programmerのインストール時には、デバイスドライバのインストール ウイザードが立ち上がりますので、とりあえず、すべて「はい」「次へ」を選んでおきます。

開発のおおまかな流れ

スタート→Cypress Microsystems→PSoC Designerで、PSoCでプログラムを書くためのアプリケーションPSoC Designerを立ち上げます。
PSoC Designerを使って、PSoCのプログラムを書くおおまかな手順は次の通りです。

  1. Device Editor画面で、使う周辺I/Oデバイスを選び、必要な設定をする
  2. プログラムを書く
  3. 書き込む
  4. 遊ぶ

この1.が、他のマイコンにはない、PSoCの特長といえます。マイコンは、一般にはタイマ、A/Dコンバータ、パルス出力、シリアル通信、などのいろいろな機能を持つ周辺I/Oデバイスが内蔵されていて、それをつかってマイコンは実世界とつながるわけですが、一般のマイコンは、この周辺I/Oデバイスの種類と数は、製品によって決まっています。つまり、A/Dコンバータが1個しかないマイコンは、いくらA/Dコンバータが2個ほしい!と思っても、どうしようもありません。ところが、PSoCは、(内部リソースが許す限り)好きな周辺I/Oデバイスを作り、それを使うことができます。例えばパルス発生回路が16個あるような、化け物のようなマイコンも、普通に作れます。

LEDを光らせる

PSoC FirstTouchには、赤・緑・青の3つのLEDが搭載されています。
まずはこれらを光らせるプロジェクトを作り、開発の方法をおおざっぱにつかみましょう。

新規プロジェクトの作成

まず、PSoC Designerを起動します。


  around
[File]→[New Project]から、新しいプロジェクトを作成するウィンドウを開きます。


  wiki_intro_02.png
プロジェクトの名前を入力します。
あとでわかりやすい名前にしましょう。


  wiki_intro_03.png
利用するPSoCの型番を入力します。
PSoC FirstTouchに搭載されているマイコンの型番は[CY8C21634-24LFXI]です。
また、開発言語を選択することができます。特に何もなければ[C]言語を選びましょう。


  wiki_intro_04.png
新しいプロジェクトが作成されました。

ハードウェアの設定

それぞれのLEDは、PSoCの信号が入出力される[ピン]と呼ばれる場所に接続されています。
該当するピンから"1"(=5[V])を出力すると、接続されているLEDが点灯します。

部品接続されているピン
赤色LEDPort_1_3
緑色LEDPort_1_4
青色LEDPort_1_2



  wiki_led_01.png
画面右下の[User Modules]ツリーから、[LED]モジュールを探してダブルクリックします。
すると、画面右上の[Workspace Explorer]ツリーに、[LED_1]という名前のモジュールが追加されました。
その[LED_1]をクリックすると、画面左の[Parameters]ウィンドウに、[LED_1]の設定項目が表示されます。


  wiki_led_02.png
たとえば、赤色LEDを点灯させたい場合は、[LED_1]の設定として[Port_1_3]を選択します。
[Drive]の項目は[Active High]を選択します。
[Active High]は、Onのとき高電圧(="1"=5[V])を出力するというオプションです。


これでハードウェアの設定は終わりです。
次はソフトウェアの設定(=プログラミング)です。

ソフトウェアの設定

  wiki_led_03.png
プログラムを記述するための画面を開きます。
右上の[Workspace Explorer]から、[main.c]を探し、ダブルクリックします。


  wiki_led_04.png
プログラムを書く画面が開きました。
メイン関数の中に、どのような動作をして欲しいかを記述します。
ここでは、以下のように記述しました。

void main(void){
  LED_1_Start();
  //LED_1モジュールを起動する
  LED_1_On();
  //LED_1をOn(点灯)にする
  while(1);
  //無限ループ
}



以上で、ソフトウェアの設定は終わりです。

書き込みファイルの生成(Generate)と書き込み

  wiki_led_05.png
ここまでで、ハードウェアとソフトウェア、両方の設定が完了しました。
マイコンに書き込むためのファイルの生成をおこないます。
この作業を[Generate]と呼びます。
コンパイルみたいなものです。
画面上から[Generate]のアイコンを探し、クリックします。
間違いがなければ[0 errors 0 warnings]と出ます。


  wiki_led_06.png
[Generate]によって書き込みファイルが生成されたら、いよいよマイコンにファイルを書き込みます。
メニューバーから、[Program]→[Program Part]をクリックします。


  wiki_led_07.png
[Program Part]ウィンドウが開いたら、矢印型の[Download]ボタンをクリックします。
無事書き込みが完了したら、LEDが光るはずです!

練習問題

複数のLEDが同時に点くには?
LEDが点滅するには?
複数のLEDが順番に点滅するには?


試しになんか作ってみる:LEDと光センサ

使うモジュールを配置する

↓プロジェクトの作成がすむと、こんな感じの画面になると思います。これは、PSoCの周辺I/Oデバイスを設定するDevice Editorの画面です。

pd06n.png

今回は、次のような機能を持つものを作ってみることにします。

  • 明るさセンサで、明るさを読み取る
  • その明るさに応じて、LED(青)の明るさを変える

明るさセンサから明るさを読み取るにはA/Dコンバータを使います。またLEDの明るさを変えるには、PWM (Pulse Width Modulation)というモジュールを使います。これは、パルスの1周期のうちでON(1)の時間を変えることで、近似的にLEDの明るさを変える、というものです。(ONの時間の比率が高いほど、明るく光る)

まずは、今回使う、A/DコンバータとPWMを、使えるように選んでおきましょう。

↓右下の「User Modules」の中に、左端に、使えるモジュールが並んでいます。
このうち、PWMsを選び、その中のPWM8をダブルクリックします。

pd07n.png

↓そうすると、中央上側の枠の中に、PWM8モジュールが、PWM8_1という名前がついて現れます。

pd08n.png

↓同じように、ADCsの中のADC8を選んでおきましょう。名前はADC8_1となります。
ソフトのバージョンによってはADC8がないかもしれません。その場合はADC10を使ってください。プログラムを少し変更しないといけませんが、基本的な設定はADC8と一緒です。

pd09n.png

*モジュールの色に意味はありませんので、色が違っても気にしないでください。

使うモジュールを配線する

これで、使いたいモジュールを選び終わったので、こいつらを、実際に使えるように配置をします。さきほどユーザーモジュールをダブルクリックした時点で、配置可能な場所の中から適当なところに、すでに配置が済んでいます。が、場合によっては、配置する場所を変える必要があることもあります。今回は、ちょっと事情により、ADC8_1の配置する場所を変えます。

↓下の方にあるADC8_1の四角をドラッグして、右側の列に移動させます。

pd13n.png

↓同じように、PWM8_1も配置しておきます。このPWM8_1は、どこでもかまいません。

pd14.png

ちなみにこの画面では、次のようにして画面を拡大したり移動したりできます。

  • Ctrl+左クリック=拡大
  • Ctrl+Shift+左クリック=縮小
  • Alt+ドラッグ=移動

次は、ADC8_1とPWM_1を、PSoCの外につながるピンに接続します。さきほどの表を見ると、明るさセンサはP0.6に、青LEDはP1.2につながっていることがわかるので、これにあわせましょう。

まずADC_8の入力をP0.6につなぐため、次の2段階をふみます。

↓AnalogColumnInputSelect_1がP0.4になっているので、それを選びます。

pd15n.png
pd15bn.png

↓出てくるメニューからPort0_6を選ぶと、こうなります。

pd16n.png

↓次に、ADC8_1のADC Inputと書いてあるところをクリックすると、ADC8_1の入力をどこにつなぐかを選ぶメニューが出てきます。

pd17n.png

↓このメニューから、AnalogColumn InputSelect_1(さっき、Port0_6を選んだやつ)を選ぶと、そこにつながります。配線を追いかけて、Port0_6につながっていることを確認しておきましょう。

pd18n.png

次に、PWM8_1の出力を、青LEDがつながっているP1.2につなぎます。

↓左下のほうにある「Pinout」の中にある、Port_1_2をクリックすると、そのピンの属性を設定することができます。ここでは、その中の"Select"をGlobalOutOdd_2を選びます。ref(pd19n.png,,30%)

↓このGlobalOutOdd_2というのは、右の方に縦に並んでいる配線のうちの1本で、こんなかんじでPort_1_2が接続されます。(上に書いてあるGOOというのが、GlobalOutOddの略)

pd20n.png

↓次に、PWM8_1の下に並んでいる横線(Row_0_Ouptut_2)と、さきほどの縦線(GlobalOutOdd_2)をつなぐことにします。

pd21n.png

↓Row_0_Output_2の右端についている四角をクリックすると、こんな画面が現れます。このうち、GlobalOutOdd_2につながっている三角を選ぶと、その三角(バッファ)を使うかを選ぶメニューが現れるので、GlobalOutOdd_2を選びます。(デフォルトでは、このバッファはOffになっているので、結果としてRow_0_Output_2とGlobalOutOdd_2はつながっていない)

pd22n.png

↓Row_0_Ouptut_2とGlobalOutOdd_2がつながりました。

pd23n.png

↓最後に、PWM8_1の出力(CompareOut)を、横線(Row_0_output_2)につないでおきます。PWM8_1のCompareOutをクリックすると、その出力をどこにつなぐかを選ぶメニューが出てくるので、Row_0_Ouptut_2を選んでおきます。

pd24n.png

↓PWM8_1のCompareOut出力が、Row_0_Output_2につながりました。

pd25n.png

↓だいぶまわりくどかったですが、結果として、PWM8_1のCompareOut出力が、青LEDがつながっているPort1_2につながっていることを確認しておきましょう。

pd26n.png

使うモジュールを設定する

配置したPWM8_1とADC8_1に必要な設定をしておきます。まず、クロック周りの設定をします。

↓左上の方に、PSoC全体に関係する設定をする箇所があります。この中のVC1=SysClk/N のところを16にしておきます。

pd27n.png

PSoCの内蔵クロック(24MHz)を何分の1かに分周してVC1という名前のクロック信号として使うのですが、この分周比を16とすることで、VC1は24MHz/16=1.5MHzのクロック信号となることになります。

続いて、PWM8_1の設定を行います。主な設定項目は、

  • 使うクロック信号
  • 周期
    です。

PWM8_1を上の枠の中で選ぶと、PWM8_1のパラメータの設定画面が左端中央に出てきます。とりあえず↓このように設定しておきます。

pd28n.png

この例では、PWM8_1で使うクロック信号がVC1(さきほど1.5MHzに設定しました)、周期が255カウント、となっています。PWM8_1から出てくるパルスの周波数は、クロック信号をこの周期分カウントするのにかかる時間がそのパルスの周期なので、1.5MHz/256=5.9kHzとなります。
つまり5.9kHzのパルスがPWM8_1(につながっているP2.1)に出てくるわけですが、そのうちのON(=LEDが点灯する)カウント数を、PulseWidthに設定します。例えばPulseWidth=127とすれば、ちょうどONとOFFの時間が同じ(デューティー比50%と呼びます)パルスが出てくることになります。LEDはこの5.9kHzで点滅することになりますが、そんなに速い点滅は見えないので、結果として、半分くらいの明るさで光っているようにみえることになります。このPulseWidthは、あとで書くプログラムで設定するので、ここではいじる必要はありません。

[けっこうはまることが多いので注意]ちなみにここに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を選んで押してみましょう。

pd30n.png

だーっと読んでみると、与えるべきクロック周波数が書かれている箇所があります↓

pd31.png

ADC8には、0.24MHz〜2.4MHzのクロックを与える必要があることがわかります。今の場合は、さきほどのVC1が1.5MHzでしたから、さしあたって、このVC1を与えればよさそうです。
同様に、データシートを読んでいくと、VC3の分周比(Divider)に関する記述がありますが、ここでは結論だけ。VC3のDividerは256とすることにします。

↓これらをふまえて、ADC8_1の設定を以下のようにしておきましょう。

pd32n.png

これで、使うモジュール(PWM8_1とADC8_1)の設定がおわりました。

・・・長かったですね。
一般にマイコンは、最初から内蔵されているモジュールが決まっているので、これらのような設定は不要ですが、PSoCはそのモジュールを自由に決められる分、いろいろと設定しないといけないところがありました。この設定の手順は、これからPSoCで何かを作るたびに行うので、徐々に慣れていけばよいでしょう。

プログラムを書く

↓右上の方の「Workspace Explorer」の中にある、Source Filesの中のmain.cが、プログラム本体です。

pd34n.png

↓そのmain.cをダブルクリックすると、プログラムを書くべきmain.cが現れます。

pd35.png

さて、いよいよプログラムを書くわけですが、今回はメインでやることは非常に単純で、

  1. 明るさセンサの値をADC8_1で読む
  2. その読んだ値を、PWM8_1のパルス幅に設定し、青LEDの明るさを変える
  3. 1.〜2.を繰り返す

↓というわけで、こんなプログラムになります。

pd36.png

ADC10を使っている方はこちら

pd36_10.png

最初のほうのPWM8_1_Start()は、PWM8_1モジュールを使い始める関数、その次のM8C_EnableGInt〜ADC8_1_StartADC()までは、ADC8_1モジュールを使い始めるまでのおまじない、です(実はADC8_1のデータシートに載っているサンプルのまんま)

メインのwhileループは、次のとおりです

  • A/D変換が終わるのをまつ (while(ADC8_1_...)
  • A/D変換した結果をdに読み出す (d = ADC8_1_...)
  • PWM8_1のパルスの幅をdに設定する (PWM8_1_...)
    あ、このPWM8_1_WritePulseWidthの引数は、d/2ではなくてdが正しいです。読みかえてください・・・
  • ADC10を使った場合
    • ADC10の帰り値は10ビットなのですが、PWM8の引数には8ビットしか入れられないので、ビット演算で2ビット右にシフトしています。

ちなみにPWM8_1_WritePuseWidthなどの関数は、PWM8のデータシートに載っています。各データシートのサンプルコード(Sample Code)が参考になりそうですね。
ちなみに上記のA/D変換まわりの処理は、ADC8のデータシートのサンプルのほぼそのまんまです。

プログラムを書き終わったら、Build → Buildでコンパイルします。

pd37.png

↑無事コンパイルがおわったら、めでたしめでたし。エラーが出た場合は、そのエラーメッセージを参考に、デバッグしましょう。
エラーメッセージをダブルクリックすると、エラーの行に飛ぶことができます。

書き込み

いよいよ、作成したプログラムをPSoC First Touchの小基板のPSoCに書き込んで動作させてみましょう。

PSoC First Touchの2つの部分をドッキングした状態で、PCのUSBポートに接続すると、ドライバをインストールする画面が現れるので、自動的にインストール、を選べば、あとは自動でドライバが入るはずなので、終わるまで待ちます。

Designer経由で書き込むときと、Programmerというソフトを起動して書き込む2種類があります。通常はDesigner経由で書き込む方法が楽でしょう。

ソフトのバージョンが古いと、Designer経由で書き込もうと思っても、programmerが起動するようです。

Designer経由で書き込むとき

↓PSoC DesignerのProgram → Program partを選ぶと、Program Portという画面が出てきます。

ppd1.png

この段階ですでに、書き込み先のPSoC、書き込むプログラムが選択されているので、右下の矢印をクリックすれば書き込みが始まります。
書き込みが終わると、すぐにプログラムの動作は始まっています。どんな感じでしょう?

もし動かなかったら、一度USBポートから抜いてみて、さしなおしてみてください。
(よくあります)

programmer経由で書き込むとき

スタートメニューから、PSoC Programmerを起動してください。
↓PSoC DesignerのProgram → Program partを選ぶと、書き込みを行うPSoC Programmerが立ち上がります。

pp1.png

↓左上の方のPortから、使う書き込み機を選びます。

pp2.png

↓無事選ばれました。ついでに、書き込み対象のPSoCであるCY8C21434を選ぶため、Device Familyは21x34を、DeviceはCY8C21434を選んでおきます。

pp3.png

↓作成したプログラムをコンパイルした結果を開くため、File Loadを押すと、書き込みするファイルを選ぶ画面が現れるので、いま作ったプログラムのプロジェクトのディレクトリ(フォルダ)の下のフォルダoutputの中にある、*.hex(この場合はled_test.hex)を選んでおきます。

pp4.png

↓Programを押せば、プログラムの書き込みがはじまるので、少し待ちます。(10秒くらい?)

pp5.png

↓書き込みが終わるとき、なぜかChecksum Failedと出るようですが、ちゃんと書き込みができているようなので、気にしないことにします。

pp6.png

書き込みが終わると、すぐにプログラムの動作は始まっています。どんな感じでしょう?

例題1

  1. 明るさに応じて、赤色のLEDの明るさが変わるようにしてみましょうかね。
  2. 明るさに応じて、赤←→青と変わるようにしてみましょうかね。(ヒント:赤=赤100%+青0%、青=赤0%+赤100%、と考えて、赤、青、それぞれの明るさを、ADC8_1の値に応じて変えるとよいでしょうね)

CapSenseで遊ぶ

PSoC(の一部)では、容量検知型の、タッチセンサを使えます。ポチポチおすスイッチの代わりに、

  • 電極に触れるだけでスイッチの代わりにできたり、
  • あるいは複数並べて、触れている位置を検知するスライダー
    にもできます。

このタッチセンサの機能は、CapSenseというモジュールを配置することで、簡単に使えます。

新しいプロジェクトを始めたあと、ユーザモジュールの選択のときに、CapSensorsの中のCSDというモジュールを選びます。
すると、CSDモジュールの構成を聞かれますので、最初の「Select CSD without clock prescaler」を選んでおきます。
(CSDモジュールは、Delta-Sigma変調を使って、ノイズ耐性を高めたタッチセンシングの方式を使っているらしいです。興味がある人はCSDモジュールのデータシートに動作原理の解説があります)

続いて、CSDモジュールを配置後、CSD_1を右クリックして現れるメニューの中から、「CSD Wizard」を選ぶと、↓このような画面が現れます。

csd1_.png

これは、タッチセンサとして使うボタンの数と、そのボタンの代わりに使う電極をPSoCのどのピンにつなぐかを指定します。

タッチボタンとして使う

まずは、PSoC First Touchの近接センサの電極として使う青色のビニール線(P2[0]につながっている)を、タッチセンサの電極として使うことにします。

今回は、タッチボタンとして使うので、 Buttonsを1、Slidersを0にします。また、Modulator Capatitor, Feedbank Resistorは、この基板ではこのピンにコンデンサと抵抗がついているので、この通りに指定します。

csd2_.png

↓SW0をクリックして、そのままP2[0]にドラッグします。
この基板は、最初からボタン(青色のビニール線をさす場所)がP2[0]に設定されています。したがって、SW0とp2[0]を対応づけました。OKを押して終了します。

csd3_.png

ついでに、LEDがつなげたPWM8モジュールも配置し、最初の例と同じように設定・配線しておきます。

↓その後、次のようなプログラムを書いてみましょう。(実はCSDモジュールのデータシートのSampleCodeのほぼパクりです)

csd5.png

最初の方はおまじないですが、関数名が、そのまんまの名前なので、だいたいやっていることはわかるかと思います。要は、初期化をしたあと、while(1)の中で、タッチセンサの値を読んでいます。
k番目のタッチセンサがオン(さわっている)かどうかは、CSD_1_IsSensorActive(k)という関数でわかります。今回のタッチセンサはSW0ですから、CSD_1_IsSensorActive(0)でオンかどうかを調べています。ONであればLEDを明るく、OFFであれば暗くしています。

青いビニール線に触ればLEDが明るくなって、青いビニール線に触らなければLEDが消えましたか?

このタッチセンサは、ある程度、ですが、電極までの距離もわかります。
↓CSD_1_waSnsDiff[k]で、k番目のタッチセンサと指までの距離(正しくはカウンタの値)が求められます。ただしこの変数は16ビットですので、適当なビット数分だけ右シフトした後、下位8ビットのみをPWM8_1のデューティー比として設定しています。

csd6.png

スライダとして使う

さらにCSDモジュールは、複数の並んでいる電極をつないで、指がどの位置に触れているかという場所を求めることもできます。(Slide機能)

今回は、スライダを使うので、CSD Wizardで、Slidersを1にしてみましょう。
タブを切り替えると、構成するスライダを構成する電極数を入れる場所があります。この小基板にはP2[1]〜P2[7]に7個の並んだ電極がつながっていますので、Sensor Countを7にします。
また、その7個の電極の並びで、指が触れている位置を、何段階で検出するか、をResolutionとして指定できます。今回は、PWM8_1の分解能と同じ8ビット(255)としておきましょう。
電極と、ピンを対応付けます。S0(0)をPS[1]に、、、S0(6)をPS[7]にドラッグ&ドロップしてください。

csd7_.png

↓プログラムは、タッチセンサの場合とほぼ同じです。スライダの位置(触れている場所)は、CSD1_wGetCentroidPos(k)で求められます。(ただしk=1が、1つめのスライダ)今回は、その値が0〜255で求められることにしていました(先ほどのResolution)ので、そのままPWM8_1のデューティー比として書き込んでいます。

csd8.png

余談

余談です
↓さっきから出ているこれ、何でしょう?

csd9_.png

私(komatsubara)は最初、CSDっていうものが2次元的に配置されていて、右上を触ったらP3[0]が反応して、左下を触ったらP0[7]が反応する、と思っていました。
が、もちろんそんなことはありません(笑)

これは、PSoCのピンの番号をただ単に2次元的に配置しただけです。左列がポート0、右列はポート3、といった具合に。
PW0をドラッグする際に、こういう風に配置してあればわかりやすい(かもしれない)のでこういう配置になっているんだと思います。

タイマ割り込み

割り込みを使うと、main()関数の中のwhile(1)ループをまわしながら、定期的にある関数を実行したり、あるいは何かの入力があったときにある関数を実行する、ということができます。

割り込みの使い方の例として、タイマ割り込みを使って、定期的にLEDの明るさを変えてみましょう。

#タイマ割り込みを使わない場合、for(i=0;i<10000;i++);とか言ったからのループで時間稼ぎをするかと思います。しかしこれでは厳密に何秒、と指定するのは困難です。

#しかし、タイマ割り込みを使うことによって、何秒ごとに動作する、を正確に行うことができます。

次のステップをふんでみてください。

  1. 新しいプロジェクトで、PWM8_1と、Timer8_1を配置(Timer8_1は、Timers内のTimer8を使う)。PWM8_1は、最初の例と同じように設定し、どれかのLEDに接続する。
  2. Timer8_1モジュールの設定をする。主なところは以下の通り。
    • Clockとして、1kHz程度のクロックをVC3などで作る。VC3の周波数は厳密でなくてもよい。
    • Periodを20ms程度の周期になるように設定する。例えばClockの周波数が1kHzであれば、Timer8_1は1msごとにカウンタが進むので、Periodを20にすれば、20msごとにTimer8_1のカウントが終わる(Terminal)ことになる。
    • InterruptTypeTerminalCountにする。これで、Timer8_1のカウントが終わるごと(つまり20msごと)に割り込みが発生するようになる
  3. プログラムを書く。主なところは以下の通り。
    • グローバル変数としてBYTE dutyを宣言しておく。
    • Timer8_1カウント終了割り込みが発生したときに呼ばれる関数(割り込み処理ルーチン: Interrupt Service Routine; ISR)を定義する。
      #pragma interrupt_handler Timer8_1_ISR
      void Timer8_1_ISR(){
       PWM8_1_WritePulseWidth(duty++);
      }
      なお割り込み処理関数は、(割り込みを起こすモジュール名)_ISR、となる。
  • main()関数内て、Timer8_1割り込みを許可(使えるようにする)し、Timer8_1をスタートしておく。
    M8C_EnableGInt;
    Timer8_1_EnableInt();
    Timer8_1_Start();
    それ以外のところは、PWM8_1をスタートしたら、あとはwhile(1)で何もしなくてもOK。

(注意)HI-TECHのコンパイラでコンパイルすると、アドレス割り当てしてください、っていうWarningがでますが、これは自動でしてくれるので無視してかまいません。

書き込み器からの独立

お気づきの方も多いと思いますが、書き込みを終わったあとは、書き込み機は、特にすることはありません。しいていえば、小基板に電源を供給しているだけです。

つまり。

電源さえつなげば、小基板を切り離して動作させることができるわけです。

書き込み機につながるコネクタに、ヘッダピンをつないで、First Touch Document.pdfに載っているピン配置を参考に、VCCとGNDの間に+5Vを供給すればOKです。

  1. 5Vの電源は、何でもよいのですが、USBポートが便利です。
    USBポートは、+5Vの電源が供給されているので、PCのUSBポートでも、最近よく見かける、↓こんなグッズでもOKです。
    USB-Pow1.JPG
    USB-Pow2.JPG

ケーブル側のUSBコネクタ↓には4本の端子がありますが、差し込む先のほうから見て、下の写真で、右端が+5V、左端がGNDです。

USB-B.JPG

↓手持ちの不要なUSBケーブルを切断して作ってもいいですし、USBコネクタに自分でビニール線をつないでもOKです。こういうのを1本持っておくとよいでしょう。

USB-PowCable.JPG

USBコネクタの反対側、自分の機器につなぐ側のコネクタは、なんでもよいのですが、MeRL標準としては、いわゆるφ2.1mm DCプラグ↓、をおすすめします。

DCplug.jpg

これにそろえておくと、みんなで使い回しができて便利です。

自分の機器側には、↑の受け側(ジャック)を穴あき基板などに取り付け、その基板上に小基板をつなぐコネクタなどをつけると完成です。

PCとの遭遇

FirstTouchの小基板は、いろいろなセンサがついていますが、PCとつないで、いじれると、楽しそうです。
別ページとして独立させました
PSoC入門:PCと通信


添付ファイル: filewiki_led_07.png 1072件 [詳細] filewiki_led_05.png 1078件 [詳細] filewiki_led_03.png 1048件 [詳細] filewiki_led_04.png 1215件 [詳細] filewiki_led_06.png 1008件 [詳細] filepd26.png 748件 [詳細] filepd32.png 530件 [詳細] filepd27n.png 1001件 [詳細] filepd22.png 733件 [詳細] filepd12.png 771件 [詳細] filepd16.png 786件 [詳細] filepd25n.png 871件 [詳細] filepd03n.png 513件 [詳細] filepd26n.png 997件 [詳細] filepd36.png 595件 [詳細] filepd05n.png 512件 [詳細] filepd23n.png 902件 [詳細] filepp1.png 1138件 [詳細] filepp5.png 1228件 [詳細] filepd06n.png 1262件 [詳細] filecsd1.png 803件 [詳細] filepd07n.png 1183件 [詳細] filepd22n.png 962件 [詳細] fileUSB-Pow1.JPG 1155件 [詳細] filepd15bn.png 852件 [詳細] filepd21n.png 974件 [詳細] fileUSB-B.JPG 1147件 [詳細] filepd20n.png 1183件 [詳細] filepd02.png 788件 [詳細] filepd07.png 524件 [詳細] filepd36_10.png 183件 [詳細] filepd03.png 748件 [詳細] filepd17.png 752件 [詳細] filepd13.png 725件 [詳細] filecsd8.png 512件 [詳細] filepp4.png 1094件 [詳細] filepd08n.png 1121件 [詳細] filepd09n.png 1098件 [詳細] fileDCplug.jpg 1435件 [詳細] filecsd4.png 504件 [詳細] filewiki_intro_02.png 1114件 [詳細] filepd28n.png 348件 [詳細] filepd01n.png 573件 [詳細] filewiki_led_02.png 1232件 [詳細] filepd06.png 821件 [詳細] filepd24n.png 950件 [詳細] filecsd5.png 527件 [詳細] filepd37.png 1179件 [詳細] filepd33.png 541件 [詳細] filepd23.png 702件 [詳細] filepd27.png 824件 [詳細] fileUSB-UART.JPG 847件 [詳細] fileft1.jpg 1404件 [詳細] filewiki_intro_03.png 1132件 [詳細] filewiki_intro_01.png 1160件 [詳細] filepp2.png 1198件 [詳細] filecsd6.png 549件 [詳細] filepp6.png 1088件 [詳細] filecsd9_.png 431件 [詳細] filepd18n.png 1133件 [詳細] filecsd2.png 725件 [詳細] filepd19n.png 445件 [詳細] filecsd3.png 799件 [詳細] filepp7.png 527件 [詳細] filecsd7.png 793件 [詳細] filepd15n.png 1489件 [詳細] filepd30n.png 355件 [詳細] filepd15.png 894件 [詳細] filepd11.png 676件 [詳細] filepd31.png 1356件 [詳細] filepd09.png 731件 [詳細] filepd35.png 1259件 [詳細] filepd21.png 703件 [詳細] filepd25.png 733件 [詳細] fileppd1.png 911件 [詳細] filepd01.png 800件 [詳細] filepd19.png 756件 [詳細] fileUSB-Pow2.JPG 1114件 [詳細] filewiki_intro_04.png 1145件 [詳細] filepd05.png 731件 [詳細] filepp3.png 1167件 [詳細] filepd32n.png 403件 [詳細] filecsd2_.png 1085件 [詳細] filepd13n.png 1338件 [詳細] filewiki_led_01.png 1678件 [詳細] filepd35n.png 464件 [詳細] fileUSB-PowCable.JPG 1124件 [詳細] filepd04.png 882件 [詳細] filepd08.png 775件 [詳細] filepd29.png 557件 [詳細] filepd14.png 1484件 [詳細] filepd10.png 827件 [詳細] filecsd3_.png 884件 [詳細] fileftmt.png 1751件 [詳細] filepd30.png 523件 [詳細] filepd16n.png 1184件 [詳細] filepd24.png 691件 [詳細] filecsd7_.png 1165件 [詳細] filepackage.jpg 1272件 [詳細] filepd17n.png 1025件 [詳細] filepd20.png 807件 [詳細] fileft2.jpg 1277件 [詳細] filecsd1_.png 1051件 [詳細] filepd34.png 690件 [詳細] filepd28.png 523件 [詳細] filepd34n.png 965件 [詳細] filepd18.png 751件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-10-02 (日) 11:12:58