#include "ADconv_rx220.h"

#define KEY_PRCR 0xA500	//プロテクト解除で使用するキー 0xA5 固定
#define PRCR_CLK 0x0001	//クロック関連
#define PRCR_MOD 0x0002	//動作モード、消費電力低減機能、ソフトウェアリセット関連
#define PRCR_LVD 0x0008	//LVD関連
#define PRCR_ALL (PRCR_CLK|PRCR_MOD|PRCR_LVD)	//全て

#define PROTECTOFF		(KEY_PRCR|PRCR_CLK|PRCR_MOD)
#define PROTECTON		(KEY_PRCR)

void init_ADC (void)
{
	SYSTEM.PRCR.WORD = PROTECTOFF;	//プロテクト解除
	MSTP(S12AD) = 0x0;				//ADモジュール停止解除
	SYSTEM.PRCR.WORD = PROTECTON;	//プロテクト

	//入出力の設定
	PORT4.PDR.BYTE = 0x00;	//AD変換使用時は0に設定する
	PORTE.PDR.BIT.B0 = 0;	//AD変換使用時は0に設定する
	PORTE.PDR.BIT.B1 = 0;	//AD変換使用時は0に設定する

	//特殊機能を使用する端子の設定
	PORT4.PMR.BYTE = 0x00;	//AD変換使用時は0に設定する
	PORTE.PMR.BIT.B0 = 0;	//AD変換使用時は0に設定する
	PORTE.PMR.BIT.B1 = 0;	//AD変換使用時は0に設定する

	//特殊機能設定
	MPC.PWPR.BIT.B0WI = 0;			//PFSレジスタの保護解除をするPFSWEレジスタの保護解除
	MPC.PWPR.BIT.PFSWE = 1;			//PFSレジスタの保護解除

	//Pxx 端子機能制御レジスタ（PxxPFS）
	MPC.P40PFS.BIT.ASEL=1;
	MPC.P41PFS.BIT.ASEL=1;
	MPC.P42PFS.BIT.ASEL=1;
	MPC.P43PFS.BIT.ASEL=1;
	MPC.P44PFS.BIT.ASEL=1;
	MPC.P46PFS.BIT.ASEL=1;

	MPC.PE0PFS.BIT.ASEL=1;
	MPC.PE1PFS.BIT.ASEL=1;

	//特殊機能設定
	MPC.PWPR.BIT.PFSWE = 0;			//PFSレジスタの保護;
	MPC.PWPR.BIT.B0WI = 1;			//PFSレジスタの保護をするPFSWEレジスタの保護


	//シングルスキャンモード
	S12AD.ADCSR.BIT.ADCS = 0x00;
	
	//9,8,6,4-0をAD変換対象とする
	S12AD.ADANSA.WORD = 0x035Fu; 
}


void check_ai(void){
	//変換開始
	S12AD.ADCSR.BIT.ADST = 0x1u;
	
	//変換完了待ち
	while (0x1 == S12AD.ADCSR.BIT.ADST);
}

// 多分　0-4096
unsigned short get_ai(short ch){
	unsigned short value;	//一時保管用変数

	if( ch<0 || ch>7 )	//存在しないポートを指定した場合
		return -1;	//関数を強制終了

	value = ( ch==0 )? S12AD.ADDR0:
		( ch==1 )? S12AD.ADDR1:
		( ch==2 )? S12AD.ADDR2:
		( ch==3 )? S12AD.ADDR3:
		( ch==4 )? S12AD.ADDR4:
		( ch==5 )? S12AD.ADDR6:
		( ch==6 )? S12AD.ADDR8:
		( ch==7 )? S12AD.ADDR9:0;
	return value;
}
