IOポートの使用
考え方など基本は同じですので、まず Tekurobo工作室
101.PIOでLEDを光らせる(3048F.Hを使う) 見ておいてください。
わかりやすいように、ここは3048との比較も含め、同様の記述にしてみました。
うーん、やはり3664の方がI/Oポートも少なく、機能も弱いですね。
でも、コレだけの本数のI/Oがあればなかなかのことが出来るでしょう。
●I/Oポート
H8 3664 には29本、汎用入力ポートが8本がある。
ポート8は大電流ポートで LOW時に 20mA駆動可能
ポート | 機能 | PMR | PCR | PDR | PUCR |
ピン機能 切り替え |
入出力 設定 | アクセス | プルアップ | ||
PORT1 | (5bit)7Bit プルアップ | ○ | ○ | ○ | ○ |
PORT2 | 3Bit | - | ○ | ○ | - |
PORT5 | 8Bit プルアップ | ○ | ○ | ○ | ○ |
PORT7 | 3Bit | - | ○ | ○ | - |
PORT8 | 8Bit | - | ○ | ○ | - |
PORTB | (4bit)8Bit 読み取り専用 | - | - | ○読み取り専用 | - |
(注) DP-42S には P11-P12 PB4/AN5 - PB7/AN7 端子はありません とある。
ということで、 AKI-H8 3664DIP版 には 上記の端子はないので ( )内の数となります
【レジスタの簡単な説明】
LCDを点灯させるには、ピンを入出力の機能として
データ、出力ポートとして使いますが、その他にもレジスタの切り替え設定で他の機能に使えるピンもある。その機能や種類など。
PMR ポートモードレジスタ
同じピンでも、他の機能と兼用になっているピンがあります。
その切り替えをこのレジスタで設定します。
入出力ポート : 0
その他の端子に使う : 1
(何も設定しないと(デフォルト) : 0)
PCR ポートコントロールレジスタ
I/Oポートで、入力か出力かを設定します
出力:1
入力:0
(何も設定しないと(デフォルト) : 0)
PDR ポートデータレジスタ
データのやり取りをするポートです。
(何も設定しないと(デフォルト) : 0)
PUCR ポートプルアップコントロールレジスタ
PORTを入力に設定したときに、プルアップ抵抗を付けるか、付けないかを設定するためのレジスタです。
プルアップする :1
しない :0
(何も設定しないと(デフォルト) : 0)
実験回路図
ポート1の2つのピンにLEDをつなげて、プログラムで操作してみます。
3664基板上の CH2の ピン20,21 に 1.5KΩの抵抗でLEDを接続します。
明るく点灯させるなら、多くの電流を流せるポート8を使用すべきでしょうね。(下記参照)
シンク電流とソース電流
この回路のようにピンから出力する電流をソース電流と呼びます。
マイコンから出力できるこのソース電流には限りがあり、数mAしか流せません。--> 2mA
反対に0Vにしてピンに吸い込む電流をシンク電流と呼びます。これももちろん制限があり数mAしか流せません。
シンク電流はポート8だけ多めの電流が吸い込めるようです。
ポート8 : 20mA
ポート8以外 : 2mA
定格電流は少々オーバーしても長時間つけっ放しにするような使用でなければ問題ない程度ですが、
LEDの代わりにモーターなんて直接接続しても絶対に回せませんから、十分このことを注意しておいてください(最悪マイコンが壊れます)
●実際のI/Oポート
ポート1は基板上のどのピンになるかというと、秋月3664付属の回路図を見てください。(または基板ピン配置表))
CN2 の 20~23ピン CH1 の 20ピン を見ます。
CH2では
基板上のピン番号 | ピン名称 |
23 | P17/IRQ3/TRGV |
12 | P16/IRQ2 |
11 | P15/IRQ1 |
20 | P14/IRQ0 |
たとえば、基板上の20番ピン は P14/IRQ0 とあるので、
20番ピンは
I/Oポートの P14 または 割り込み機能のIRQ0
のどちらかに使用できます。(P14 は ポート1の4Bit目 がこのピンという意味です。)
これをレジスタの設定で、どちらかに使用か選択します(下で説明)
プログラム
PIO1.c
#include <3664.h>
void msecwait(int msec)
/*なにもしない時間稼ぎ関数*/
{
int i,j;
for (i=0; i msec; i++) {
for (j=0;j<1588;j++); /*1588は約1/1000s*/
}
}
void main()
{
IO.PMR1.BYTE=0x00; /* 全て0にセットし、ポート使用に設定 0000 0000*/
IO.PCR1=0xFF; /* 全て1にセットし、出力に設定 1111 1111 */
/* PCRレジスタは IO.PCR1.BYTE 記述でない!*/
IO.PUCR1.BYTE=0x00; /* 全て0にセットし、プルアップなし*/
while (1) {
IO.PDR1.BIT.B4=1; /* P14--pin20 */
IO.PDR1.BIT.B5=0;
msecwait(500);
IO.PDR1.BIT.B5=1; /* P15--pin21 */
IO.PDR1.BIT.B4=0;
msecwait(500);
}
}
①I/Oポートの初期化設定
- pin20 21 - P14/IRQ0
- まず、20、21番ピンはそれぞれ I/OポートのP14、P15 または 割り込み機能のIRQ0、IRQ1 のどちらかに使用できます。
- P14/IRQ0、P15/IRQ1
- このどちらの機能に使用するかは PMR ポートモードレジスタ で設定
全てポートとして使用するので - PMR1レジスタは全て0に : IO.PMR1=0x00
- ポートとして
- 入力、出力どちらの設定にするか PCR ポートコントロールレジスタ
全て出力に使用するので PCR1レジスタは全て1に
IO.PCR1=0xFF - プルアップ機能を使うかを PUCR ポートプルアップコントロールレジスタ
- プルアップ使用しないので PUCR1レジスタは 全て0に
②プログラムでのI/Oポートへのアクセス
実際のピンの状態を プログラム上で PDR ポートデータレジスタでプログラムからアクセスするようになります。 P14 では ポート1の4Bit目 がこのピンという意味です。
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Data | 0 | 0 | 0 | 1 | - | - | - | - |
2通りの記述が出来ます-- ビットアクセス、バイトアクセス
- ビット入力
- ピン20(P14→ポート1の4ビット) を 1にする(5V出力)
IO.PDR1.BIT.B4=1
ピン21(P15→ポート1の5ビット) を 0にする(0V出力)
IO.PDR1.BIT.B5=0 - バイト入力
- 0-3BITはありません(機種依存)--0にする
ピン20(P14) を 1にする(5V出力)、 ピン21(P15) を 0にする
(0V出力)
IO.PDR1.BYTE=0x10 (0001 0000)
PDRレジスタは、バイト入力、ビット入力共に記述出来ます
③なにもしない時間稼ぎ関数
無駄ループを回して、空白時間を作ります。
実行結果
プログラムを実行すると ピコピコと2個のLEDが交互に点滅します。
間隔を変えるのは msecwait(500); の500の数字を変更します。
まとめメモ
I/O関連レジスタは 4つ
(* ポートによっては2つだけのものもある 表参照)
PMR PCR PUCR PDR
- IO初期設定に3つ
- PMR PCR PUCR
- データアクセスに1つ
- PDR
回路図上では
基板上のピン番号 機能 で記述されている
例) 13 P84/FTIOD (P84はポート8の4Bit目の意味)
P84/FTIOD / 記号はそのピンでは機能が兼用されている
- PMR → そのどちらを使うかPMR で選択
例) IO.PMR1.BYTE=0x0c - PCR PCRレジスタで ピンの入出力設定 →出力:1 入力:0
例) IO.PCR1=0x0c(PCRには.BYTEをつけない! ) - PUCR PUCR でプルアップ設定 → プルアップする:1 しない:0
例)IO.PUCR1.BYTE=0x0c 設定レジスタはバイト入力だけにする
IO.PCR1= だけは.BYTEをつけない!
- twtter
- google+
- hatena