注意: このサイトはアーカイブ化されており、内容も古くなっております。新しいサイトはhttps://fukaken.netです。よろしくお願いします。
FukakenWiki

PSoCのIO

もくじ

I/Oポート

マイコン制御で最初のステップと言えばLEDちかちか。
というわけでI/Oポートの制御をしてみます。

出力

まず出力として使用したいピンのDriveをStrongに設定します。

PSoCのIO_Select_Strong.jpg

I/Oポートを制御するときは、PRTxDRレジスタを使用します。
28ピンのPSoCであれば、ポートごとにPRT0DRレジスタ、PRT1DRレジスタ、PRT2DRレジスタがあります。

Highに駆動したい場合はピンに対応したビットを1に、Lowに駆動したい場合はビットを0にします。
ビットは最下位ビットがピン0、最上位ビットはピン7に対応します。
ここはほかのマイコンとほぼ同じですね。

ポート1の1番ピンを1秒間隔でHighとLowにトグルしたい場合は次の様に書きます。

delay_ms関数は引数msだけ待機する関数です。
自分の環境に合わせて作ってください。

入力

入力も出力と同様、使いたいピンのDriveを変更します。
デフォルトはHigh Z Analogとなっていますが、High Zに変えてください。

PSoCのIO_Select_Z.jpg

入力にもPRTxDRレジスタを使います。
PRTxDRレジスタを読むと、Highレベルになっているピンに対応するビットが1になっています。
Lowレベルも同じように0になっています。
単純ですね。

というわけでポート1の3番ピンと4番ピンの値によって
LEDの繋がれたポート1の0番、1番、2番ピンを駆動するプログラム

プルアップ&プルダウン

PSoCのI/Oの便利な機能の一つ、プルアップとプルダウン。
内部で任意のピンにプルアップまたはプルダウン抵抗を付けることができます。
これで"プルアップ抵抗を付けるスペースがない!"なんてことで悩む必要はなくなりましたね。

例のごとく、使用するピンのDriveを変更します。

PSoCのIO_Select_PullUp.jpg
PSoCのIO_Select_PullDown.jpg

普通なら、これでプルアップまたはプルダウンが設定されているように思いますが、
ここで注意しないといけないことが。
とはいえ説明はややこしいので、他人任せにさせてもらって…
Indoor airplane world PSoC lesson GPIOについてのまとめ
結論を言うと、入力の前にプルアップの時は1を、プルダウンの時は0を書き込みましょう、ということです。

上のページでも説明があるように、プルアップまたはプルダウン抵抗が外れる、という現象が起こります。
自分は毎度毎度設定しています。。。

I/O割り込み

I/Oポートの信号によって、割り込みを発生させる機能です。
これまた割り込みに設定したいDriveを変更します。

ただし、PSoCのGPIO割り込みは割り込みアドレスが1つしかありません。
つまり、どのピンが割り込み発生させても、割り込み関数は1つだけです。
割り込み関数の中で割り込みを発生させたピンを特定しないといけません。

比べてもしかたはないんですが、PICの16ビットシリーズにはGPIO割り込みと、入力変化通知割り込みがあります。
GPIO割り込みは指定の割り込みアドレスを持っており、GPIO割り込み関数を呼び出せるのは指定の割り込みピンのみです。
一方状態変化割り込みは、状態変化割り込み機能を有効化したピンすべてが割り込みをトリガすることができます。
そこで呼び出される割り込み関数は、どの状態変化通知ピンが割り込みをかけたのか、判断する処理が必要となります。

PSoCの割り込みは、PICでいう状態変化通知割り込みとほぼ同じですね。

pinoutの変更

具体的にGPIO割り込みの書き方を言うと、

PSoCのIO_Select_IntRis.jpg

例のごとくpinoutから変更します。
DriveはHigh Zか、Pull Up、またはPull Downとお好みで。
InterruptをDisableIntからFallingEdge、RisingEdge、ChangeFromReadのどれかに変更します。
読んでそのままですが、割り込みのエッジを選択するんですね。

割り込み関数の指定

pinoutの変更が終わると、一度Buildしてみてください。
すると、(プロジェクト名)\lib\Library Source Filesディレクトリの中にPSoCGPIOINT.asmが生成されているはずです。
これを開いて、

と書き足します。
↓この位置です↓


割り込み関数の記述

main.cファイルの中に、適当にプロトタイプ宣言をしてから、

と書きます。

#pragma interrupt_handler PSoC_GPIO_Intは以下の関数がGPIO割り込み関数であるということです。
内容は、割り込み設定したポート1の3番と4番ピンのどちらが割り込みを発生させたのかを特定し、シリアル通信で文字を送っています。
cprintf関数についてはまたUARTの項目で書こうと思います…

割り込みの許可

最後に、main関数内での割り込み許可を行います。

これで終了。動作確認をしてみてください。

プログラム

プログラムが支離滅裂になっちゃったんで、ひとまとめにして下に書いておきます。

+  

↓コード↓

コメント


トップ 差分リロード 一覧単語検索最終更新 ヘルプ 最終更新のRSS


Counter: 3035, today: 1, yesterday: 0
最終更新: 2012-07-10 (火) 07:41:34 (2070d)
リンク: 回路班マイコン関連(1447d) 回路班(2015d)