第四章 続まぁとりあえずやってみよう
![]()
では前回のプログラムが どんな意味なのかを説明します
・・・と思ったけど その前に予習
〜ポート〜
LIST P=PIC16F84A BSF 03H,5 CLRF 06H BCF 03H,5 MOVLW 0FFH MOVWF 06H END |
これですね これを実行すると PICにつながれた LEDがすべてついたわけです
だからこれには
「PICの I/Oポート(電気を流したり止めたり出来る)の?ピンから ?ピンまで 全部電気を流す」
というプログラムです
つまり PICのI/Oポート(電気を流したり止めたりとできるピン) を出力にして 電気を流したわけですが
6番ピン 8番ピン のように I/Oは全てバラバラになっているのではなく グループに分けられています
それが ポート と呼ばれるものです
| 〜PIC16F84Aのポート〜 PIC16F84A には ポートA と ポートB があります ポートAには ポートAの0(PICの17番ピン)〜ポートAの4(3番ピン) まで5つ ポートB はポートBの0(6番ピン)〜 7(13番ピン) の8つあります これがPIC16F84Aの外観と ピンの機能が書いてある図ですが RAというのはポートA(赤色の部分) RBというのはポートB(紫色の部分)です こんな風に I/Oは ポートA と ポートBに分かれています だからもし PICの6番ピン(RB0)に 電気を流したかったら 「I/Oの6番ピンに電気を流す」 ではなくて 「ポートBの0に電気を流す」 というプログラムになるわけです |
上のプログラムを実行した回路は LEDが8個ありましたが これは全て ポートBのピンにつながれています
そしてプログラムで ポートBの全てのピンに 電気を流すようにしたので ポートBの全てのピンに電気が流れ
LEDが全てついたわけです
あと I/Oというぐらいですので この ポートA ポートB の全部のピンは
電気を流したり止めたり出来る 出力モード
電気が流れているのか 流れてないのか 調べられる 入力モード
の2つのモードがあるわけですが このモードの切り替えも する必要があります
だから ポートBを全部出力する(電気を流す)ためには
ポートBを全部出力モードにする → 全てのピンを出力にして電気を流す
というプログラムが必要なわけです
〜レジスタ〜
では どうやって 出力モードにしたり ポートBの全てに電気を流したりするのかというと
これには レジスタを操作します
レジスタとは プログラムで使う メモリーのことです PICの中に入っています
コンピューターにとってのメモ帳です
レジスタはPICによりますが60個とか たくさんあります
そのPICのレジスタ 1つ1つが全部2進数の8ビットです(2進数については 進数とは?で)
つまり 10101 の0や1が 8こということです
00000000 や11111111 や10001101 です こんな風に 0か1か のデータが8つしまえます
ちなみに この1つのデータ 0か1かを 1ビット といいます これが8個あるので 8ビットです
PICのレジスタは全部8ビットです
ちょうど ポートBが8個なので 1ビットが 1つのピンになっています(分かりにくいけど 後で説明する)
〜レジスタへのアクセス〜
| バンク0 | バンク1 | ||
| 00 | Indirect Addr | Indirect Addr | 00 |
| 01 | TMR0 | OPTION | 01 |
| 02 | PCL | PCL | 02 |
| 03 | STATUS | STATUS | 03 |
| 04 | FSR | FSR | 04 |
| 05 | PORTA | TRISA | 05 |
| 06 | PORTB | TRISB | 06 |
| 07 | 07 | ||
| 08 | EEDATA | EECON1 | 08 |
| 09 | EEADR | EECON2 | 09 |
| 0A | PCLATCH | PCLATCH | 0A |
| 0B | INTCON | INTCON | 0B |
| 0C | 凡用レジスタ | ||
| ・・・ | |||
| 4F | 凡用レジスタ |
これがPIC16F84A のレジスタ一覧です
レジスタには STATUS のように 名前がついているのがありますが
PICに 「STATUSの内容を00000000にして」といっても 分かりません
レジスタは まるで引出しのいっぱいある机のようなものです
上のレジスタの表を見れば 分かると思います
だから 「消しゴムを取って」 といっても 消しゴムがどこに入っているのか分からなければ 消しゴムは取れません
だから 「上から3番目の引き出しにある 消しゴムを取って」 と場所をいわなければなりません
同じようにレジスタも STATUS と名前はついていても これは人間がつけた名前なのでPICにはわかりません
レジスタは 引出しがたくさんある と言いましたので これも消しゴムの時みたいに 「上から3番目」のように
場所を教える必要があります この場所が アドレス と言うものです
上のレジスタ一覧表に レジスタには番号があると思います この番号がアドレスです
たとえば STATUSは03 つまり 03 が STATUSのアドレス 住所なのです
だから 「STATUSを00000000」といっても PICには ”STATUS” が分からない
そこで 「03を00000000」 とすれば分かります
〜設定の出来るレジスタ〜
このレジスタには ただデータを保存するのでなく ポートBの出力か入力かを設定したり
実際にポートBから電気を流したり パソコンと通信するときの通信速度を決めたり
などの 設定をするためのレジスタがあります
| バンク0 | バンク1 | ||
| 00 | Indirect Addr | Indirect Addr | 00 |
| 01 | TMR0 | OPTION | 01 |
| 02 | PCL | PCL | 02 |
| 03 | STATUS | STATUS | 03 |
| 04 | FSR | FSR | 04 |
| 05 | PORTA | TRISA | 05 |
| 06 | PORTB | TRISB | 06 |
| 07 | 07 | ||
| 08 | EEDATA | EECON1 | 08 |
| 09 | EEADR | EECON2 | 09 |
| 0A | PCLATCH | PCLATCH | 0A |
| 0B | INTCON | INTCON | 0B |
| 0C | 凡用レジスタ | ||
| ・・・ | |||
| 4F | 凡用レジスタ |
これはPIC16F84Aのレジスタ一覧です
いろいろな設定用のレジスタがあるのが分かると思います
| 〜バンク(Bank)〜 レジスタは バンク0と バンク1の2種類に分けられています(PIC16F84Aでは) バンク1のレジスタを読み書きしたいときには プログラムで バンク1に切りかえる必要があります そうすると バンク1のレジスタを読み書きできます そのかわり バンク0のレジスタには読み書きできなくなります このバンクの切り替えは STATUS というレジスタで出来ます STATUSレジスタの5ビット目がバンクの切り替えの設定ビットで 00000000 の赤色の部分で操作できます これが 00000000 と0なら バンク0。 00100000 と1なら バンク1を操作できるようになります |
ここで ポートBを 出力か 入力かに切り替える ものは バンク1にある
TRISB です
これの 0か1かで 出力か入力かを指定できます
レジスタのビットは そのままポートのピンに対応してます
| TRISB | 7ビット | 6ビット | 5ビット | 4ビット | 3ビット | 2ビット | 1ビット | 0ビット |
| ポートB | ポートBの7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
なので TRISB の 7ビット目を 入力にすると ポートBの7が 入力モードになり
ポートBの7に電気が流れているのかどうか 調べることが出来るようになります
ちなみにTRISBは 0なら出力 1なら入力ですので
TRISBを 00000000 と 全て0 にすると ポートBのピンは全て出力になります
そして 実際に出力させるのは バンク0にある PORTBです
TRISBで全て出力モードになっていても これで 出力させないと 電気は流れません
これも PORTBの ビットと ポートBのピンは TRISB のように対応しています
PORTBの 7ビットを 出力にすると ポートBのピン7に 電気が流れます
ちなみに 1で出力 0で電気が流れなくなります
だから PORTBを 00100100 とすると ポートBは 00100100 となる
| 7ビット/7ピン | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| PORTB | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
| ポートB | 流れない | 流れない | 流れる | 流れない | 流れない | 流れる | 流れない | 流れない |
のようになるわけです ポートBの全てのピンに電気を流したかったら
PORTBを 11111111と 全て出力にすれば ポートBが全て出力になって電気が流れて LEDがつきます
〜まとめるとね〜
つまり ポートBにつながれた LEDを全てつけるには
TRISBで ポートBを出力にして PORTBで出力させる必要があります
さらに バンクの切り替えをするので こうなります
| その1 | バンク1に切り替え(STATUSを 00100000 にする) |
| その2 | TRISBを全て出力にする(00000000 にする) |
| その3 | バンクを0に戻す(STATUSを 00000000 にする) |
| その4 | PORTBを全て出力にする(11111111 にする) |
と こう言う風にすれば
ポートBの全てに電気が流れ LEDが全部つくことになります
| まとめ ポート・・・ PICでI/Oをまとめるもので PIC16F84AにはポートAとポートBがある そして A も B も全てのピンが 入力モードと 出力モードの2つのモードがある レジスタ・・・ PICの中にあって 03や06 4C などのように 数字で読み書きできるもの 8ビットで 00000000 と データが保存できる(読んだり書きこんだり出来る) PIC16F84Aでは レジスタはバンク0とバンク1に分けられている レジスタはただデータを保存するのでなくて ポートの入出力のモード切り替えをしたりと 専門の設定用のレジスタがある 例えばポートBの入出力モードの切り替えは バンク1の 06にある TRISB |