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

Manhdd

Cố Vấn CLB
Staff member
Ngày 3/3, chúng ta đã qua phần báo cáo một vài mini project và học hết phần ADC. Code tham khảo phần này như sau:
Code:
/****************************************************************
 *
 * www.payitforward.edu.vn
 * 
 ****************************************************************/
/****************************************************************
 *
 * PIC Training Course
 * 
 ****************************************************************/

/****************************************************************
 *
 *	Module		: ADC2LED.c
 *	Description	: Display 8-bits ADC result on 8-leds connected port B
 *     Tool		: HI-TECH PIC
 *	Chip		: 16F887
 * 	History		: 06/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

/*****************************************************************
* ROUTINES
******************************************************************/
void port_init()
{
	TRISA0 = 1;		//AN0 (ADC chanel 0) is input
	TRISB = 0;
}
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: Left justified
	ADFM=0;			
	// Turn on ADC module
	ADON=1;			
	__delay_ms(1); // delay for initiation of module ADC 
}
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()
{
	if (PEIE && ADIE && ADIF) // Check if conversion is complete
       {
		PORTB = ADRESH; // Set PortB as 8-bit ADC result (8 high bits of 10-bits ADC result)
		ADIF = 0;	//Clear ADC Interrupt Flag
	}
}

 /****************************************************************
 * MAIN
 ****************************************************************/	
 
void main()
{
	port_init();
	ADC_init();
	int_init();
	while (1)
		GODONE = 1;		//start converting
}

/****************************************************************
 * END OF standard ADC2LED.c
 ****************************************************************/
Bài tập của các bạn phần này, như đã thông báo, như sau:
BT1. Đọc điện áp trên chân chạy biến trở và hiển thị lên LCD.
BT2. Đọc cảm biến nhiệt độ (đơn giản là LM35) và hiển thị nhiệt độ lên LCD.

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] [BT8] [N..] _Họ tên_ ...​

Tuần này, chúng ta vẫn giữ thời gian và địa điểm như cũ: 7h30 thứ bảy, 203B8. Mình sẽ điểm danh lần hai, và cũng là lần cuối chốt danh sách sau giữa kỳ, các bạn chú ý đi đầy đủ.

Buổi học cuối tuần này, bạn nào còn mini project thì đem lên show luôn. Bài học của chúng ta sẽ là PWMI2C. Hai phần này sẽ được rút gọn và làm trong 1 buổi. Chúng ta sẽ học coding là chủ yếu, dành thời gian cho project cuối khóa. Các bạn chuẩn bị như sau:
- PWM: đọc trước datasheet, tham khảo bài này. Đọc tập trung phần giải thuật. Phần mạch cầu H điều khiển động cơ sẽ được nói vào cuối khóa. Các bạn làm thêm một module LED RGB để thực hành điều chỉnh độ sáng. Mạch chỉ đơn giản là ANOT nối nguồn, 3 chân còn lại qua trở 1k xuống Mass. Có thể hàn qua dây bus, hàn hoặc cắm test board.
- I2C: tham khảo TUT . Chúng ta sẽ không đào sâu vào phần code I2C và các chuẩn truyền thông nữa, nên để các bạn tự nghiên cứu. Bài học sẽ chỉ nghiên cứu I2C trên lý thuyết. Bạn nào có nhiều thời gian thì làm thử mạch I2C của PIF và code thử.

Hẹn gặp các bạn vào thứ bảy.
 

Tan Sy Nguyen

Cố Vấn CLB
Staff member
Các bạn C5 làm tốt bài tập nhé. Có gì thắc mắc về phần bài học vừa rồi và khó khăn khi làm bài tập các bạn cứ lên hỏi, mọi người trên 4rum sẽ trả lời
 

nguyenhongduc_nc

Thành Viên PIF
làm sao truyền đối số cho hàm

em có 2 hàm:
Code:
void interrupt isr()
{
 int  ADC_RESULT;
if ( PEIE && ADIF && ADIE)
{
ADIF=0;
ADC_RESULT=(ADRESH<<8)|ADRESL;
ADC_RESULT=ADC_RESULT*5000/1024;
adc_lcd(ADC_RESULT);
}
}
và
void adc_lcd(int i)
{
    int a, b, c, d;       //tach hang ngan, tram, chuc, don vi
    a = i/1000;
    b = (i - 1000*a)/100;
    c = (i - 1000*a - 100*b)/10;
    d = i - 1000*a - 100*b - 10*c;
    //HIEN THI LEN LCD

    lcd_putc(a + 0x30);
    lcd_puts(".");
    lcd_putc(b + 0x30);
    lcd_putc(c + 0x30);
    lcd_putc(d + 0x30);
    lcd_puts(" V");
}
Em múốn truyền đối số ADC_RESULT cho hàm adc_lcd(int i) thì làm thế nào vậy
Em viết xong nhưng nó chạy sai nên em nghĩ vần đề là ở đây..Mong mọi người giúp đỡ
P/S:làm sao tạo dc cái khung chứa code như bạn Manhdd được vậy...như vậy sẽ dễ coi hơn..^^
 

Manhdd

Cố Vấn CLB
Staff member
Em viết xong nhưng nó chạy sai nên em nghĩ vần đề là ở đây
Sao bạn lại biết sai ở chỗ đó vậy? Bạn thử nâng ADC_RESULT thành biến toàn cục để 2 hàm dùng chung xem...

làm sao tạo dc cái khung chứa code
Khi trả lời, bạn "Đến bản đầy đủ chức năng" thì sẽ có thẻ
Code:
 

nmt2704

Trứng gà
Mạnh ơi, T7 này các lớp tự động sẽ họp lớp, chắc không đi học được đâu.
 

hloc2006

Thành Viên PIF
T7 này từ TD1 đến TD4 đều họp lớp, từ tiết 2 đến tiết 5 nên có Mạnh có điểm danh thì bỏ qua K09 nha (hình như K09 học C5 đều vô tự động thì phải ??
)
 

Manhdd

Cố Vấn CLB
Staff member
Uhm. Mình sẽ xem xét. Nếu ít bạn quá thì mình sẽ chỉ kĩ K10 về PWM.
 
Top