LEDへの出力に続いて、GPIO(汎用入出力ピン)でスイッチからの入力を取ってみた。
あとはUART、入力割り込み、ADコンバータ、タイマーを確認すれば、AVRからすっかり移住できると思う。
Source Code (PSoC Designer 4.3 + C Compiler)
今回もCY3210-MiniEval(PSoCライタに付いてた評価ボード)を使った。
下記に書いてある回路などの話は、データシート見ながらの方がわかりやすいと思う。
■PSoC Designerでのデバイス設定
PORT2の0~3がLEDなので、LEDへの出力の時と同じように「strong」に設定する
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が判断できる。