Hôm nay, vì lý do họp lớp, khá nhiều bạn không đến lớp. Do vậy, chúng ta chỉ học phần PWM. Phần sample code dưới đây viết khá kĩ, các bạn kết hợp với datasheet là hiểu. Mục đích chương trình là dùng biến trở điều khiển độ sáng led ở CCP2 và CCP1:
	
	
	
		
Ngoài ra, các bạn có thể tham khảo code ở: [Thảo luận]PWM với GPIO 
Bài tập ngày hôm nay: Đọc cảm biến nhiệt độ (LM35), calib, xuất nhiệt độ môi trường ra LCD, thể hiện lên LED qua PWM (nhiệt độ càng cao, led càng sáng; calib độ nhạy lớn)
Ngoài ra, các bạn có thể tìm hiểu thêm về led RGB, Buzzer, động cơ DC, điều khiển bằng PWM.
Xong bài, các bạn nén project lại rồi nộp tới email: pif.picc5@gmail.com với cú pháp sau ở chủ đề thư:
                          
Tuần sau, 17/3, chúng ta vẫn giữ thời gian và địa điểm như cũ: 7h30 thứ bảy, 203B8. Bài học sẽ là chuẩn giao tiếp I2C, chúng ta sẽ tìm hiểu tương đối đầy đủ về I2C của PIC luôn. Yêu cầu các bạn đọc TUT và chuẩn bị mạch theo link sau:
[[[[ [[ TUT I2C ]] ]]]]
								
		Code:
	
	/****************************************************************
 *
 * www.payitforward.edu.vn
 * 
 ****************************************************************/
/****************************************************************
 *
 * PIC Training Course
 * 
 ****************************************************************/
/****************************************************************
 *
 *	Module		: ADC_PWM_on_LED.c
 *	Description	: Rotating POT to control LEDs 's Brightness through PWM
 *             Tool		: HI-TECH PIC
 *	Chip		: 16F887
 * 	History		: 09/03/2012
 *				
 *	Author		: Nguyen Tien Manh, CLB NCKH DDT 
 *				
 *
 ****************************************************************/
 
 /****************************************************************
 * IMPORT
 ****************************************************************/
#include <htc.h>
__CONFIG(XT & WDTDIS & PWRTEN & MCLREN & UNPROTECT & SWBOREN & 
		IESODIS & FCMDIS & LVPDIS & DEBUGDIS); //1st config. Word
__CONFIG(BORV21); //2st config. Word
#define _XTAL_FREQ 	4000000
/*****************************************************************
GLOBAL VARIABLE
******************************************************************/
/*****************************************************************
* ROUTINES
******************************************************************/
void port_init()
{
    TRISC1 = 0; // CCP2 is output
    TRISC2 = 0; // CCP1 is output
	TRISA0 = 1; // AN0 is input
}
void ADC_init()
{
	//AN0 is analog
	ANSEL=1;		
	//ADC conversion clock source = Fosc/8
	ADCS0=1;		
	ADCS1=0;
	// Vref = VCC = 5V
	VCFG0=0;		
	VCFG1=0;
	// Select channel 0
	CHS0=0;			
	CHS1=0;
	CHS2=0;
	CHS3=0;
	//Result formatting: Right justified
	ADFM=1;			
	// Turn on ADC module
	ADON=1;			
	__delay_ms(1); // delay for initiation of module ADC 
}
void timer2_init()
{
    // PWM Period = [PR2 + 1] * 4 * TOCS
    // PWM frequency = 5kHz => PR2 = 199
    T2CON = 0X00; // Prescale & Postscale 1:1
    PR2 = 199; // PWM period, also the maximum of CCPR1L and CCPR2L
    TMR2ON = 1; // Turn on Timer2
}
void pwm_init()
{
    CCP1CON = 0X0C; // enable CCP1
    CCP2CON = 0X0C; // enable CCP2
}
void int_init()
{
    GIE = 1;	//Global Interrupt Enable
	PEIE = 1;	//Peripheral Interrupt Enable
	ADIE = 1;	//ADC Interrupt Enable
    ADIF = 0;	//Clear ADC Interrupt Flag
}
//Interrupt service rountine
void interrupt isr()
{
    unsigned long adcres;
    if (PEIE && ADIE && ADIF)  //Determine ADC interrupt
    {
        ADIF = 0; // pull down interrupt flag
        adcres = (ADRESH<<8) + ADRESL; // convert adc result
		CCPR2L = (1023-adcres)*200/1023; // Duty clycle on CR1
		CCPR1L = (adcres)*200/1023; // Duty clycle on CR2
        GODONE = 1; //start reading adc again
    }
}
 /****************************************************************
 * MAIN
 ****************************************************************/	
 
void main()
{
	port_init();
	ADC_init();
	timer2_init();
	int_init();
	pwm_init();
	__delay_ms(1);
	GODONE = 1; //start reading adc
	while(1);
}
/****************************************************************
 * END OF ADC_PWM_on_LED.c
 ****************************************************************/Bài tập ngày hôm nay: Đọc cảm biến nhiệt độ (LM35), calib, xuất nhiệt độ môi trường ra LCD, thể hiện lên LED qua PWM (nhiệt độ càng cao, led càng sáng; calib độ nhạy lớn)
Ngoài ra, các bạn có thể tìm hiểu thêm về led RGB, Buzzer, động cơ DC, điều khiển bằng PWM.
Xong bài, các bạn nén project lại rồi nộp tới email: pif.picc5@gmail.com với cú pháp sau ở chủ đề thư:
[C5] [BT9] [N.] _Họ tên_ ...
Tuần sau, 17/3, chúng ta vẫn giữ thời gian và địa điểm như cũ: 7h30 thứ bảy, 203B8. Bài học sẽ là chuẩn giao tiếp I2C, chúng ta sẽ tìm hiểu tương đối đầy đủ về I2C của PIC luôn. Yêu cầu các bạn đọc TUT và chuẩn bị mạch theo link sau:
[[[[ [[ TUT I2C ]] ]]]]
 
				