© 法政大学 理工学部 創生科学科 小林一行実験室

ここでは、CY3210-Eval1ボードについているスイッチ(P_1_4)を使ったLED表示について、ポーリング法による検出と割り込みによる検出による方法を説明する。

P22(ストロングモード)        P23(ストロングモード)
P20(プルアップ)            P21(プルアップ)

CY3210-Eval1ボードには、アナログボリュームと、スイッチ、それに4つのLEDが標準で付いている。このWebのドキュメントには、PWMブロックを使用したLEDの点滅、アナログボリュームとLEDを使った例を解説している。ここでは、(1)ポーリング法によりスイッチのON・OFFを検出、LEDによる表示する例と、(2)割り込みを使ったON・OFF検出、LEDによる表示する例の2つ方法について解説を行っていく。
(1)ポーリング法によりスイッチのON・OFFを検出、LEDによる表示する例
ここでは、PSoCデザイナーを立ち上げて設定を行うわけであるが、とりわけ必要なブロックはないので、
Device EditorのInterconnectモードに設定し、Portのドライブ設定のみを行う。EvalボードでLEDに接続されているポートは、
Port2_0,Port2_1,Port2_2,Port2_3なのでそれぞれ違いを見る意味で

Name

Port

Select

Drive

Interrupt

Port_2_0 P2[0] stdCPU Pull Up DisableInt
Port_2_1 P2[1] stdCPU Pull Up DisableInt
Port_2_2 P2[2] stdCPU Strong DisableInt
Port_2_3 P2[3] stdCPU Strong DisableInt


と設定した。

Cでのプログラミングは、次のようにすればOKである。この場合、ポートを直接いじり操作している。スイッチが付いているポートは、Port_0_4なので(PRT1DR & 0x10)として検出している。

//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------
#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
void main()
{
while( 1 ){
PRT2DR = (PRT1DR & 0x10)?(PRT2DR|0x01):(PRT2DR&~0x01);
PRT2DR = (PRT1DR & 0x10)?(PRT2DR&~0x02):(PRT2DR|0x02);
PRT2DR = (PRT1DR & 0x10)?(PRT2DR|0x04):(PRT2DR&~0x04);
PRT2DR = (PRT1DR & 0x10)?(PRT2DR&~0x08):(PRT2DR|0x08);
}
}

Pull Upだとちょっと暗いがStrongだと明るくなる。

(2)割り込みを使ったON・OFF検出、LEDによる表示する例
割り込みを行うためには、以下のようにPort1_4の設定をDriveをPull Upに設定、InterruptをChangeFromReadに設定する。

Name Port Select Drive Interrupt
Port_1_4 P1[4] stdCPU Pull Up ChangeFromRead
Port_2_0 P2[0] stdCPU Pull Up DisableInt
Port_2_1 P2[1] stdCPU Pull Up DisableInt
Port_2_2 P2[2] stdCPU Strong DisableInt
Port_2_3 P2[3] stdCPU Strong DisableInt


次に、GenerateApplicationを行った後でboot.asmを編集する。(GenerateApplicationを行うたびに新しいコードに書き換わるので注意!)

boot.asm

org   1Ch                      ;GPIO Interrupt Vector
//    ljmp            PSoC_GPIO_ISR
ljmp _timer_handler
reti

ljmp _timer_handlerを付け加える。

次にC言語のプログラムは、次のようになる。

main.c

//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------

#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
#pragma interrupt_handler timer_handler
volatile static int i;
void timer_handler()
{
if(i++ % 2) {
PRT2DR = (PRT2DR|0x01);
PRT2DR = (PRT2DR&~0x02);
PRT2DR = (PRT2DR|0x04);
PRT2DR = (PRT2DR&~0x08);
} else {
PRT2DR = (PRT2DR&~0x01);
PRT2DR = (PRT2DR|0x02);
PRT2DR = (PRT2DR&~0x04);
PRT2DR = (PRT2DR|0x08);
}
}
void main()
{
PRT2DR = 0x0f;
INT_MSK0=INT_MSK0_GPIO;
M8C_EnableGInt;
while( 1 );
}

ボタンを押すことでLEDがON・OFFすることができる。


P22(ストロングモード)       P20(プルアップ)



P23(ストロングモード)            P21(プルアップ)