Trao đổi về bài tập I2C

pipoit

Thành Viên PIF
giúp em lỗi này với mấy bác ơi!
Error [1091] C:\Program Files\HI-TECH Software\PICC\9.81\sources\float.c; 86. main function "_main" not defined
 

2death

Cố Vấn CLB
Staff member
giúp em lỗi này với mấy bác ơi!
Error [1091] C:\Program Files\HI-TECH Software\PICC\9.81\sources\float.c; 86. main function "_main" not defined
Chưa add main.c vào source files?
 

eMagic

Gà mẹ
Staff member
Đây là code cho bài tập hôm nay, các anh chị và các bạn chỉnh sửa hộ:
Code:
//=================================================================================================//
//                  BAT THIET BI KHI DUNG GIO DA DUOC CHINH TRUOC DO							   //
// Dung 1 nut bam de chon che do thiet lap time, chuyen sang gio roi phut va tro ve binh thuong sau//
//														moi lan thuc hien bam button			   //
// Dung Volume de tang hoac giam gio phut tuong ung voi mode ma button da chon					   //
/////////////////////////////////////////////////////////////////////////////////////////////////////
// 			Date: 19/03/2011	: 18:40										Code by: eMagic		   //
//=================================================================================================//
#include <htc.h>
#include <stdio.h>
#include "i2c.h"
#include "lcd.h"

__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DUNPROTECT & BORDIS & IESODIS & FCMDIS & LVPDIS);

#define _XTAL_FREQ 4000000
#define SLAVE_ADD 0x68
#define READ	1
#define WRITE	0

unsigned char 	time[7];
unsigned char 	c[14];
int				time_mode=0;
unsigned char	h_set,m_set;
//===============================All Function and procedure here========================
	void 			set_time();								//set first time for DS1307						
	void 			read_time();							//read to Pic
	void 			Display(char b[]);						//display Time for now
	void 			dis_settime_run(char HH,char MM);		//display Time for setting
	void			read_setup();							//read value from ADC and change to hour or minute
	void			port_init();							//
	void 			interrupt isr();						//
	unsigned int 	ReadADC();								//
	void 			init_all();								// first setup for all
	void			check_open_load();						//check to open load if right time set
//=======================================Main ===========================================
void main(void)
{	
	init_all();

	while(1)
	{
	read_time();
	check_open_load();
	Display(time);
	__delay_ms(100);
	__delay_ms(100);
	}
}
//=========================================end main======================================
void set_time()
{
	//Send Start condition
	i2c_start();
	//Send Slave address + WRITE command
	i2c_write((SLAVE_ADD<<1)|WRITE);
	//   ((SLAVE_ADD<<1)| WRITE) = ((0x68<<1)|0) = 0xD0
	//Send register address (register of Slave – the first register need to read data)
	i2c_write(0x00);//resister first
	i2c_write(0x00);//set second
	i2c_write(0x00);//set minute, auto register ++ (0x01)|
	i2c_write(0x10);//set hour
	i2c_write(0x07);//set day
	i2c_write(0x19);//set date
	i2c_write(0x03);//set month
	i2c_write(0x11);//set year
	i2c_stop();
}

void read_time()
{

	int i;
		//Send Start condition
	i2c_start();
	//Send Slave address + WRITE command
	i2c_write((SLAVE_ADD<<1)|WRITE);
	//   ((SLAVE_ADD<<1)| WRITE) = ((0x68<<1)|0) = 0xD0
	//Send register address (register of Slave – the first register need to read data)
	i2c_write(0x00);									//resister first
	i2c_stop();
	i2c_start();										// reset to read data form DS1307
	i2c_write((SLAVE_ADD<<1)|READ);
	for (i=0;i<6;i++)
		{
			time[i]= i2c_read(0); 						//second to time[0],...
		}
	time[6]= i2c_read(1); 								//read year and finish read
	i2c_stop();											//end read
}

void Display(char b[])
{   
	int i,j=0;
	// Luu y: ket qua doc tu RTC DS1307 la so BCD
	// Vi du: 24giay --> Ket qua doc ve la: 0x24
	// Nen phai tach chu so "2" va so "4" rieng ra de hien thi

	// tach bcd tu mang b, luu vao mang c -------------------------//
			for(i=0;i<7;i++)
					{										
					// mang c chua cac gia tri ascii, 14 bytes				
						// tach BCD, lay nibble cao 
						c[j]=b[i]/16+0x30;
						// lay nibble thap
						c[j+1]=(b[i]-(c[j]-0x30)*16)+0x30;		
						j+=2;
					}


	//--------------- hien thi tren lcd  ---------------------------//

			lcd_clear();
			lcd_puts("Thu ");
			lcd_putc(c[7]);			// thu trong tuan
			lcd_puts(", ");
			lcd_putc(c[8]);			// ngay
			lcd_putc(c[9]);
			lcd_puts("/");
			lcd_putc(c[10]);		// thang
			lcd_putc(c[11]);
			lcd_puts("/");
			lcd_putc(c[12]);		// nam
			lcd_putc(c[13]);
			//lcd_puts("\r\n"); 		// xuong hang
			lcd_gotoxy(0,1);
			
			lcd_puts("  ");
			lcd_putc(c[4]);			// gio
			lcd_putc(c[5]);
			lcd_puts(" : ");
			lcd_putc(c[2]);			// phut
			lcd_putc(c[3]);				
			lcd_puts(" : ");
			lcd_putc(c[0]);			// giay
			lcd_putc(c[1]);
}

