10章 LEDをつけてみる


 

さてさて、GCCも使えるようになったし。書き込みもできるようになったし。
プログラムしてみましょうか!!
まずは液晶をつないで3Dで飛行機を…なんてことはいきなりは無理なので、
おとなしくLEDをつけるところから始めましょうか(^^;

〜LEDをつけるには〜

さてさて、今回の回路にはLEDが2つつないでありますね。
もちろんH8につないであるからには プログラムで好きなようにつけたり消したりできるわけです。
それをどうやるか。

まず、つないであるポートを見てみましょう。



LEDは適当につないだわけじゃないです。
入出力ポート っていう マイコンが電源をON・OFFしたりできる場所につないであります。
H8ー3664にはそれが30こ近くあります。
このLEDをつけるには LEDのつながってるところを5Vにすれば LEDは付きますよね?

さてさて。マイコンにはレジスタってものがあります。
マイコンから読み書きできる データの保存場所みたいなもんです。そして
レジスタの値がポートにでてきます。
…といてもわかりづらいですよね。

全部の入出力ポートは 何個かに分類されていて ポート ってものに分かれてます。
今回はLEDを ポート1の 0と1に つないであります。
ポート分けは学校のクラスみたいなもんです。
全部が 1組 とか 2組 に分けられてます。 それがポート
「1組の出席番号0番の山田君」
みたいに
「ポート1の0番目」
って感じです。
生徒の数が多い場合はこうしたほうがいいもんね。
もちろん ポート1の0とポート2の0は関係ありません。
1組の山田くんと2組の山田君が別人なのと同じです。
同じ人物だったら
「あれ!? お前1組の生徒だったの?」
「いやっ1組と2組だよ」
「・・・?」
ってなっちゃいますね。

そして回路と同じように、レジスタにも ポート1 っていうレジスタが用意されてます。8ビットのレジスタです。

例えばポート1の0のLEDをON にしたければ、ポート1レジスタの 0ビット目を1にすればいいんです。
そしたら 出力は5VになってLEDはONになります。
逆に消したければ0にすればよろしい。
「出力3V」なんていう”間”はありません。デジタルですから 0か1 0Vか5Vです。


絵にするとこんな感じ。
ポートの全てにLEDをつないで そのレジスタの各ビットを 0か1にしたら
対応した ポートが 0Vか5Vになって LEDがついたり消えたりするわけです。

全部つけたければ全部1にすればいいし。
全部消したければ全部0にすればいいし。

簡単でしょ?

〜入力か 出力か〜

さて、LEDのつけ方は分かったんですが、まだつけられません。
入出力ポート ですから 入力だってできるポートなんです。
LEDつけたければ 出力に設定しないとダメですね。


やり方は簡単です。それぞれのポートに 入力か出力か決めるレジスタがあるんです。
LEDをつけるときに似てます。0だと入力 1だと出力です。
だから、出力したいところのビットを1にすれば出力になるわけですね
ポート1の0ビット目を出力にしたければ、ポート1の0ビット目の 入力出力切り替えレジスタを 1 にすればいいんです。
早速やってみよう。

      #include <3664.h>
      
      void main(void){
      IO.PCR1=3;
      
      while(1){
      IO.PDR1.BIT.B0=1;
      }
      
      }

プログラム実行したらLEDが1つついたでしょう?
何をしてるか見てみましょう。

IO.PCR1=3;

IO.PCR1 ってのはポート1の出力・入力設定のレジスタです。
今回はポート1の0と1を出力にしたいので
00000011
って書き込みたいわけです。
そしたら 0ビット目と1ビット目が1ですから。見事に出力にできますね。
この2進数を10進数にすると 3 なので 3を書き込んだわけです。これで
IO.PCR1=00000011 ってなってます。

ちなみに IO.PCR1 ってのは構造体なんですが。
C言語に詳しくなければ細かいことは忘れてください。
ここに数字を入れれば設定ができるんです。
ちなみに ポートコントロールレジスタ1 でPCR1 です。

while(1)

は無限ループですね。
ここは知ってるものとして飛ばしますよ?

IO.PDR1.BIT.B0=1;

これがポートのレジスタです。
今回はポート1の0をつけることにするので。0ビット目を1にします。このプログラムで
IOのポート1の ビット0 が 1
って意味です。
ねっ?これでLEDがつくでしょ?

まとめると

㈰出力に設定(PCRに1を代入)
㈪実際に出力する(PDRの0ビットに1を代入)


ってことですね。
じゃあ 1ビット目につないだLEDをつけるには どうしたらいいでしょうか?
やってみてください(^^


ちなみにwhile(1)で無限にループする意味はなくって。1回1を代入したら、それは変わらないんですが
プログラムが終了しちゃうと困るんでこうしてるんです。だから

      #include <3664.h>
      
      void main(void){
      IO.PCR1=3;
      IO.PDR1.BIT.B0=1;
      while(1);
      
      }

これでもいいんですよ(^^
同じことです。

まとめ・・・

・入出力ポートには それぞれにレジスタが用意されている。
・出力するためには、そこに対応するレジスタのビットを1にする
・入力と出力を切り替えるレジスタがあるので
出力にしたければ対応するビットを1にする

 

戻る ホームへ