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つを用います。
回路図は上図のようになります。電流制限抵抗に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 }
これで出力の設定ができました。
LEDが4つ点灯しました。
つぎに、入力設定をします。
ピンにタクトスイッチをつなげボタンの入力を見たいと思います。
ボタンを入力するピンは、P25,P24,P23,P22の4つを用います。
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の記事