void 	dis_settime_run(char HH,char MM)
{
	char	i,j,l,k;
		lcd_clear();
		lcd_puts("Moi ban thiet cai dat gio mo Device:");
		lcd_gotoxy(0,1);
						i=HH/10+0x30;
						j=HH%10+0x30;
						l=MM/10+0x30;
						k=MM%10+0x30;

				lcd_gotoxy(4,1);
				lcd_putc(j);
				lcd_putc(i);
				lcd_putc("/");
				lcd_putc(k);
				lcd_putc(l);
		//blink hour_set on LCD
				for(i=0;i<6;i++)__delay_ms(100);
		if(time_mode==1)
			{
				lcd_gotoxy(4,1);
				lcd_puts(" ");
				lcd_puts(" ");
				lcd_gotoxy(5,1);
				for(i=0;i<6;i++)__delay_ms(100);
			}
		//blink phut_set on LCD
		else if(time_mode==2)
			{
				lcd_gotoxy(7,1);
				lcd_puts(" ");
				lcd_puts(" ");
				lcd_gotoxy(8,1);
				for(i=0;i<6;i++)__delay_ms(100);
			}
}

void	read_setup()
{
	int temp;
	while	((time_mode==1)||(time_mode==2))			//
		{
				temp=ReadADC();
				if (time_mode==1)	h_set=temp%43;  	//moi gio ung voi tang 43 gia tri temp*24/1024
				if (time_mode==2)	m_set=(temp*10)%171 ; 	//moi phuttang tuong ung voi 17.1
				dis_settime_run(h_set,m_set);
		}
}
void	port_init()
{
	  unsigned char i=0;

	TRISE = 0b11111101;	//output portE.1
	PORTE = 0;			//first value

	//================================Set Up ADC=================================//

 	ANSEL=0xFF;			// NGO VAO ANALOG
 	ADFM=1;   			// KET QUA LAP DAY BEN PHAI 
  	VCFG1=0;  			// TAM TOAN THANG=5V
  	VCFG0=0;
  	ADCON0=0b00001111;	// Fs=Fosc/2...CHON KENH AN3...BAT ADON
  	TRISA3=1; 
  	ADRESH=0x00; 
  	ADRESL=0x00;
  	for(;i<10;i++) 
		__delay_ms(100);// cho khoi dong module ADC 
	
	//==============================end set up ADC===============================//
	//=============================Set Up EXT interrup===========================//
	INTEDG = 0;			//chon che do ngat 
	INTF = 0;			//xoa co ngat ngoai
	INTE = 1;			//cho phep ngat ngoai
	GIE = 1;			//cho phep ngat toan cuc
	//===============================end set up ext interrup=====================//
}

void interrupt isr()
{
	if(INTE && INTF){
		time_mode++;					//mode ==1 to set hour,==2 to set minute,==0 normal, no_setting
		if(time_mode==3) time_mode=0;
		read_setup();
	}
}

unsigned int ReadADC()
{
	__delay_us(5);
	GODONE = 1;
	while(GODONE);
	return (((unsigned int)ADRESH)<<8)|ADRESL;
}

void init_all()
{
	int i;
	port_init();					//IO init
	i2c_init();						//I2C init
	lcd_init();						//lcd init
	__delay_ms(150);
	set_time();						//set first time by code
	lcd_puts("Hello, ...");
	__delay_ms(150);
	lcd_puts("My name is Didital Clock");
	for (i=0;i<7;i++)
		__delay_ms(150);
}

void	check_open_load()
{
	char	temp_m,temp_h,i,j;
							//lay gia tri phut hien thoi de so sanh
							i=time[1]/16;
							j=(time[1]-i*16);
	temp_m=i*10+j;	
							//lay gia tri gio hien thoi de so sanh
							i=time[2]/16;
							j=(time[2]-i*16);
	temp_h=i*10+j;
	if((m_set==temp_m)&&(h_set==temp_h)) RE1=1;
}
Mình viết xong nhưng vừa mới built lần cuối thì mplab cũng hok co buit nữa, đang đâu đầu đây.
 
