LEDへの出力に続いて、GPIO(汎用入出力ピン)でスイッチからの入力を取ってみた。

あとはUART、入力割り込み、ADコンバータ、タイマーを確認すれば、AVRからすっかり移住できると思う。

Source Code (PSoC Designer 4.3 + C Compiler)

今回もCY3210-MiniEval(PSoCライタに付いてた評価ボード)を使った。

下記に書いてある回路などの話は、データシート見ながらの方がわかりやすいと思う。



■PSoC Designerでのデバイス設定

PORT2の0~3がLEDなので、LEDへの出力の時と同じように「strong」に設定する

PSoC switch input & ledsPSoC switch input & leds

PORT1の4はスイッチに直接つながっているので、「Pull Up」に設定。

■スイッチのプルアップ

普通の入力ピンとして使うならハイインピーダンス(High Z)が良いが、PORT1-4とスイッチは直接つながっているだけなので、抵抗を使って「プルアップ」しておく必要がある。

今回はPSoCの内部プルアップ抵抗を使った。

プルアップについて詳しくはこの辺参照

センサ道場 第4回 「プルアップ・プルダウン抵抗」

Pull Up / はまりどころ::PSoC

Pull up/down

■プログラム

デバイス設定終わったら「Generate Application」して「ApplicationEditor」に行く。

今回のコードはこれ

#include//partspecificconstantsandmacros

#include”PSoCAPI.h”//PSoCAPIdefinitionsforallUserModules

#define_BV(BIT)(1<
#definesbi(BYTE,BIT)(BYTE|=_BV(BIT))

#definecbi(BYTE,BIT)(BYTE&=~_BV(BIT))

voidmain()

{

charled;

led=0;

for(;;){

if(PRT1DR&_BV(4)){//ifswitchON

while(PRT1DR&_BV(4));//waituntilswitchOFF

led++;//next

}

PRT2DR=led;//displaybinarybyLED

}

}

スイッチがonになってから再びoffになるまで待機して、8bitの変数ledを一つ増やす。

そして変数ledをそのままPRT2DRに代入すると、ledの0~3ビット目が基盤上のLED4つに2進数として表示される。

PSoCのGPIOは

charn;

n=PRT1DR;//入力

PRT1DR=0xFF;//出力

と、読み出せば入力状態、書き込めば出力、となる。

PRT1DR自体はAVR等と同じ8bitのレジスタで、1bit毎にピンが割り当てられている。

つまりPRT1DRの0ビット目はPORT1-0ピン、1ビット目はPORT1-1ピン…となるので、

if(PRT1DR&_BV(4))

とすると、&のビット演算でスイッチの接続されている4ビット目だけが取り出されて、on/offが判断できる。