![]() |
|
Tài trợ cho PIC Vietnam |
||||||||
| PIC - Thiết kế và Ứng dụng Ý tưởng cho các sản phẩm sử dụng PIC/dsPIC và các sản phẩm của Microchip |
![]() |
|
|
Ðiều Chỉnh | Xếp Bài |
|
|
|
|
#1 |
|
Nhập môn đệ tử
Tham gia ngày: Oct 2009
Bài gửi: 4
: |
Em có thắc mắc về vấn đề đọc dữ liệu trên DS1307! Bằng ASM
Thưa các sư huynh, em đã có tham khảo theo bài của các anh rất kỹ lưỡng và một số bài khác nói về giao tiếp I2C cụ thể là trong trường hợp: gia tiếp với DS1307.
-------------------------------- Kết quả: em có thể ghi dữ liệu vào DS1307, nhưng không thể đọc ra được. Nói chính xác hơn là đọc ra sai! Cụ thể như sau: -------------------------------- 1_Em nạp dữ liệu vào DS1307 từ 0x00 đến 0x07. ![]() ![]() ![]() 2_Kiểm tra bằng KIT developing thì thấy có dao động ở chấn SQW=> nạp dữ liệu vào control byte (địa chỉ 0x07) của IC DS1307 là chính xác.( Cụ thể hơn em nạp giá trị 0x10 vào control byte =>xung 1Hz;...)=>chứng tỏ là ghi dư liệu được và là ghi đúng! 3_Em xuất đúng ngay tại giá trị control byte (tức là bằng 0x10) thì khi đọc thanh ghi SSPBUF sau khi waitMSSP la sai!! ![]() ![]() 4_Em cũng đã thử rất nhiều lần với nhiều thanh ghi khác của RTC, nhưng kết quả truy xuất lại đều vô vọng. Em cũng có tra cai flowchart phần ghi và nhận của PIC về I2C master mode trong datasheet 16F887A(trang số 315 và 317). Nhưng em thấy nó đúng!(sau khi thiết lập mọi thứ; chỉ cần SET SREN thôi). ------------------------------------------ Đó là những thăc mắc của em, em cũng đã suy nghĩ rất nhiều về vấn đề đó và em cũng đã thử và rút ra là: -có thể sau mỗi lần nhận thì ACK phát ra từ PIC đến RTC có ành hưởng j đến SSPBUF ko? -Có lần thí nghiệm em đã có thể nhận được 4 bit đầu là chính xác!(chạy debug và KT thanh ghi bằng Watch trong MPLAB), nhung 4 bit sau la FFFF trong khi DS1307 chỉ đếm BCD thôi=> có thể xung clk không đồng bộ dẫn đến dữ liệu nhận sai? Thiết lập của em la hoàn toàn bình thường: thạch anh 4Mhz cho PIc; 32768 cho RTC; tao xung clk đồng bộ 100 Khz.... -Em cũng đã kham khảo ý kiến của thầy trong trường nhưng coi bộ khó có giải đáp! -------------------------------------------- Em biết là đã làm mất thời gian của các anh rất nhiều nhưng mong anh giúp đỡ em. Em rất muốn hiểu rõ hơn nữa về PIC. Cái này là ĐAMH1 của em: nó chỉ chiếm có 1 trình thôi, tuy vậy em cố gắng thực hiện có KQ ko vì điểm số chỉ vì hiểu biết và đam mê. ----------------------------------------------- Mong anh hồi âm cho em để em có thể giảii quyết được vấn đề trên. ----------------------------------------- Em có gửi theo cái ASM của em; hơi lung tung 1 tí (có thêm phần xuất LCD nhưng em đã làm chạy rồi). http://www.mediafire.com/download.php?iyhtwro5zrn ------------------------ CHÂN THÀNH CÁM ƠN các ANH!!! thay đổi nội dung bởi: notrino1506, 19-10-2009 lúc 03:30 PM. |
|
|
|
|
|
#2 | |
|
Đệ tử 1 túi
Tham gia ngày: Nov 2010
Bài gửi: 12
: |
Trích:
|
|
|
|
|
|
|
#3 |
|
Đệ tử 3 túi
Tham gia ngày: Jul 2007
Bài gửi: 48
: |
đây là hai đoạn chương trình con ghi và đọc giữ liệu với ds1307. Các bạn xem mình viết có đúng ko mà sao khi mô phỏng trên protues thì mình chi ghi được một byte thôi. Sau lệnh câu lệnh write đầu tiên thì các câu lệnh read hoặc write khác không có tác dụng.
////////////////////////////////////////////////////////// void write(int8 value, int8 add) { i2c_start(); i2c_write(0xD0); i2c_write(add); i2c_write(value); i2c_stop(); } int8 read(int8 add) { int8 value_re; i2c_start(); i2c_write(0xD0); i2c_write(add); i2c_start(); i2c_write(0xD1); value_re = i2c_read(); i2c_stop(); i2c_stop(); return(value_re); } //////////////////////////////////////////////////////// |
|
|
|
|
|
#4 |
|
Đệ tử 5 túi
Tham gia ngày: Jan 2008
Bài gửi: 96
: |
Bạn tham khảo link này xem :
http://www.picvietnam.com/forum/showthread.php?t=2644
__________________
minhsondaklak@yahoo.com |
|
|
|
|
|
#5 |
|
Nhập môn đệ tử
Tham gia ngày: Aug 2009
Bài gửi: 1
: |
mình đang bắt tay vào làm đồ án này chưa bjt làm như thế nào nên đọc bài viết của anh em thật có ích.cảm ơn anh em nhju
|
|
|
|
|
|
#6 |
|
Nhập môn đệ tử
Tham gia ngày: Apr 2009
Bài gửi: 3
: |
Em đang học pic16F877 nhưng chưa biết nhiều. Em có bài tập ai có thể giúp:
Dùng pic16f877Agiao tiếp với REATIME13807 với 6 led 7 đoạn. viết chương trình đồng hồ số dùng ASSEMPLY AI lam được gửi cho em :samac_love999@yahoo.com |
|
|
|
|
|
#7 |
|
Nhập môn đệ tử
Tham gia ngày: Sep 2009
Bài gửi: 1
: |
ai có code của mạch hiẻn thị đồng hồ số dùng led 7 thanh k? cho mìng với.
ai có gửi vào mail tdumh_nd@yahoo.com |
|
|
|
|
|
#8 |
|
Nhập môn đệ tử
Tham gia ngày: Sep 2009
Bài gửi: 3
: |
chương trình của bạn thanhlam1987 , bạn nên đọc datasheet của ds1307 và tìm hiểu cách kết nối phần cứng........vấn đề của bạn mình cũng đang quan tâm ,hy vọng sẽ có người giúp đỡ
....cái này khó ở chỗ khởi tạo ds 1307 và chuản i2c |
|
|
|
|
|
#9 |
|
Đệ tử 7 túi
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
: |
Cái này trên mạng đầy , do mấy u k chịu tìm hiểu và thử nghiệm code
Code:
void start(void)
{ SCL=0;SDA=1;SCL=1;SCL=1;
SDA=0;SCL=0;}
void stop(void)
{ SCL=0;SDA=0;SCL=1;SDA=1;}
bit write_data(unsigned char chr)
{ unsigned char temp,ack;
for(temp=0;temp<8;temp++)
{ SDA = (chr& 0x80) ? 1:0;
SCL=1;
SCL=0;
chr=chr<<1;
};
SDA=1;SCL=1;ack=SDA;
SCL=0;
return(ack);
}
unsigned char convertBCD(unsigned char _data)
{ unsigned char temp;
temp=(_data/10<<4)|(_data%10&0x0F);
return temp;
}
unsigned char read_data(void)
{ unsigned char temp1,temp2=0;
for(temp1=0;temp1<8;temp1++)
{ SCL=1;
temp2=temp2<<1;
temp2=temp2|((unsigned char)(SDA));
SCL=0;
};
return(temp2);
}
void write_RTC(unsigned char address, unsigned char _data)
{ bit status;
start();
write_data(0xD0);
write_data(address);
write_data(_data);
stop();
start();
status=write_data(0xD0);
while(status) //status = 1 (NACK)
{ start();
status=write_data(0xd0);
};
}
unsigned char read_RTC(unsigned char address)
{ unsigned char k;
start();
write_data(0xD0);
write_data(address);
start();
write_data(0xD1);
k=read_data();
stop();
return ((k>>4)*10+(k&0x0F));
}
void init_RTC()
{ write_RTC(0x07,0x10);
write_RTC(0x00,0x00); //0s
write_RTC(0x01,0x47); // phut : 47
write_RTC(0x02,0x13); // h : 13
write_RTC(0x04,0x26); // ngay : 26
write_RTC(0x05,0x06); // thang : 6
write_RTC(0x06,0x09); // nam : 2009
}
|
|
|
|
![]() |
|
|
Similar Threads
|
||||
| Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
| Làm ơn giúp đỡ lập trình PIC với DS1307, EEPROM | enti | PIC - Thiết kế và Ứng dụng | 1 | 20-11-2006 06:19 PM |