giúp mình cái code này với. sao nạp mà nó không thực hiện đúng. đã biên dịch ok. nhưng kết quả lại không đúng
Code:
/****************************************************************
*
* Module : main.c
* Description : INT0 / PORTC toggle
* Tool : HI-TECH PIC
* Chip : 16F887
* History : 27/11/2010
* 
* Author : nguyen khac phuong tuan, CLB NCKH 
* Hardware notes :
* - Hardware: PORTC connect LEDs.
* - RB0 connect with a button: Normal-1 Press-0
****************************************************************/
 
 
/****************************************************************
* IMPORT
****************************************************************/
 
#include <htc.h>
#include"i2c.h"
#include"lcd.h"
__CONFIG(XT & WDTDIS & PWRTEN & MCLREN & UNPROTECT & DUNPROTECT & BORDIS & IESODIS & FCMDIS & LVPDIS);
__CONFIG(BORV21);
#define _XTAL_FREQ 4000000
#define SLAVER_ADD 0x68
#define READ 1
#define WRITE 0
char b[6];
/****************************************************************
* EXTERN
****************************************************************/
 
/*none...*/
 
/*****************************************************************
GLOBAL VARIABLE
******************************************************************/
 
/*none...*/
 
/*****************************************************************
* ROUTINES
******************************************************************/
 
/* -- void init_port(void) --------------------------------------
* 
* Description : disable all analog pins, init PORTC as output . 
* Parameters : none
* Return : don't care
*/
void init_port(void)
{
ANSEL = 0; //AN[0-7] are digital pins
ANSELH = 0; //AN[8-13] are digital pins
TRISB = 0x00; //PORTC is output
PORTB = 0xFF; //Turn on Leds 
} 
 
void Display()
{ 
    int i,j=0;
    char c[];
    // Luu y: ket qua doc tu RTC DS1307 la so BCD
    // Vi du: 24giay --> Ket qua doc ve la: 0x24
    // Nen phai tach chu so "2" va so "4" rieng ra de hien thi
 
    // tach bcd tu mang b, luu vao mang c -------------------------//
            for(i=0;i<7;i++)
                    {                                        
                    // mang c chua cac gia tri ascii, 14 bytes                
                        // tach BCD, lay nibble cao 
                        c[j]=b[i]/16+0x30;
                        // lay nibble thap
                        c[j+1]=(b[i]-(c[j]-0x30)*16)+0x30;        
                        j+=2;
                    }
 
 
//--------------- hien thi tren lcd ---------------------------//
 
            lcd_clear();
            lcd_puts("Thu ");
            lcd_putc(c[7]);            // thu trong tuan
            lcd_puts(", ");
            lcd_putc(c[8]);            // ngay
            lcd_putc(c[9]);
            lcd_puts("/");
            lcd_putc(c[10]);        // thang
            lcd_putc(c[11]);
            lcd_puts("/");
            lcd_putc(c[12]);        // nam
            lcd_putc(c[13]);
            //lcd_puts("\r\n");         // xuong hang
            lcd_gotoxy(0,1);
 
            lcd_puts(" ");
            lcd_putc(c[4]);            // gio
            lcd_putc(c[5]);
            lcd_puts(" : ");
            lcd_putc(c[2]);            // phut
            lcd_putc(c[3]);                
            lcd_puts(" : ");
            lcd_putc(c[0]);            // giay
            lcd_putc(c[1]);
}
void set_time()
{
    i2c_start();
    i2c_write(SLAVER_ADD<<1|WRITE);
    i2c_write(0x00);
    i2c_write(0x56);
    i2c_write(0x17);
    i2c_write(0x15);
    i2c_write(0x07);
    i2c_write(0x19);
    i2c_write(0x03);
    i2c_write(0x11);
    i2c_stop();
}
void read_time()
{
    i2c_start();
    i2c_write(SLAVER_ADD<<1|WRITE);
    i2c_write(0x00);
    i2c_stop();
    i2c_start();
    i2c_write(SLAVER_ADD<<1|READ);
    b[0]=i2c_read(0);
    b[1]=i2c_read(0);
    b[2]=i2c_read(0);
    b[3]=i2c_read(0);
    b[4]=i2c_read(0);
    b[5]=i2c_read(0);
    b[6]=i2c_read(1);
    i2c_stop();
 
}
 
/****************************************************************
* MAIN
****************************************************************/ 
 
/* -- void main (void) -----------------------------------------
* 
* Description : INT0 Interrupt control. 
* Parameters : none
* Return : don't care
* Notes : 
*/
 
