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は出力だけで入力はできませんが、 |