電子工作LEDちかちか

電子工作でLEDを制御したときのMEMO。

###使ったもの
マイコン：R5F100LE(64pin)
開発環境：CS+
デバッガ：E1エミュレータ
その他：ブレッドボード、LED7コ、抵抗7コ、ジャンパ線7本

###勘所
・今回割り当てるポートレジスタP00~P07が、マイコンボードのどこに対応するかマイコンのデータシートで確認。
・電子部品たちを組み上げる。
・CS+で今回使用するマイコンの型番を選択し、プロジェクトを作る。
・P00~P07のポートを出力に設定。
(どのポートを使って、どのLEDを光らせるかが重量。ソフトの作りやすさが大幅に変わる）
・使用するデバッグツールをRL78(E1)に設定、プロパティよりE1からマイコンへ電源供給3.3VをON。
・mainの無限ループ内でP0=0x7F;とか書いてLED全点灯するか確認。
(P0=0x03　は P0_bit0=1,P0_bit1=1 と書くのと一緒)
・インターバルタイマ100msくらいで設定。
・ウォッチドッグは止めておく
・ユーザーコードの範囲外に書いたコードは、自動生成時に消えてしまう
・マイコンボードはプチプチの上に置いておくべし。

```c:r_cg_timer_user.c

/***********************************************************************************************************************
* File Name    : r_cg_timer_user.c
* Version      : CodeGenerator for RL78/G13 V2.04.00.03 [05 May 2017]
* Device(s)    : R5F100LE
* Tool-Chain   : CCRL
* Description  : This file implements device driver for TAU module.
* Creation Date: 2019/09/14
***********************************************************************************************************************/

/***********************************************************************************************************************
Includes
***********************************************************************************************************************/
#include "r_cg_macrodriver.h"
#include "r_cg_timer.h"
/* Start user code for include. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */
#include "r_cg_userdefine.h"

/***********************************************************************************************************************
Pragma directive
***********************************************************************************************************************/
#pragma interrupt r_tau0_channel0_interrupt(vect=INTTM00)
/* Start user code for pragma. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */

/***********************************************************************************************************************
Global variables and functions
***********************************************************************************************************************/
/* Start user code for global. Do not edit comment generated here */
static signed long loopcnt = 0;
static unsigned char sts = 0;
/* End user code. Do not edit comment generated here */

/***********************************************************************************************************************
* Function Name: r_tau0_channel0_interrupt
* Description  : This function is INTTM00 interrupt service routine.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
static void __near r_tau0_channel0_interrupt(void)
{
    /* Start user code. Do not edit comment generated here */
#if 0    /* タイマ使った点滅 */
    if((loopcnt % 2) == 0){P0 = 0x7F;}
    else{P0 = 0x00;}
    loopcnt++;
#endif 
#if 0   /* 左右にウェーブ */
	if(loopcnt < 6){
	  P0 = (P0 >> 1);
	}
	else{
	  P0 = (P0 << 1);
	}
	loopcnt++;
	if(loopcnt > 11)loopcnt=0;
#endif 
#if 0   /* 中央から広がる */
	switch(loopcnt % 4){
	case 0:   P0=0x08;break;
	case 1:   P0=0x1C;break;
	case 2:   P0=0x3E;break;
	case 3:   P0=0x7F;break;
	}
	loopcnt++;
#endif 
#if 0  /* 中央から広がるPart2 */
	switch(loopcnt % 7){
	case 0:   P0=0x08;break;
	case 1:   P0=0x1C;break;
	case 2:   P0=0x3E;break;
	case 3:   P0=0x7F;break;
	case 4:   P0=0x3E;break;
	case 5:   P0=0x1C;break;
	case 6:   P0=0x08;break;
	}
	loopcnt++;
#endif
	switch(sts){
	case(0):if(loopcnt < 6){
		  P0 = (P0 >> 1);
		}
		else{
		  P0 = (P0 << 1);
		}
		loopcnt++;
		if(loopcnt > 11){
	  	  loopcnt=0;
		  sts=1;
		}
	break;
	case(1):loopcnt++;
		switch(loopcnt % 10){
		case 0:   P0=0x08;break;
		case 1:   P0=0x1C;break;
		case 2:   P0=0x3E;break;
		case 3:   P0=0x7F;break;
		case 4:   P0=0x3E;break;
		case 5:   P0=0x1C;break;
		case 6:   P0=0x08;break;
		case 7:   P0=0x10;break;
		case 8:   P0=0x20;break;
		case 9:   P0=0x40;sts=2;loopcnt=0;break;
		}
	break;
	case(2):loopcnt++;
		switch(loopcnt % 10){
		case 0:   P0=85;break;
		case 9:   P0=0x00;sts=3;loopcnt=0;break;
		default: P0=~P0;break;
		}
	break;
	case(3):loopcnt++;
		switch(loopcnt % 50){
		case 49:   P0=0x40;sts=0;loopcnt=0;break;
		default: P0 = rand() % 127;break;
		}
	break;
	}
    /* End user code. Do not edit comment generated here */
}
```

```c:r_main.c
/***************************************************************************************
/***********************************************************************************************************************
* File Name    : r_main.c
* Version      : CodeGenerator for RL78/G13 V2.04.00.03 [05 May 2017]
* Device(s)    : R5F100LE
* Tool-Chain   : CCRL
* Description  : This file implements main function.
* Creation Date: 2019/09/14
***********************************************************************************************************************/

/***********************************************************************************************************************
Includes
***********************************************************************************************************************/
#include "r_cg_macrodriver.h"
#include "r_cg_cgc.h"
#include "r_cg_port.h"
#include "r_cg_timer.h"
/* Start user code for include. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */
#include "r_cg_userdefine.h"

/***********************************************************************************************************************
Pragma directive
***********************************************************************************************************************/
/* Start user code for pragma. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */

/***********************************************************************************************************************
Global variables and functions
***********************************************************************************************************************/
/* Start user code for global. Do not edit comment generated here */
long i = 0;        
/* End user code. Do not edit comment generated here */
void R_MAIN_UserInit(void);

/***********************************************************************************************************************
* Function Name: main
* Description  : This function implements main function.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
void main(void)
{
    R_MAIN_UserInit();
    /* Start user code. Do not edit comment generated here */
    R_TAU0_Channel0_Start();
    P0=0x40;
    while (1U)
    {
#if 0 /* タイマなしで点滅 */	    
	for(i=0;i<300000;i++)
	{
        	P0=0x7F;//P0のbit0～P0のbit6を"1"　(P00～P06を"1")
	}
	for(i=0;i<300000;i++)
	{
        	P0=0x00;
	}
#endif 
    }


    /* End user code. Do not edit comment generated here */
}
/***********************************************************************************************************************
* Function Name: R_MAIN_UserInit
* Description  : This function adds user code before implementing main function.
* Arguments    : None
* Return Value : None
***********************************************************************************************************************/
void R_MAIN_UserInit(void)
{
    /* Start user code. Do not edit comment generated here */
    EI();
    /* End user code. Do not edit comment generated here */
}

/* Start user code for adding. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */
```


とりあえずはちかちかしてくれましたが
![X.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450697/a895e878-835b-adf5-3f81-7ff44bea2f48.gif)
もっとワイルドな点滅パターンをエレガントなコードで書いてみたいなあ・・