ここでは、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(プルアップ)