CCWO Embedded Space

CCWOの日々の開発を発信するブログ

Renesas RX631 I/O

つぎにI/Oの設定をしていきたいと思います。
(先にクロックの設定http://ccwo.hatenablog.jp/entry/2016/08/18/012106を行って下さい。)
I/O(Input/Output)とは、マイコンの入出力ピンのことを指します。
まずは出力設定をします。ピンよりHighを出力し、LEDを点灯させたいと思います。
Highを出力するピンは、PE1,PE0,PD7,PD6の4つを用います。
f:id:CCWO:20160818003210p:plain
回路図は上図のようになります。電流制限抵抗に1kΩを用いてLEDを駆動します。
ではこの4つのピンを設定していきましょう。
まず、hardware_setup.cにPin_initializeという関数を作り、以下のようにレジスタを設定します。

void Pin_initialize(void){
	PORTE.PDR.BIT.B1 = 1;	// LED0
	PORTE.PDR.BIT.B0 = 1;	// LED1
	PORTD.PDR.BIT.B7 = 1;	// LED2
	PORTD.PDR.BIT.B6 = 1;	// LED3
}

PORTレジスタのPDRを用いてピンを個別に出力設定に変更します。
今回のように一度しか呼ばないような場合はビット単位でレジスタにアクセスしても問題はないかと思いますが、高速で複数回呼ばれるような場合はレジスタ単位でレジスタにアクセスしましょう。
そして、この関数をHardwareSetup関数内で呼びます。

void HardwareSetup(void)
{
	Clock_initialize();
	Pin_initialize();
}

続いてメイン文にて、

#include "iodefine.h"

void main(void)
{
	PORTE.PODR.BIT.B1 = 1;    // LED0
	PORTE.PODR.BIT.B0 = 1;    // LED1
	PORTD.PODR.BIT.B7 = 1;    // LED2
	PORTD.PODR.BIT.B6 = 1;    // LED3
}

これで出力の設定ができました。
f:id:CCWO:20160818005752j:plain
LEDが4つ点灯しました。

つぎに、入力設定をします。
ピンにタクトスイッチをつなげボタンの入力を見たいと思います。
ボタンを入力するピンは、P25,P24,P23,P22の4つを用います。
f:id:CCWO:20160818010323p:plain
10kΩのプルアップ抵抗を用いて各ピンをプルアップしています。このため、ピンにはボタンが押されていないときにはHighが入力され、ボタンが押されているときはLowが入力されます。
ではさきほどの設定につづけてピンの設定をしていきます。

void Pin_initialize(void){
	PORTE.PDR.BIT.B1 = 1;	// LED0
	PORTE.PDR.BIT.B0 = 1;	// LED1
	PORTD.PDR.BIT.B7 = 1;	// LED2
	PORTD.PDR.BIT.B6 = 1;	// LED3
	PORT2.PDR.BIT.B5 = 0;	// BUTTON0
	PORT2.PDR.BIT.B4 = 0;	// BUTTON1
	PORT2.PDR.BIT.B3 = 0;	// BUTTON2
	PORT2.PDR.BIT.B2 = 0;	// BUTTON3	
}

メイン文ではまず、ボタンが押されたらLEDが光るように処理してみましょう。

#include "iodefine.h"

void main(void)
{
	while(1){
		if(!PORT2.PIDR.BIT.B2) PORTE.PODR.BIT.B1 = 1;
		else PORTE.PODR.BIT.B1 = 0;
		if(!PORT2.PIDR.BIT.B3) PORTE.PODR.BIT.B0 = 1;
		else PORTE.PODR.BIT.B0 = 0;
		if(!PORT2.PIDR.BIT.B4) PORTD.PODR.BIT.B7 = 1;
		else PORTD.PODR.BIT.B7 = 0;
		if(!PORT2.PIDR.BIT.B5) PORTD.PODR.BIT.B6 = 1;
		else PORTD.PODR.BIT.B6 = 0;
	}
}

これで入力の設定ができました。
ボタンに合わせてLEDが点灯すれば成功です!
現状ではif文を用いて処理していますが、レジスタ間を直接操作する方法のほうが効率的かと思います。
また、このままではLEDやボタンが扱いにくいので、

#define PORTE.PODR.BIT.B1 LED0
#define PORT2.PIDR.BIT.B2 BUTTON0

などでデファインや変数に入れておくなどすると操作が簡単かと思います。

20160818の記事