TOPMPLAB XC8編(PIC12F675)> (04)可変抵抗でLEDの明るさを制御(A/D変換,PIC12F675,XC8)> ソース

可変抵抗でLEDの明るさを制御(ソース)

 − A/D変換とPWM制御 −
(PIC12F675 XC8)

更新日2012.5.20
作成日2008.10.19


以下のソースを取り込んで、コンパイル→PIC書き込み→実行して下さい。

// ========================== ここから ==============================
//ファイル名	AD_LED.c
//作成日	2008.9.28
//更新日	2012.5.13
//作成者	mit.ueno
//バージョン	1.1
//コンパイラ	MPLAB XC8
//PIC	PIC12F675
//クロック	4MHz(INTIO)
//概要
//	A/D変換を行い、その結果で
//	GP5のLEDの明るさを変える
//	GP4のLEDは1秒毎に点滅させる
//	TMR0割り込み使用
//		clock	4MHz
//		命令	1μS
//		TMR0	256(フリーラン)
//		pre_sc	1
//		割込み	1μS×256×1=0.256mS
//使用ポート
//	GP0:VR(10K)
//	GP4:LED
//	GP5:LED

#include "pic.h"

static void pic_init();
static void wait_50uS();	// AD変換器充電待ち時間

static unsigned char Cnt32;	// 0.256*32=8.192mS
static unsigned char Cnt500mS;	// 0.256*32*61=499.7mS
static unsigned char PWM_wid;	// PWMパルス幅
static unsigned char PWM_wid_i;	// PWMパルス幅初期値
static			bit	 T500mS;


//XC8	__CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS);
__CONFIG(FOSC_INTRCIO & WDTE_OFF & PWRTE_ON & MCLRE_OFF);


// =================== 割り込み処理 ====================
static void interrupt intr(void) {
	T0IF = 0;	// TMR0割り込みクリア

	if	(!(Cnt32--)) {	// PWM 1サイクル終了
		Cnt32 = 32;
		PWM_wid = PWM_wid_i;
		if	(PWM_wid_i) {
			GPIO5 = 1;
		}
		if	(!(Cnt500mS--)) {	// 500m秒経過
			Cnt500mS = 61;
			T500mS = 1;
		}
	}
	if	(!(PWM_wid--)) {	// PWMパルス幅
		GPIO5 = 0;		// 設定
	}
}

// ==================== メイン処理 ===========================
main()	{
	pic_init();		// PICの初期化

	Cnt500mS = 61;
	T500mS = 0;

	while(1) {
		wait_50uS();		// 50uS待ち(AD充電待ち)
//XC8		GODONE = 1;		// AD変換開始
//XC8		while(GODONE) {}	// AD完了待ち
		GO_DONE = 1;		// AD変換開始
		while(GO_DONE) {}	// AD完了待ち
		PWM_wid_i = ADRESH >> 3;

		if	(T500mS) {
			T500mS = 0;
			if	(GPIO4) {
				GPIO4 = 0;
			} else {
				GPIO4 = 1;
			}
		}
	}
}

// ==================== PICの初期化 ===========================
static void pic_init() {
	CMCON = 0x07;		// コンパレータ未使用
	ANSEL = 0x11;		// 8Tosc,AN0
	ADCON0 = 0x01;		// Left,Vdd,AN0,ADON
	TRISIO = 0x0F;		// GP0-4:in,GP4,5:out
	GPIO = 0;

//XC8	OPTION = 0x88;		// プリスケーラ:無し
	OPTION_REG = 0x88;		// プリスケーラ:無し
	TMR0 = 0x00;
	T0IE = 1;		// TMR0割り込み許可
	GIE = 1;		// 全体割り込み許可
}

// =================== 50uSウェイトルーチン ===============
static void wait_50uS() {
	unsigned int cnt;
	unsigned int i;
	cnt = 2;
	for	(i=0 ; i<cnt ; i++) {
		NOP();
	}
}
// ========================== ここまで ==============================