void main(void)
{ 
    init_port();
    lcd_init();
    i2c_init();
    __delay_ms(150);
    set_time();
    __delay_ms(150);
 
    while(1)
{
    read_time();
    Display(b);    
}
}
 

2death

Cố Vấn CLB
Staff member
Các bạn post code để sửa phải post kèm theo error / mô tả tình trạng mạch chạy sai như thế nào để mọi người dễ tìm chỗ sai mà sửa giúp các bạn.

- Bạn eMagic: báo lỗi gì?
- Bạn Phương Tuấn: Hàm void Display() của bạn không có đối số truyền cho nó.
Còn trong hàm main bạn gọi hàm này thì lại là: Display(b);
Bạn sửa lại xem sao.
 

eMagic

Gà mẹ
Staff member
eMagic hok biết nữa, chương trình đang dịch là nó out luôn à, em cài lại thị vẫn bị, hix
 
đã thử hết cách rồi chị ơi. khai báo thế nào nó cũng không truy xuất được từ ds1307 về.em đang nghĩ là con đó bị đai. nhưng rút 2 chân dsa va scl ra thì lcd đứng nghĩa là nó không thể giao tiếp được với ds1307. nên em nghĩ nó vẫn không sao. nhưng lại không chay đúng được.mặc dù ở hàm void read_time() em dùng biến khác là biến toàn cục để nhận giá trị từ ds1307 về còn hàm dislay() em khai bao đối số luôn rồi dislay(char b[]), và trong main em gọi hàm dislay với đối số là biến của hàm read_time().
 

2death

Cố Vấn CLB
Staff member
Bài của eMagic trước tiên là lỗi chính tả, ví dụ dòng này:
unsigned int ReadADC()
{...
return (((unsigned int)ADRESH)<<8)|ADRESL;
}
Không biết còn chỗ nào sai nữa không.

Ngoài ra, thứ tự sắp xếp các chương trình con, nhất là phần init hơi lộn xộn, bạn kiểm tra lại kĩ xem sao.
 

eMagic

Gà mẹ
Staff member
đã sửa được trình biên dịch và nó thông báo là :
Error [192] E:\BK\Club\Code\I2C\bai1.c; 229.1 undefined identifier "GODONE"
 
sao đến giờ vẫn chưa có ai viết thành công ah. ai viết thành công rồi thì đưa lên cho mọi người tham khảo với.
 
phương diện nào cũng được mình đang cần một đoạn code để tes thử cái mạch của mình. code mình viết đến giờ chạy vẫn chưa được, nên cũng không biết mạch có vấn đề hay là do code. nghĩ mãi cũng không ra
 

eMagic

Gà mẹ
Staff member
Hiện ngày giờ lên LCD thì dễ, bạn coppy của mình xuống, lấy các hàm set_time() , read_time(), display(char b[]), là dùng được, bạn nhớ init LCD, I2C.
 

eMagic

Gà mẹ
Staff member
Tình hình là có nhiều bạn bị xuất ra dấu ?? mặc dù code thì hok sai. Có vấn đề là khi chạm vào mặt dưới của mạch gần mấy cái chân thì nó hiện bình thường . Các anh chị có nhận xét gì về vấn đề này hok? hix
 

Lee

Cố Vấn CLB
Staff member
À, vụ này thì hơi bị vui. Nếu bạn đọc kĩ datasheet con ds1307 thì sẽ rõ. :D
Bạn thử ngắt nguồn 5V cấp cho Ds1307 và khi có nguồn thử xem.

Khi chạy ở chế độ dùng pin thì ds1307 ko cho phép việc đọc ghi data !
 
sao mach của em cài đặt ngày giơ rồi mà nó không hiện đúng ngày giờ đã cài đặt. và nó không tăng thời gian lên được.tìm trạng trên có cách nào khắc phục không anh
 

Lee

Cố Vấn CLB
Staff member
Em xem lại config của mình thử. Bít 7(CH) ở địa chị 00h , nếu bằng 0 thì enable mạch đếm thời gian, bằng 1 thì disable. Kiểm tra lại xem.
 
có phải là thanh ghi giây không anh. cái đó thì được rồi. nhưng con của em không cài được năm, nó cứ hiện năm 34 bất chấp em cài cho nó năm nào đi nữa. với lại cái con ds1307 đưa tay chạm vào chân scl thi nó giao tiếp dc còn đưa tay ra thì nó đơ luôn
 

Lee

Cố Vấn CLB
Staff member
Em post code lên đi, mới tìm ra chổ sai được.
Còn vấn đề chạm tay chạm chân vô ds1307 thì có thể là do dây kết nối lỏng lẻo, ko "ăn" điện nên thế. :d
 
Top