[C5] Thông báo làm bài tập và học ngày 17/3: I2C

Manhdd

Cố Vấn CLB
Staff member
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:

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
 ****************************************************************/
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ư:
[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 TUTchuẩn bị mạch theo link sau:
[[[[ [[ TUT I2C ]] ]]]]
 

Tan Sy Nguyen

Cố Vấn CLB
Staff member
Như đã dặn dò, các bạn phải chuẩn bị mạch thì mới học bài này được. Các bạn cố gắng hoàn thành đầy đủ để chúng ta có 1 buổi học thật tốt. Và nhớ làm bài tập để hiểu hơn về những phần đã học, tuần này có làm mạch nên mình đã cho bài tập dễ rồi đó các bạn.
 

nguyenhongduc_nc

Thành Viên PIF
Em chưa hiểu về khái niệm calib lắm,mọi người có thể giải thích cụ thể giúp em được không
 

pkdbkhcm

Trứng gà
Mạnh ơi, bài tập có thể nộp sau được hok, tại vì gần thi giữa kì rồi nên môn nào cũng đè ra kiểm tra với làm bài tập wa trời làm bài ko kip!!! thông cảm được hok, viễn thông kì này nặng wa!!! thi giữa kì xong mình sẽ nộp bài đầy đủ!!!!
 

Tan Sy Nguyen

Cố Vấn CLB
Staff member
Bài tập ra là để các bạn hiểu hơn về bài đã học, luyện khả năng code, giải quyết vấn đề đặt ra và làm quen với các loại sensor thông dụng.Mình lên lớp thấy được thành quả các bạn làm cũng vui lây. Nếu các bạn bận quá thì có thể để bài tập làm sau, nhưng nhớ phải làm mạch để học bài I2C nhé. Tuần này sẽ học 1 buổi nữa rồi nghỉ thi giữa kì.
Buổi này nếu học tốt bài I2C, mình sẽ hướng dẫn thêm cho các bạn cách sử dụng các thư viện có sẵn của nhà sản xuất kèm theo để nhanh chóng làm quen với 1 con vxl mới
Thân
 
Top