PSoCを使い8ビットタイマーでLEDを点滅させる


WS00.gif
今回は開発にPSoC Expressでなく、PSoC Designerを利用してLEDを点滅させる。点滅周期の生成には8ビットのタイマーモジュールを利用した。簡単な処理なので有料のC言語は利用せず無料のアセンブラで済ませる。

PSoC Designerを起動し、「Start new project」ボタンから新しいプロジェクトを作る。

WS01.gif
ここではプロジェクト名を「Test」とした。

WS02.gif
フォルダを作成するかどうか問われたら「はい」をクリックする。

WS03.gif
テストに用いるデバイスは「CY8C29466」なのでそのまま「完了」ボタンを押す。

WS04.gif
これでプロジェクトが生成されてモジュールの選択画面が開いた。今回はタイマーを利用するので左側の選択欄から「Timers」を見つけクリックする。この左側の欄にはあらかじめCypressが用意してくれたモジュールが数多く登録されている。これらの中から必要に応じたものを選び、必要に応じて設定などを変えることでPSoCの機能を作り出せる。

WS05.gif
すると利用できるタイマーが一覧される。8ビットの「Timer8」、16ビットの「Timer16」、24ビットの「Timer24」、32ビットの「Timer32」がある。

WS06.gif
今回利用するのは8ビットタイマーなので、「Timer8」を右クリックして現れたメニューから「Select」を選択する。

WS07.gif
すると画面中央上側に「Timer8_1」というアイコンが表示される。

WS08.gif
次にPSoCのどのピンに出力を割り当てるかなどの細かい設定をするための画面を開く。「Config」メニューから「Interconnect」を選択する。

WS09.gif
これで画面表示が切り替わった。標準状態ではTIPSが表示されるが、とりあえず必要ないので左下のチェック欄にチェックを入れてから閉じる。

WS10.gif
これで各種設定をするための画面が開いた。この画面ではPSoCの動作クロックの設定や内部配線をどうするかなどの指定ができる。

WS11.gif
まずはPSoCの動作クロックなどの設定をする。今回は赤枠で囲んだ部分を修正した。

「PowerSetting」を「5.0V/24MHz」から「5.0V/6MHz」に
「VC1=SysClk/N」を「1」から「16」に
「VC2=VC1/N」を「1」から「16」に
「VC3 Source」を「VC2」に
「VC3 Divider」を「1」から「256」に変えた。

これにより、PSoCの動作周波数が6MHzになり、VC1は375kHz(=6MHz÷16)、VC2は約23.4kHz(≒375kHz÷16)、VC3は916Hz(≒23.4kHz÷256)に設定される。

WS12.gif
次に8ビットタイマーを実際に使える状態にする。「Timer8_1」を右クリックして現れたメニューから「Place」を選択する。

WS13.gif
すると画面中央部分のPSoCの内部配線を示す図中に青色のブロックが追加されるとともに、左側に「Timer8_1」の設定画面が開く。

WS14.gif
まずはタイマーの設定をする。今回は赤枠内を修正した。
「Clock」を「VC3」に、
「Capture」を「Low」に、
「TerminalCountOut」を「None」に、
「CompareOut」を「Row_0_Output_3」に、
「Period」を「99」に、
「CompareValue」を「50」に、
「CompareType」を「Less Than Or Equal」に、
「InterruptType」を「Capture」に、
「ClockSync」を「Sync to SysClk」にした。タイマーを使うときは「CompareOut」と「Period」を必要に応じて設定し、「CompareValue」は「Period」の半値にすると覚えておくといいだろう。

WS15.gif
「CompareOut」を「Row_0_Output_3」にすることで、タイマーモジュールからの出力信号は「Row_0_Output_3」に流れる。しかしこの「Row_0_Output_3」はPSoCの内部配線なので、これが実際のIC上のピンに出力されるように内部配線を設定する。設定には中央の内部を利用する。見やすいように拡大表示するといいだろう。ちなみにPSoC Designerを快適に使おうと考えたらできれば1920×1100ドット以上のディスプレイを用意した方がいいだろう。

WS16.gif
タイマーからの配線は「RO0[3]」(Row_0_Output_3の略)に結ばれている。今回はこれをポート22に出力する。「Row_0_Output_3」から先の配線を設定するため右側の四角形をクリックする。

WS17.gif
すると新たなウインドウが開く。ここで右側の三角形をクリックする。

