![]()
今回は開発にPSoC Expressでなく、PSoC Designerを利用してLEDを点滅させる。点滅周期の生成には8ビットのタイマーモジュールを利用した。簡単な処理なので有料のC言語は利用せず無料のアセンブラで済ませる。
PSoC Designerを起動し、「Start new project」ボタンから新しいプロジェクトを作る。
![]()
フォルダを作成するかどうか問われたら「はい」をクリックする。
![]()
テストに用いるデバイスは「CY8C29466」なのでそのまま「完了」ボタンを押す。
![]()
これでプロジェクトが生成されてモジュールの選択画面が開いた。今回はタイマーを利用するので左側の選択欄から「Timers」を見つけクリックする。この左側の欄にはあらかじめCypressが用意してくれたモジュールが数多く登録されている。これらの中から必要に応じたものを選び、必要に応じて設定などを変えることでPSoCの機能を作り出せる。
![]()
すると利用できるタイマーが一覧される。8ビットの「Timer8」、16ビットの「Timer16」、24ビットの「Timer24」、32ビットの「Timer32」がある。
![]()
今回利用するのは8ビットタイマーなので、「Timer8」を右クリックして現れたメニューから「Select」を選択する。
![]()
すると画面中央上側に「Timer8_1」というアイコンが表示される。
![]()
次にPSoCのどのピンに出力を割り当てるかなどの細かい設定をするための画面を開く。「Config」メニューから「Interconnect」を選択する。
![]()
これで画面表示が切り替わった。標準状態ではTIPSが表示されるが、とりあえず必要ないので左下のチェック欄にチェックを入れてから閉じる。
![]()
これで各種設定をするための画面が開いた。この画面ではPSoCの動作クロックの設定や内部配線をどうするかなどの指定ができる。
![]()
まずは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)に設定される。
![]()
次に8ビットタイマーを実際に使える状態にする。「Timer8_1」を右クリックして現れたメニューから「Place」を選択する。
![]()
すると画面中央部分のPSoCの内部配線を示す図中に青色のブロックが追加されるとともに、左側に「Timer8_1」の設定画面が開く。
![]()
まずはタイマーの設定をする。今回は赤枠内を修正した。
「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」の半値にすると覚えておくといいだろう。
![]()
「CompareOut」を「Row_0_Output_3」にすることで、タイマーモジュールからの出力信号は「Row_0_Output_3」に流れる。しかしこの「Row_0_Output_3」はPSoCの内部配線なので、これが実際のIC上のピンに出力されるように内部配線を設定する。設定には中央の内部を利用する。見やすいように拡大表示するといいだろう。ちなみにPSoC Designerを快適に使おうと考えたらできれば1920×1100ドット以上のディスプレイを用意した方がいいだろう。
![]()
タイマーからの配線は「RO0[3]」(Row_0_Output_3の略)に結ばれている。今回はこれをポート22に出力する。「Row_0_Output_3」から先の配線を設定するため右側の四角形をクリックする。
![]()
すると新たなウインドウが開く。ここで右側の三角形をクリックする。
![]()
すると選択肢が現れるので「GlobalOutEven_3」を選択する。
![]()
三角形が青色に塗りつぶされたら「Close」ボタンで閉じる。
![]()
するとさらにメニューが表示される。ここから目的のポートを示す「Port_2_3」をクリックする。
![]()
これでポート23に線が延び、タイマーからの信号がポート23に出力されるようになった。
![]()
これで設定と内部配線が一通り終わった。次にソースコードを用意する。「View」メニューから「Application Editor」を選択する。
![]()
MicrosoftのVisual Studio(Visual C++など)によく似たウインドウが開いた。ここでソースコードを記述する。
![]()
左側のツリーの「Source Files」にある「main.asm」をダブルクリックして開く。ここにメイン処理を用意する。
![]()
...とは言うもののいきなりソースコードを書くのは難しいだろう。そのため用意されているサンプルコードを開く。ツールバーにある選択欄から「Timers」の「Timer8」を選択し、「User Module Datasheet」ボタンを押す。
![]()
すると8ビットタイマーに関するデータシートが開く。このウインドウ下部の「SampleCode」タブをクリックする。
![]()
ここで「8-Bit Timer Sample Firmware Sample Source Code」をクリックする。
![]()
これでサンプルソースコードが表示された。ここにはアセンブラとC言語の2通りの方法でサンプルが用意されている。今回はアセンブラのソースコードを利用する。
「Setup1msPulse:」の行から「ret」の上の行までを選択して右クリックして現れるメニューからクリップボードにコピーする。コピーしたらデータシートを閉じる。
![]()
そしてサンプルコードを「main.asm」の中に貼り付ける。
![]()
貼り付けたソースコードをそのままビルドしてもエラーになってしまう(画面はエラー例)。
![]()
エラーの原因はタイマーの名前がサンプルのままではダメだからだ。「TIMER8」となっていた部分を3箇所「Timer8_1」に置き換える。この「Timer8_1」というのは、先の配線などの設定画面で表示されていた名前をそのまま利用する。ソースコードを修正したら「Build」メニューから「Build」を選択してビルドする。
![]()
これで「0 error(s)」と表示されてビルドに成功した。
ちなみに利用したサンプルコードでは「Timer8_1_WritePeriod」関数によって、先の配線画面で設定したタイマーの「Period」の値を上書きしてしまっている。設定画面の値を利用したい場合はこの行を削除する。
![]()
出力された結果はプロジェクトフォルダにある「Output」の中にHEXファイルで保存されている。
![]()
出力されたHEXファイルを実際にPSoCへ書き込む。書き込みにはPSoC Programmerを利用する。USBポートにMiniProgを接続後、PSoC Programmerを起動し、「File Load」ボタンからHEXファイルを読み込む。
![]()
HEXファイルを読み込んだら「Program」ボタンを押す。
![]()
1分ほどで書き込みが終了する。正常に書き込めたら「Toggle Device Power」ボタンを押してPSoCに電源を供給し動かす。
これでMiniEval1ボードのポート23に用意されたLEDが点滅した。
せっかくなのでオシロスコープで点滅周期を測ってみた。「931.1mHz」という結果だった。設定した点滅周期は6MHz÷(16×16×256×100)≒0.916Hzとなる。オシロスコープでの計測誤差もあるのでまぁまぁかな?
