dsPIC I/O ボタン入力


 

前回まではLEDをつけるってことをしてきました。
LATレジスタを0にしたり1にしたりして LEDをつけたり消したりしてましたね。
では、今回は逆にマイコンにデータを入れてみましょう。
ボタンの入力です。
つまりポートが5Vか0Vかで逆にレジスタが1や0になるわけです。

〜ボタンをつなぐ〜

さてさて、ボタンをマイコンにつなぐわけですが、こんな感じに繋ぎましょう。

図のように、ポートDの9に図のような回路を接続します。
1kΩ程度の抵抗をポートにつなぎ、ポートからスイッチをGNDにつなぎます。

さて、ボタンを押したときと離したとき、ポートは何ボルトになるでしょうか?

まず、ボタンを押してない状態を考えましょう。
ボタンを押してないんですから、ボタンは無いのと一緒です。抵抗を通っているものの、
ポートは電源につながれています。

この場合、ポートの電圧は電源と一緒。電源が5Vなら5Vになるはずです。
ポートが入力モードのとき、電流はほとんど流れないので、抵抗があってもマイコンの部分は5Vなんですよ。

つぎに、ボタンを押したとき。ボタンを押すとショートしますよね。
この時ポートはGNDと同じ0Vになります。
なんでかって?ポートはGNDにつながれ、抵抗は抵抗でGNDにつながれています。
だからポートは0Vになるんです。

分かりにくい人は「ボタンにも抵抗がある」と考えましょう、ただし、小さい抵抗なので
その両端の電圧は抵抗の電圧に比べて小さいからポートはほぼ0Vになる。と考えましょう。

これでボタンを使ってポートの電圧を電源と0Vに切り替えれるようになりましたね。
さて、ここからです。次にやることは簡単です。ポートの電圧を読み取ります。
と、言ってもデジタルですから。0か1です。
電源に近い時1で、GNDつまり0Vに近い時0になるわけです。

〜実際のプログラム〜

出力の時はLATx(xってのはポートね。LATBとかLATCとか)を1にしたらポートは電源と同じ5Vになったり
0にしたら0Vになりましたよね?
今回はその逆です。ポートが5Vになったらレジスタが1に0Vにしたらレジスタが0になります。
入力の時使うレジスタはLATじゃありません。PORTになります。

#include<p30f2012.h>

void main(void){
TRISCbits.TRISC13=0;
TRISDbits.TRISD9=1;
while(1)LATCbits.LATC13=PORTDbits.RC9;

}

やってることは簡単です。
まず
ポートCの13を出力に。
ポートDの9を入力に。
しています。
レジスタに0を入れると出力、1なら入力です。
これでポートDの9は入力ポートになりました。
するとLATレジスタに何を書き込んでもポートDの9には何も変化がありません。
しかし、ポートDの9に5Vをかけたり0VをかけたりするとPORTレジスタに変化があります。

while(1)LATCbits.LATC13=PORTDbits.RC9;

ここが、重要ですね。無限ループです。
無限にLATC13にPORTD9の内容を書き込んでいます。

もし、ボタンを押したらどうなるでしょう?
ポートは0Vになりますよね?
そしたらPORTDbits.RC9は0になります。
そうなるとLATCbits.LATC13も0になります。
ボタンを離したら逆にLATC13は1です。
ボタンでLEDの光を制御できますね(^^


これがボタン入力です。
ポートの電圧を 1 と 0 で読み取るのです。

工夫すると ボタンを1回押すと LEDがついて、もう1回押すとLEDが消える とか
押している間は点滅するとか。そういったプログラムも書けると思います。やってみて(^^

まとめ

ポートの入力・・・LATに0や1を入れてポートの電圧をコントロールしていたように。
          入力モードだと逆にポートの電圧に合わせてPORTレジスタが0や1になる。

1)入力するためには TRISレジスタを1にしてポートを入力モードにする必要がある。
2)入力に使うのは LATレジスタでなくて PORTレジスタ
なんで 入力はPORTレジスタなのか?

LATは出力だけで入力はできませんが、
PORTレジスタは入力も出力もできるんです。
PORTCbits.RC13=1;
とか書けば、ポートCの13を1にして 出力になるんです

じゃあなんでLATレジスタを出力に使うのか?
それは・・・PORTレジスタって入力にも使うじゃないですか?
一回出力だったのを入力にして出力に戻すと
入力した状態が出力されません?

レジスタの中身変わっちゃいますよね
それに比べてLATレジスタなら、LATは入力はできませんから
一回入力に切り替えてもまた出力に戻したときには
最初の出力の時と同じ状態にできます。

それに性質の違いで、PORTレジスタを出力に使うと
出力に失敗することがあります。
くわしくはdsPICマニュアル11.2を見てください。

 

ホームへ