WS18.gif
すると選択肢が現れるので「GlobalOutEven_3」を選択する。

WS19.gif
三角形が青色に塗りつぶされたら「Close」ボタンで閉じる。

WS20.gif
これで四角形の部分からさらに右側に線が延びた。

WS21.gif
次にこの新しく追加された線の上でクリックする。

WS22.gif
するとメニューが現れるので「Pin」を選択する。

WS23.gif
するとさらにメニューが表示される。ここから目的のポートを示す「Port_2_3」をクリックする。

WS24.gif
これでポート23に線が延び、タイマーからの信号がポート23に出力されるようになった。

WS25.gif
これで設定と内部配線が一通り終わった。次にソースコードを用意する。「View」メニューから「Application Editor」を選択する。

WS26.gif
MicrosoftのVisual Studio(Visual C++など)によく似たウインドウが開いた。ここでソースコードを記述する。

WS27.gif
左側のツリーの「Source Files」にある「main.asm」をダブルクリックして開く。ここにメイン処理を用意する。

WS28.gif
...とは言うもののいきなりソースコードを書くのは難しいだろう。そのため用意されているサンプルコードを開く。ツールバーにある選択欄から「Timers」の「Timer8」を選択し、「User Module Datasheet」ボタンを押す。

WS29.gif
すると8ビットタイマーに関するデータシートが開く。このウインドウ下部の「SampleCode」タブをクリックする。

WS30.gif
ここで「8-Bit Timer Sample Firmware Sample Source Code」をクリックする。

WS32.gif
これでサンプルソースコードが表示された。ここにはアセンブラとC言語の2通りの方法でサンプルが用意されている。今回はアセンブラのソースコードを利用する。

「Setup1msPulse:」の行から「ret」の上の行までを選択して右クリックして現れるメニューからクリップボードにコピーする。コピーしたらデータシートを閉じる。

WS33.gif
そしてサンプルコードを「main.asm」の中に貼り付ける。

WS35.gif
貼り付けたソースコードをそのままビルドしてもエラーになってしまう(画面はエラー例)。

WS37.gif
エラーの原因はタイマーの名前がサンプルのままではダメだからだ。「TIMER8」となっていた部分を3箇所「Timer8_1」に置き換える。この「Timer8_1」というのは、先の配線などの設定画面で表示されていた名前をそのまま利用する。ソースコードを修正したら「Build」メニューから「Build」を選択してビルドする。

WS38.gif
これで「0 error(s)」と表示されてビルドに成功した。

ちなみに利用したサンプルコードでは「Timer8_1_WritePeriod」関数によって、先の配線画面で設定したタイマーの「Period」の値を上書きしてしまっている。設定画面の値を利用したい場合はこの行を削除する。

WS39.gif
出力された結果はプロジェクトフォルダにある「Output」の中にHEXファイルで保存されている。

WS40.gif
出力されたHEXファイルを実際にPSoCへ書き込む。書き込みにはPSoC Programmerを利用する。USBポートにMiniProgを接続後、PSoC Programmerを起動し、「File Load」ボタンからHEXファイルを読み込む。

WS42.gif
HEXファイルを読み込んだら「Program」ボタンを押す。

WS43.gif
するとPSoCへプログラムが書き込まれる。

WS44.gif
1分ほどで書き込みが終了する。正常に書き込めたら「Toggle Device Power」ボタンを押してPSoCに電源を供給し動かす。

_DSC8959.JPG
これでMiniEval1ボードのポート23に用意されたLEDが点滅した。

_DSC8961.JPG
せっかくなのでオシロスコープで点滅周期を測ってみた。「931.1mHz」という結果だった。設定した点滅周期は6MHz÷(16×16×256×100)≒0.916Hzとなる。オシロスコープでの計測誤差もあるのでまぁまぁかな?

トラックバック

この一覧は、次のエントリーを参照しています: PSoCを使い8ビットタイマーでLEDを点滅させる:

» PSoCを使い8ビットカウンターでLEDを点滅させる 送信元 dinop.com
前回は8ビットタイマーを利用してLEDを点滅させた。今回は8ビットカウンターを... [詳しくはこちら]

» PSoCを使い8ビットPWMでLEDを点滅させる 送信元 dinop.com
前回は8ビットカウンターを利用してLEDを点滅させた。今回は8ビットPWMモジ... [詳しくはこちら]


カテゴリー「電子工作」 のエントリー