PSoCでスイッチによるポートの割り込みを処理する

psoc_sw_int_01.gif
今回はスイッチ入力で割り込みを発生させ、LEDを光らせる。PSoC Designerでは(使い勝手が悪いものの)比較的簡単にポート割り込みを実装できるようにできている。

psoc_sw_int_02.gif
PSoC Designerを起動したら「Config」メニューの「Interconnect」から画面を切り替える。

psoc_sw_int_03.gif
ここでポートの設定をする。「Port_1_4」の「Drive」を「Pull Down」、「Interrupt」を「ChangeFromRead」にする。この「Interrupt」の項目が割り込みの設定になる。ここではスイッチが押し下げられたときと、上がったときの両方で割り込みが起きるようにした。ちなみに今回使うスイッチはONのときに5Vになるので、押し下げられたときのみ割り込みを起こしたいときは「FallingEdge」、ボタンから指を離したときは「RisingEdge」に設定すればいい。
さらに「Port_2_0」の「Drive」を「Strong」にする。これはLEDを光らせるための設定だ。

設定が済んだら「View」メニューの「Application Editor」でソースコードを書く画面に切り替える。

psoc_sw_int_04.gif
普段であれば「main.c」を編集してソースコードを書き始めるところだが...今回はまずビルドを行う。

psoc_sw_int_05.gif
すると編集に必要なソースコードが生成される。この作業は「Device Editor」の画面で「Config」メニューの「Generate Application」から行うこともできる。

ソースコードが自動生成されたら「Library Source」の「psocgpioint.asm」を開く。

psoc_sw_int_06.gif
そして「PSoC_GPIO_ISR:」の下に「ljmp _GPIO_INT」という命令を追加する。ここでは後ほど用意する関数名に「_」(アンダースコア)を付加したラベルへのジャンプ命令にする。

psoc_sw_int_07.gif
そして「Souce Files」の「main.c」に処理を書く。


//----------------------------------------------------------------------------

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules

#pragma interrupt_handler GPIO_INT
void GPIO_INT(void)
{
if(PRT1DR & 0x10)
PRT2DR |= 0x01;
else
PRT2DR &= ~0x01;
}


void main()
{
M8C_EnableGInt;
M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);

while(1)
{
}
}





_DSC9077.JPG
これでPSoCへ書き込む。するとMiniProgの横のスイッチを押すとP20のLEDが赤く光る。
今回はポート14に接続されたスイッチの割り込みを利用したが、すべてのポートに対して割り込みの設定ができる。ただし、どのポートが割り込みを発生させたのかは自分で判断しないといけない。


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