44個のLEDを動かす(GPIOx38+AIOx6)
基本ファイル
F28035templateBase
DevInit_F2803x.c
すべてのポート(マイコンの手足)をどのように使うかの設定をする。
機能としては大きく分けてINPUT/OUTPUTがある。それとピン特有の機能を持っている。
DevInit_F2803x.c:設定例PWM
DevInit_F2803x.c (line165)
//-------------------------------------------------------------------------------------- // GPIO-00 - PIN FUNCTION = GPIO Output > PWM used for U1/CN3 DC-Motor GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 1; // 0=GPIO, 1=EPWM1A, 2=Resv, 3=Resv // GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // 1=OUTput, 0=INput // GpioDataRegs.GPACLEAR.bit.GPIO0 = 1; // uncomment if --> Set Low initially // GpioDataRegs.GPASET.bit.GPIO0 = 1; // uncomment if --> Set High initially //--------------------------------------------------------------------------------------
GPIO-00のポートの機能を決定しています。
この場合は特殊機能EPWM1Aを選択しています。
DevInit_F2803x.c:設定例GPIO
DevInit_F2803x.c (line165)
//---------------------------------------------------------------------------- // GPIO-00 - PIN FUNCTION = GPIO Output > PWM used for U1/CN3 DC-Motor GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // 0=GPIO, 1=EPWM1A, 2=Resv, 3=Resv GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // 1=OUTput, 0=INput GpioDataRegs.GPACLEAR.bit.GPIO0 = 1; // uncomment if --> Set Low initially // GpioDataRegs.GPASET.bit.GPIO0 = 1; // uncomment if --> Set High initially //----------------------------------------------------------------------------
GPIO-00のポートの機能を決定しています。
この場合はGPIO設定OUTPUTで電源投入状態でlowの信号を出す、という設定になります。LEDを接続する場合はこのような設定になるでしょう。
INPUTに設定すればスイッチを読み込めようになります。
※GPIOとはGeneral Purpose Input Output の略です。
一般的なスイッチのオンオフとかに使えるポートということです。
設定から使用まで
※例題としてGPIO12にスイッチを,GPIO13にLEDをつけてみましょう。
配線は赤字枠のところを使うことになります。
配線
OUTPUTの設定
DevInit_F2803x.c (line302)
#else // GPIO-12 - PIN FUNCTION = --Spare-- GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;// 0=GPIO, 1=TZ1, 2=SCITX-A, 3=SPISIMO-B GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;// 1=OUTput, 0=INput //GpioDataRegs.GPACLEAR.bit.GPIO12 = 1;// uncomment if --> Set Low initially //GpioDataRegs.GPASET.bit.GPIO12 = 1;// uncomment if --> Set High initially //-------------------------------------------------------------------------------------- // GPIO-13 - PIN FUNCTION = --Spare-- GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;// 0=GPIO, 1=TZ2, 2=Resv, 3=SPISOMI-B GpioCtrlRegs.GPADIR.bit.GPIO13 = 1;// 1=OUTput, 0=INput GpioDataRegs.GPACLEAR.bit.GPIO13 = 1;// uncomment if --> Set Low initially //GpioDataRegs.GPASET.bit.GPIO13 = 1;// uncomment if --> Set High initially #endif
GPIO12はスイッチですから入力に,GPIO13をLEDですから出力にレジスタ設定するとこんな感じになります。
※レジスタ(GpioDataReg…)
CPU,DSPなどが持つ高速少量のメモリ、ビットの一つ一つに意味があり各種機能設定を行うことができる。
void main(void) { initNolibM(); //初期化 while(1) { if(GpioDataRegs.GPADAT.bit.GPIO12) //GPIO12がhigh levelであれば実行 { GpioDataRegs.GPASET.bit.GPIO13=1; //GPIO13をhigh level } else { GpioDataRegs.GPACLEAR.bit.GPIO13=0;//GPIO13をlow level } } }
レジスタ(GpioDataReg…)にはGPIOのポートがhigh level(2.0V以上)であれば1、Low level(0.8V以下)であれば0が入ります。
出力ポートは1を設定すれば3.3V(2.4V以上)が出力、0が設定されれば0V(0.4V以下)を出力します。
※GpioDataRegs.GPADAT.bit.GPIO1~GpioDataRegs.GPADAT.bit.GPIO30
31ポート以降はGpioDataRegs.GPBDAT.bit.GPIO31~GpioDataRegs.GPBDAT.bit.GPIO44
となるので注意
さらに
ADCポート(ADCINAx/ADCINBx)もGPIOとして利用することができます。
※利用できるのはAIO2/4/6/10/12/14だけとなります。
DevInit_F2803x.c
GpioCtrlRegs.AIOMUX1.bit.AIO2 = 1; // 0/1=enable, 2/3=disable GpioCtrlRegs.AIODIR.bit.AIO2 = 1; // 1=OUTput, 0=INput GpioCtrlRegs.AIOMUX1.bit.AIO4 = 1; // 0/1=enable, 2/3=disable GpioCtrlRegs.AIODIR.bit.AIO4 = 1; // 1=OUTput, 0=INput GpioCtrlRegs.AIOMUX1.bit.AIO6 = 1; // 0/1=enable, 2/3=disable GpioCtrlRegs.AIODIR.bit.AIO6 = 1; // 1=OUTput, 0=INput GpioCtrlRegs.AIOMUX1.bit.AIO10 = 1; // 0/1=enable, 2/3=disable GpioCtrlRegs.AIODIR.bit.AIO10 = 1; // 1=OUTput, 0=INput GpioCtrlRegs.AIOMUX1.bit.AIO12 = 1; // 0/1=enable, 2/3=disable GpioCtrlRegs.AIODIR.bit.AIO12 = 1; // 1=OUTput, 0=INput GpioCtrlRegs.AIOMUX1.bit.AIO14 = 1; // 0/1=enable, 2/3=disable GpioCtrlRegs.AIODIR.bit.AIO14 = 1; // 1=OUTput, 0=INput
使い方はメインプログラム中
ポートADCINA2を3.3Vにする
GpioDataRegs.AIOSET.bit.AIO2 =1;
ポートADCINA2をGNDにする
GpioDataRegs.AIOCLEAR.bit.AIO2 =1;
ということになります。
7segLEDを駆動するテストを行ってみました。
そのままではマイコンの出力電流が限界に来るということと、どうせならビカビカさせたかったので容量の多いトランジスタアレイを介してLEDを駆動しました。
トランジスタアレイTD62083APG秋月電商で売っています。
回路図7segled
まさに「アートワーク」な空中配線
一般的には7segLEDは専用ドライバICがあり使用するととても便利なのですが表示できるパターンが限られてしまいます。
少しIOを占有してしまいますがセグメント別々に制御するといろいろなパターンが表示できて面白いです。
プログラム
//*********************** 7 segment LED display pattern ********************* // a,b,c,d,e,f,g,dp unsigned char segmentPat[17][9]={ {1,1,1,1,1,1,0,0,0}, //0 {1,1,0,0,0,0,0,0,0},//1 {0,1,1,1,1,0,1,0,0},//2 {1,1,1,1,0,0,1,0,0},//3 {1,1,0,0,0,1,1,0,0},//4 {1,0,1,1,0,1,1,0,0},//5 {1,0,1,1,1,1,1,0,0},//6 {1,1,1,0,0,1,0,0,0},//7 {1,1,1,1,1,1,1,0,0},//8 {1,1,1,1,0,1,1,0,0},//9 {1,1,1,0,1,1,1,0,0},//a {1,0,0,1,1,1,1,0,0},//b {0,0,1,1,1,1,0,0,0},//c {1,1,0,1,1,0,1,0,0},//d {0,0,1,1,1,1,1,0,0},//e {0,0,1,0,1,1,1,0,0}//f }; unsigned char roulettePat[7][9]={ {0,1,0,0,0,0,0,1,0}, //0 {1,0,0,0,0,0,0,0,0},//1 {0,0,0,1,0,0,0,1,0},//2 {0,0,0,0,1,0,0,0,0},//3 {0,0,0,0,0,1,0,1,0},//4 {0,0,1,0,0,0,0,0,0},//5 }; //パターン表示する関数 void segDisp(unsigned char *pat) { GpioDataRegs.GPBSET.bit.GPIO34=pat[0]; //c GpioDataRegs.GPASET.bit.GPIO0=pat[1]; //b GpioDataRegs.GPASET.bit.GPIO2=pat[2]; //a GpioDataRegs.GPASET.bit.GPIO4=pat[3]; //d GpioDataRegs.GPASET.bit.GPIO6=pat[4]; //e GpioDataRegs.GPASET.bit.GPIO8=pat[5]; //f GpioDataRegs.GPASET.bit.GPIO10=pat[6]; //g GpioDataRegs.GPBSET.bit.GPIO40=pat[7]; // dp GpioDataRegs.GPBCLEAR.bit.GPIO34=~pat[0]; //c GpioDataRegs.GPACLEAR.bit.GPIO0=~pat[1]; //b GpioDataRegs.GPACLEAR.bit.GPIO2=~pat[2]; //a GpioDataRegs.GPACLEAR.bit.GPIO4=~pat[3]; //d GpioDataRegs.GPACLEAR.bit.GPIO6=~pat[4]; //e GpioDataRegs.GPACLEAR.bit.GPIO8=~pat[5]; //f GpioDataRegs.GPACLEAR.bit.GPIO10=~pat[6]; //g GpioDataRegs.GPBCLEAR.bit.GPIO40=~pat[7]; //dp } //***********************7segLED追加ここまで********************* void main(void) { int i=0; initNolibM(); //初期化 EALLOW; //各ポートの初期化(initNolibM()でされた設定に上書き) GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0; GpioCtrlRegs.GPADIR.bit.GPIO2 = 1; GpioCtrlRegs.GPAMUX1.bit.GPIO4 = 0; GpioCtrlRegs.GPADIR.bit.GPIO4= 1; GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0; GpioCtrlRegs.GPADIR.bit.GPIO6 = 1; GpioCtrlRegs.GPAMUX1.bit.GPIO8 = 0; GpioCtrlRegs.GPADIR.bit.GPIO8= 1; GpioCtrlRegs.GPAMUX1.bit.GPIO10 = 0; GpioCtrlRegs.GPADIR.bit.GPIO10 = 1; GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; GpioCtrlRegs.GPBMUX1.bit.GPIO40 = 0; GpioCtrlRegs.GPBDIR.bit.GPIO40 = 1; EDIS; while(1) { i++; GpioDataRegs.GPBTOGGLE.bit.GPIO39=1; if(sw1(ON)) { //sw1onで数字表示 if(i>15)i=0; wait(500); segDisp(segmentPat[i]); } else { //sw1offでルーレット表示 if(i>5)i=0; wait(250); segDisp(roulettePat[i]); } } //while }