PSoC

このページの目次

PSoCの汎用ポートを便利に使用しよう!(普通のマイコンみたくポート制御する)

PSoCは、アナログ/ディジタルのPSoCコアを使用していくことで、他の一般的なマイコンにはできない用途を実現することができるマイコンです。

もちろんPSoCコアではなく、マイコン(M8C)そのものでポートを叩いたりといった処理は工作をする上では大抵必要となります。

しかしながら、ネットを見ても、Application notesを見ても意外とそういった、「普通のマイコンとして使用する」例が少ないと感じました。 実際のところ、自分でPSoCのポートを使用したかったけどうまく使う方法がよくわかんないったってことですが^^;

というわけで、C言語から効率的にポートを使用して行く手法をご紹介します。

その前に、ポートの設定方法と値の読み書きの仕方について

ポートの入出力設定方法

まずは、デバイスエディタのポート設定画面を出します。

1.まず、以下のアイコンをクリックする。

ClickDeviceEditor.gif

2.ツールバーのConfig→Interconnectを選択する。

SelectInterconnect.gif

3.右下部分のポート設定部分を確認する。

PortSetup.gif

上記画面では、一行が1ポートに対応しています。

NamePortSelectDriveInterrupt
ポート名対応ポートリソース(変更不可)ピンの内部接続ポート処理割り込みの使用
使用するポート名を選択ポートとして使用する場合StdCPU入力はHighZ使用しない場合DisableInt

Nameフィールド - ポートの役割を示す名前を設定

ポート名を設定します。スイッチ入力なら、SW_INとか、緑色LED制御出力ならLED_GREENなどお好みで決めてください。

Portフィールド - 対応ポートリソース表示

ハードとしてどのポートリソースに対応しているかが表示されています。ここは確認のみ。

Selectフィールド - ピンの内部接続選択

CPUの汎用ポートとして使用したいので、StdCPUとしましょう。

Driveフィールド - ポートの入出力方向など選択

主に使いそうなものを列挙しました。

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に以下のようなピンをアサインしたとします。

Port0bit 0出力(Strong)LED出力(L:消灯,H:点灯)
Port0bit 1出力(Strong)(他の用途で出力ポートとして使用してると仮定・現在の出力値を変更せず維持したいとします)
Port0bit 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;
};

ポート単位のdefine定義を作成する

例)ポート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になる記述が可能なのでかなり見やすくなりますね。

アクセスカウント(累計) : 12936
アクセスカウント(本日) : 2
アクセスカウント(昨日) : 1


添付ファイル: filePortSetup.gif 1000件 [詳細] fileSelectInterconnect.gif 822件 [詳細] fileClickDeviceEditor.gif 873件 [詳細]

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-02-18 (日) 20:07:46 (3926d)