PSoCは、アナログ/ディジタルのPSoCコアを使用していくことで、他の一般的なマイコンにはできない用途を実現することができるマイコンです。
もちろんPSoCコアではなく、マイコン(M8C)そのものでポートを叩いたりといった処理は工作をする上では大抵必要となります。
しかしながら、ネットを見ても、Application notesを見ても意外とそういった、「普通のマイコンとして使用する」例が少ないと感じました。 実際のところ、自分でPSoCのポートを使用したかったけどうまく使う方法がよくわかんないったってことですが^^;
というわけで、C言語から効率的にポートを使用して行く手法をご紹介します。
まずは、デバイスエディタのポート設定画面を出します。
1.まず、以下のアイコンをクリックする。
2.ツールバーのConfig→Interconnectを選択する。
3.右下部分のポート設定部分を確認する。
上記画面では、一行が1ポートに対応しています。
| Name | Port | Select | Drive | Interrupt |
| ポート名 | 対応ポートリソース(変更不可) | ピンの内部接続 | ポート処理 | 割り込みの使用 |
| 使用するポート名を選択 | ポートとして使用する場合StdCPU | 入力はHighZ | 使用しない場合DisableInt |
ポート名を設定します。スイッチ入力なら、SW_INとか、緑色LED制御出力ならLED_GREENなどお好みで決めてください。
ハードとしてどのポートリソースに対応しているかが表示されています。ここは確認のみ。
CPUの汎用ポートとして使用したいので、StdCPUとしましょう。
主に使いそうなものを列挙しました。
| HighZ | ハイインピーダンス:入力ポート |
| Pull Up | 内部プルアップあり |
| Strong | 出力ポート |
Strong Slowは同じく出力ポートですが、スルーレート(SlewRate)が変化するようです。
例)出力ポート ポート2 bit6にHighを出力
// 該当ポートのビットのみORで1を立てます。 PRT2DR = PRT2DR | (1 << 6);
出力ポート ポート4 bit2にLowを出力
// 該当ポートのビットのみANDによるビットマスクで0にします。 PRT4DR = PRT4DR & ~(1 << 2);
例)入力ポート ポート2 bit0(Port2_0)から値を変数p1に取得
p1 = PRT2DR & 0x01;
例)入力ポート ポート3 bit4(Port3_4)から値を変数p2に取得
p2 = (PRT3DR >> 4) & 0x01;
仕様書を読むと、Pull Upポートに関しては値を読む前にデータレジスタに1を設定することとあります。ですから以下のようにします。 これを怠ると、内部プルアップなしの振る舞いになってしまうようです(完全に等価かどうかは不明)
例)内部プルアップあり入力 ポート2 bit7から値を変数xに読み込む
PRT2DR = 0x80; x = (PRT2DR >> 7) & 0x01;
ポート0に以下のようなピンをアサインしたとします。
| Port0 | bit 0 | 出力(Strong) | LED出力(L:消灯,H:点灯) |
| Port0 | bit 1 | 出力(Strong) | (他の用途で出力ポートとして使用してると仮定・現在の出力値を変更せず維持したいとします) |
| Port0 | bit 2 | 入力(HighZ) | 押しボタンSW接続(L:押下,H:開放) |
で、bit 2に接続されたボタンを押されたらLEDを点灯するプログラムを作成したいとして、
PRT0DR = ((PRT0DR >> 2) & 0x01) == 0 ? PRT0DR | (1<<2) : PRT0DR & ~(1<<2);
とアクセスしたとします。 ポートは8ビットで1グループですので、ポートにアクセスする場合は他のビットの動作に影響を出さないよう、ビットマスクや論理和などを活用する必要があります。これは結構面倒ですし、ポート配置変更した場合などの対応もソフトのつくりによっては面倒になります。
出来ればスマートに、
LED = ~xSW_IN
とかしたいところです。この為に、ビットフィールドを使用します。
まずは、ビット単位でのアクセスを実現する為、ビットフィールドアクセス用構造体を作成します。
/*
GPIOアクセス構造体
*/
struct s_GpioGroup {
char b0 :1;
char b1 :1;
char b2 :1;
char b3 :1;
char b4 :1;
char b5 :1;
char b6 :1;
char b7 :1;
};
例)ポート2 bit6にプッシュSW、同ポート2 bit4にLEDを接続した場合の定義
#define GPIO_PUSH_SW (((struct s_GpioGroup*)&PRT2DR)->b6) #define GPIO_LED_GREEN (((struct s_GpioGroup*)&PRT2DR)->b4)
これで、
// PUSH_SWが押されたら(GPIOがLowだったら)、LED出力ピンをHighにする GPIO_LED_GREEN = ~GPIO_PUSH_SW;
と記述すれば、GPIO_PUSH_SWにLowが入力されればGPIO_LED_GREENがHighになる記述が可能なのでかなり見やすくなりますね。
アクセスカウント(累計) : -
アクセスカウント(本日) : -
アクセスカウント(昨日) : -