PDA

View Full Version : Cần giúp đỡ về đồng hồ thời gian thực kết nỗi với LCD 16x2


k_no1
22-12-2011, 11:15 PM
Hiện tại là E đang có 1 bài tập là:

Xây dựng đồng hồ thời gian thực kết nỗi với LCD 16x2 (I2C). Dùng PIC 18F242+ DS1302.

Mấy anh trong diễn đàn giúp em viết code ( lập trình C ) và mạch mô phỏng cho đề tài sau với ạ.
hoặc có đề tài nào về cái này rồi thì các anh cho e tham khảo với ạ
Em mới làm quen với pic , mong mọi người giúp đỡ nhiều.
Xin chân thành Cảm ơn ạ.

longtu
23-12-2011, 12:40 PM
Chac K_no1 mới giải quyết bài tập thiết kế lần đầu, nên mình góp ý K_no1 thế này:
1. Hiểu rõ yêu cầu
2. Tìm hiểu tài liệu liên quan: tài liệu vô số trên internet..., chia nhỏ yêu cầu ra thành nhiều vấn đề, tìm hiểu kỹ từng vấn đề để hiểu rõ.
Vi dụ:
- Yêu cấu sử dụng PIC 18F242: tìm hiểu để hiểu rõ PIC này về bộ nhớ, vê số chân giao tiếp, thạch anh tối đa có thể sử dụng, kết nối phần cứng tối thiểu để PIC hoạt động, lựa chọn phần mềm compiler.
- Sử dụng DS1302: Down datasheet về, dọc kỹ datasheet, tìm hiểu cách giao tiếp với PIC...
- LCD 16x2: Tìm hiểu về Text LCD, cách giao tiếp với PIC(4 đường, 8 đường)...

3. Hỏi người khác: Sau khi tìm hiểu kỹ bước 1 và 2 mới đến bước thứ 3 khi mình không hiểu rõ vấn đề nào, phần nào...

4. Lên kế hoạch: thời gian thực hiện, các bước thực hiện ...

Một số ý chia sẽ cùng bạn như trên.

Trở lại với bài tập của bạn:
- Bạn sử dụng CCS compiler thì đã có sẵn ví dụ: DS1302.C(Real time clock functions). Bạn xem ví dụ này đi nhé.

longtu
23-12-2011, 12:40 PM
//////////////////////////////////////////////////////////////////////////
//// DS1302.C ////
//// Driver for Real Time Clock ////
//// ////
//// rtc_init() Call after power up////
//// ////
//// rtc_set_datetime(day,mth,year,dow,hour,min) Set the date/time ////
//// ////
//// rtc_get_date(day,mth,year,dow) Get the date ////
//// ////
//// rtc_get_time(hr,min,sec) Get the time ////
//// ////
//// rtc_write_nvr(address,data) Write to NVR ////
//// ////
//// data = rtc_read_nvr(address) Read from NVR ////
//// ////
//// get_bcd(data) Convert data to BCD ////
//// ////
//// rm_bcd(data) Convert data to int ////
//// ////
//////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS C ////
//// compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, reproduction////
//// or distribution is permitted without written permission. ////
//// Derivative programs created using this software in object code ////
//// form are not restricted in any way. ////
//////////////////////////////////////////////////////////////////////////

#ifndef RTC_SCLK

#define RTC_SCLK PIN_B1
#define RTC_IO PIN_B3
#define RTC_RST PIN_B2

#endif

void write_ds1302_byte(BYTE cmd) {
BYTE i;

for(i=0;i<=7;++i) {
output_bit(RTC_IO, shift_right(&cmd,1,0) );
output_high(RTC_SCLK);
output_low(RTC_SCLK);
}
}

void write_ds1302(BYTE cmd, BYTE data) {

output_high(RTC_RST);
write_ds1302_byte(cmd);
write_ds1302_byte(data);
output_low(RTC_RST);
}

BYTE read_ds1302(BYTE cmd) {
BYTE i,data;

output_high(RTC_RST);
write_ds1302_byte(cmd);

for(i=0;i<=7;++i) {
shift_right(&data,1,input(RTC_IO));
output_high(RTC_SCLK);
delay_us(2);
output_low(RTC_SCLK);
delay_us(2);
}
output_low(RTC_RST);

return(data);
}

void rtc_init() {
BYTE x;
output_low(RTC_RST);
delay_us(2);
output_low(RTC_SCLK);
write_ds1302(0x8e,0);
write_ds1302(0x90,0xa4);
x=read_ds1302(0x81);
if((x & 0x80)!=0)
write_ds1302(0x80,0);
}

int get_bcd(BYTE data)
{
int nibh;
int nibl;

nibh=data/10;
nibl=data-(nibh*10);

return((nibh<<4)|nibl);
}

int rm_bcd(BYTE data)
{
int i;

i=data;
data=(i>>4)*10;
data=data+(i<<4>>4);

return data;
}

void rtc_set_datetime(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min) {

write_ds1302(0x86,get_bcd(day));
write_ds1302(0x88,get_bcd(mth));
write_ds1302(0x8c,get_bcd(year));
write_ds1302(0x8a,get_bcd(dow));
write_ds1302(0x84,get_bcd(hr));
write_ds1302(0x82,get_bcd(min));
write_ds1302(0x80,get_bcd(0));
}

void rtc_get_date(BYTE& day, BYTE& mth, BYTE& year, BYTE& dow) {
day = rm_bcd(read_ds1302(0x87));
mth = rm_bcd(read_ds1302(0x89));
year = rm_bcd(read_ds1302(0x8d));
dow = rm_bcd(read_ds1302(0x8b));
}

void rtc_get_time(BYTE& hr, BYTE& min, BYTE& sec) {
hr = rm_bcd(read_ds1302(0x85));
min = rm_bcd(read_ds1302(0x83));
sec = rm_bcd(read_ds1302(0x81));
}

void rtc_write_nvr(BYTE address, BYTE data) {
write_ds1302(address|0xc0,data);
}

BYTE rtc_read_nvr(BYTE address) {
return(read_ds1302(address|0xc1));
}

k_no1
23-12-2011, 09:24 PM
ko biết longtu là boy hay girl. Nhưng em xin chân thành cảm ơn những ý kiến đóng góp của anh. Em sẽ xem xét kỹ. Nếu phần nào ko hiểu xin được a chỉ giáo cho ạ.

longtu
24-12-2011, 01:02 PM
Tên minh là Minh Tuân, chắc bạn cũng đoán được không có bạn gái nào tên như thế đúng không.

Bạn cứ đặt câu hỏi, mọi người trên diễn đàn sẽ giúp bạn.

k_no1
27-12-2011, 12:57 PM
Ai có thể cho e tài liệu về con Pic 18F242-I/SP ko?
E tìm mãi mà ko thấy.
Thank

phatcddt08a
09-01-2012, 09:09 PM
ko có đâu bạn àh.... bạn viết bằng ccs thì chả nên quan tâm nó làm gì .từ khi bạn viết bằng mplab thì phải đọc datasheet....tiếng anh kém thì mệt lắm mấy cái này.

phatcddt08a
11-01-2012, 12:26 PM
Mình chưa tìm hiểu qua ds1302 nhưng mình viết thử dùng drivers ds1302.c có sẳn đã thành công ...thực sự mình cũng chưa đọc qua dataheet ko có thời gian làm chơi ai ngờ chạy.NẾU THẤY HAY THÌ THANHK NHÉ CÓ TINH THẦN POST TIẾP