IOポートでLEDを光らせる

mikon H8

基本的なLEDの点灯制御

 

IOポートを使って、LEDの点灯、消灯を制御する方法です。


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目 がこのピンという意味です。

PDR1
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をつけない!

 

スポンサーリンク
  • facebook
  • twtter
  • google+
  • hatena