PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Học PIC16F877A qua đề tài Lịch Vạn Niên (http://www.picvietnam.com/forum/showthread.php?t=1437)

tinhthanthep 15-10-2007 11:35 AM

Trích:

Nguyên văn bởi cuongngao (Post 12072)
ai có thể cho mình biết là những chú PIC nào hỗ trợ module CAN ko?mình đang làm 1 đề tài giao thức CAN mà.mình định sử dụng con 18f458 thì không có trong thư viện Protel99 SE, đang định chuyển xuống 16f877 ko biết có đc ko nữa???

Oái sao lại đi xuống thế bạn ơi. Đi lên dsPIC30F6010A là có tích hợp CAN roài.

falleaf 15-10-2007 01:50 PM

Tại sao đồng chí này không sửa bài Lịch vạn niên này để tham gia cuộc thi tháng 10 nhỉ :D. Hay là anh tinhthanthep muốn để học bổng lại cho các bạn sinh viên :D. Nếu vậy sao các bạn sinh viên không thực hiện lại những gì anh tinhthanthep giới thiệu, xem như một bài thực hành để tham gia cuộc thi thiết kế PIC tháng 10 nhỉ?

Chúc vui

vandungevn 15-10-2007 06:18 PM

Dũng cũng đang muốn tìm hiểu thêm về lịch vạn niên để làm mà sao không thể đọc được nó kể cả trong CCS và MPLAB, bác nào biết cách để đọc được con DS1307 không, xin chân thành cảm ơn.

Mà tui thấy ở 156A Quán thánh làm mạch cũng được đó, tui thường gửi qua email và sau đó đến lấy, giá cả cũng được đó.

thongtr 30-12-2007 10:05 AM

các pác chỉ cho mình với! mình đang làm với con lm335 nhưng sao nhiệt độ của nó không có ổn định tới chênh lệch nhau tới 4 độ. các bác có cách gì chỉ cho mình với! mình đang dùng con 16F877a

vandungevn 30-12-2007 03:40 PM

ban cần có mọt mạch điện trwf và nhân áp,
khi nào rỗi thì mình sẽ post lên cho nhé
Hen gặp lại sau, chúc vui.

nguyencaotrung 17-01-2008 09:30 AM

Hi tinhthanthep!
Minh kết cái đồng hồ vạn niên lâu rồi!
Hôm nay gặp bạn là tâm đắc lắm.
Bạn có thể gửi cho mình mạch nguyên lý và chương trình của cái đồng hồ vạn niên đó chứ???
Thanksalot!
My nick peternguyentrung@yahoo.com

kiddy 18-01-2008 11:12 AM

Topic rất bổ ích cho những người mới học như mình. Bạn tinhthanthep có thể nói rõ hơn về phần chuyển đổi ngày dương sang ngày âm không vậy.

mail: diennguyennt@yahoo.com

minhsondaklak 30-01-2008 07:11 PM

Xin lịch vạn niên
 
Anh TinhThanThep cho em xin mạch nguyên lý và chương trình lịch vạn niên vơi !
minhsondaklak@yahoo.com

minhsondaklak 09-03-2008 11:07 PM

Bí rị MikroC (Lịch vạn niên)
 
Mới nhập môn PIC
Mình Copy Code Lichvannien của Tinhthanthep vào MikroC 5.0.03 chạy thử, khi dịch bị lỗi:
Line/Colum: 1:32
Message: Argument is out of range

Không biết lỗi gì, Huynh nào biết xin chỉ giúp.
Xin cám ơn !
----------------------------------------------------
26/03/2008:
Lỗi trên mình đã xử lý được rồi.
Dùng MikroC 8.0 là OK luôn, khỉ thật !!!

Tuane06_spkt 21-03-2008 11:29 AM

Mình đang Dùng Ccs 3.2 Nhưng đang Bị Lỗi,đã Tìm Cách Down Thử Phiên Bản Mới Hơn Nhưng Không được Bạn Nào Biết Link Hoặc Phần Mềm Thì Chỉ Cho Mình Với, Mấy Link Mình Down Theo Google đều Chết Ah,xin Chân Thành Cảm ơn

minhsondaklak 21-03-2008 07:29 PM

Ngắt trong MikroC
 
Mình mới học PIC, cũng mới tìm hiểu về CCS, rồi MikroC. Mình thấy MikroC cũng dễ áp dụng, phần Help của nó viết dễ hiểu.
Mình nghĩ cần phân biệt sự khác nhau giữa 2 trình dịch này cho dễ học, dễ nhớ, tránh nhầm lẫn giữa 2 trình dịch:
1. VỀ NGẮT: (Phần này MikroC có vẽ kém hơn CCS)
- CCS cho phép lập riêng từng hàm ngắt, nó tự nhận biết ngắt nào đã xảy ra, tự động thực thi hàm ngắt tương ứng, đồng thời tự động xoá cờ ngắt.
- MikroC chỉ cho lập một hàm ngắt chung, trong đó ta phải tự kiểm tra xem ngắt nào xảy ra để xử lý cho phù hợp, và phải lo xoá cờ ngắt (mình nghĩ những việc này không khó khăn gì, được cái nó sát với phần cứng - PIC chỉ có 1 véc tơ ngắt, cũng tốt vậy).

Rất mong được cùng trao đổi học hỏi về PIC, mong được các Lão tiền bối chỉ giáo !

minhsondaklak 27-03-2008 06:07 PM

Sử dụng các hàm I2C của MikroC
 
Tham gia "Học PIC6F877A qua đề tài lịch vạn niên" của Tinhthanthep, thấy có sử dụng các hàm ghi và đọc dữ liệu với ds1307 theo giao tiếp I2C:
- I2C_Wr(0xD0): gởi địa chỉ của ds1307 lên đường truyền
- I2C_Wr(0x90): cấu hình cho thanh điều khiển ds1307, sử dụng xung 1hz
- I2C_Rd(1u): đọc dữ liệu từ ds1307
Mình không biết các tham số của các hàm trên như : 0xD0, 0x90, 1u ... thì có thể tham khảo ở tài liệu nào, mình đã đọc trong Hepl của MikroC mà không rõ ?

Xin nhờ các Huynh chỉ giúp, xin cám ơn !

namqn 27-03-2008 06:12 PM

Trích:

Nguyên văn bởi minhsondaklak (Post 15199)
Tham gia "Học PIC6F877A qua đề tài lịch vạn niên" của Tinhthanthep, thấy có sử dụng các hàm ghi và đọc dữ liệu với ds1307 theo giao tiếp I2C:
- I2C_Wr(0xD0): gởi địa chỉ của ds1307 lên đường truyền
- I2C_Wr(0x90): cấu hình cho thanh điều khiển ds1307, sử dụng xung 1hz
- I2C_Rd(1u): đọc dữ liệu từ ds1307
Mình không biết các tham số của các hàm trên như : 0xD0, 0x90, 1u ... thì có thể tham khảo ở tài liệu nào, mình đã đọc trong Hepl của MikroC mà không rõ ?

Xin nhờ các Huynh chỉ giúp, xin cám ơn !

Những thông tin đó nằm trong datasheet của DS1307. Mỗi thiết bị I2C có những quy định riêng về địa chỉ, các lệnh điều khiển, thao tác dữ liệu. Để điều khiển thiết bị nào thì bạn phải tuân theo những quy ước của thiết bị đó, nếu không thì thiết bị chỉ lờ đi các yêu cầu của bạn thôi.

Thân,

tuannghienhv 06-04-2008 10:25 AM

chào bạn minhsondaklak! mình đang tìm hiểu về lịch vạn niên, minh tìm mãi mà không biết ở chỗ nào trên diễn đàn nói về cách biến đổi lịch dương sang lịch âm. các cách biến đổi khác của ông Hồ Ngọc Hà thì làm dối tinh lên không khả thi cho vi điều khiển. bạn có thể cho mình xin cách biến đổi được không. nếu được cho minh code được thì tốt. Xin cảm ơn nhiều! mail của mình: tuannghien36@yahoo.com

minhsondaklak 07-04-2008 06:51 PM

Trao đổi về "lịch vạn niên"
 
Chào bạn Tuannghienhv !
Mình cũng như bạn thôi, mới học, đang ngâm cứu "lịch vạn niên" của Tinhthanthep ngay trong tut này đây.
Hiện cũng đang khoanh vùng ra mà ngâm cứu, mới rã xong phần ngày giờ dương lịch, nắm cơ bản về dùng Pic làm đồng hồ, phần âm lịch thì đang còn tạm gác lại xem sau. Bạn xem lại trong "lịch vạn niên" nêu trên xem.

minhsondaklak 11-04-2008 09:29 AM

Trao đổi "lịch vạn niên":

Phần đo nhiệt độ dùng ADC 10 bít (MikroC chỉ có lệnh đọc ADC 10 bít), xử lý hiển thị dữ liệu bằng 8 bít -> kết quả không đúng (thay vì biến thiên từ 0 - 1023, kết quả chỉ biến thiên từ 0-255, lặp lại 4 lần) ?
Không biết xử lý thế nào đây, nhờ các huynh chỉ giúp !
--------------------------------------
12/4/2008:
Hà hà ! vấn đề ở kiểu dữ liệu: dùng các kiểu 1 byte chứa giá trị ADC 10 bit là không ổn.
Cụ thể, phần đo nhiệt độ của "lịch vạn niên" lập hàm như sau là ổn:
NHIETDO() {
char degree[7];
int temp1, temp2;
temp1 = Adc_Read(0); //Doc nhiet do tu cong ADC, 10 bit
temp2 = (temp1 - 558)/2; //Doi ra do C
IntToStr(temp2, degree); //Chuyen sang string
LCD_Out_CP(degree); //Hien thi LCD
}

Son Hien 23-04-2008 09:17 PM

ĐỀ TÀI LỊCH VAN NIÊN CỦA CÁC ANH RẤT HAY EM RẤT THÍCH , CÁC ANH CÓ THỂ GỞI CHO EM SƠ ĐỒ NGUYÊN LÝ VÀ PHIM ĐỂ EM NGUYÊN CỨU THÊM CÓ ĐƯỢC KHÔNG , NẾU CÓ THÊM CTRINH MIKROC THI QUÁ TỐT, EMAIL:sonhiencaca@yahoo.com cảm ơn các anh nhiều hẹn gặp lại.

vancao_pro 02-05-2008 04:59 PM

Anh tinhthanthep oi! Em cũng đang học về PIC8F877 Anh co crack của MikroC ver 6 không? Nếu có gửi cho tôi với nhé (cả soft và crack thì càng hay, còn không mình files crack cũng được).
email: vancaotb@gmail.com
YM: vancao_pro
Topic của bạn rất hữu ích với những người mới học.

rock 02-05-2008 11:05 PM

cái topic này mà là dể cho người mới học ư ?? nếu mà ai mới học đọc cái chương trình đầy đủ này thì có lẻ xỉu luôn .nói chung ai mới học mà đọc cả đống đó đặc biệt la đoan lich dương và chuyển đổi sang lịch âm thì theo tôi chỉ có cao thủ mới hiểu .Hy vọng bác tinh thân thép giải thích kỹ phần đó(không có thuật toán chuyển đổi thì làm sao mà hiểu đươc chương trình ) cho anh em đươc nhờ .chứ như vậy thì ...oet!!.Mà hình như bác này cũng trốn vì sơ anh em ở đây là phải!

nguyendungdt12 05-05-2008 04:27 PM

tinhthanthep cho mình software với crack nha.Cảm ơn bạn vầ bài viết rất bổ ích này.
Email cua mình này: nguyendungdt12@yahoo.com

daikaka 14-05-2008 02:33 AM

Anh tinhthanthep oi!
- Em đang nghiên cứu về PIC8F877
- Anh co crack của MikroC ver 6 không? Nếu có gửi cho e với (soft và crack luôn nha a )
- Cho em xin mạch nguyên lý và chương trình lịch vạn niên
Cảm ơn anh rất nhiều !
Email : jindo1287@yahoo.com
Topic của arất hữu ích với tất cả mọi người.

Son Hien 27-05-2008 12:37 PM

có anh nao giup minh với sao mình tạo Project bằng mikroc nhu file hướng dẩn của bac tinh thần thép nhưng lúc biên dịch nó k dich ra file hex , dó là pic 16F877A, còn nữa nếu muon tạo Project dể khi viết xong cho biên dịch ra file hex cho pic 18F452 thì làm thế nào có bác nào biết xin giup em

Son Hien 27-05-2008 01:15 PM

Do nhiet do hien thi LCD dung DS1820 pic6F877A
 
có bài viet nay em không hiểu và sau khi viết xong em dịch nó không ra file hex co anh nào biết nhờ chỉ giúp em cảm ơn nhiều
unsigned temp;
unsigned short j;

void Display_Temperature(unsigned int temp) {
//...
}
Void main() {
ADCON1 = 0xFF;
PORTA = 0xFF;
TRISA = 0xFF;
PORB = 0;
TRISB = 0;
do {
ow_Reset(&PORTA,5);
ow_write(&PORTA,5,0xCC);
ow_write(&PORTA,5,0x44);
Delay_us(120);

ow_Reset(&PORTA,5);
ow_write(&PORTA,5,0xCC);
ow_write(&PORTA,5,0xBE);
Delay_us(400);

j = ow_Read(&PORTA,5);
temp = ow_Read(&PORTA,5);
temp <<= 8;
temp +=j;
Display_Temperature(temp);
Delay_ms(500);
}
while (1);
}//~!

tdaminh 17-07-2008 08:40 AM

Bác tinhthanthep cho minh hỏi:
- ROM ngoài chỉ chứa giờ phút giây alarm phải không ?
- Nếu thay bằng ROM của PIC luôn, thì làm thế nào ?
Cảm ơn.

tallht 17-07-2008 11:31 AM

Code:

Lcd_Config(&PORTD,4,7,6,3,2,1,0);    // các bạn xem sơ đồ mạch để hiểu được cách khai các tham số của hàm này
  Lcd_Cmd(Lcd_CLEAR);                // xóa màn hình
  Lcd_Cmd(Lcd_CURSOR_OFF);        // tắt con trỏ nhấp nháy của LCD

void LCD_DISPLAY() {
  LCD_Out(1,1,"Hello");                // hiện chứ Hello bắt đầu ở dòng 1 cột 1
  LCD_Out(2,1,"Picvietnam");        // hiện chữ Picvietnam bắt đầu ở dòng 2 cột

mấy thông số của mấy hàm trên mình làm sao mà biết được hả bác?còn LCD bác dùng là loại nào vậy? mình thấy nó có tới 16 chân>?

tallht 17-07-2008 11:56 AM

????
 
1 Attachment(s)
Trích:

Nguyên văn bởi tinhthanthep (Post 11309)
Tiếp theo ta làm sang cái LCD nhé. Bạn nào mới làm quen với LCD mà viết bằng assembly thì chắc mất vài ngày quá. Nếu viết bằng MikroC bạn nào kém lắm cũng chỉ 30 phút là xong. Nói thế để các bạn thấy rằng viết ứng dụng mà dùng MikroC thì thôi rồi, viết nhanh và ứng dụng nhanh đi vào cuộc sống, chứ cứ tỉa tót bằng assem thì khi sản phẩm ra thị trường thì đối thủ cạnh tranh đã ra mấy phiên bản khác nhau mất roài.
Giờ ta viết chương trình để hiển thị dòng chữ Hello Picvietnam nhé. Chương trình như sau:

Code:

void INIT_MAIN() {
// Khoi tao cong B
  PORTB  = 0;
  TRISB  = 0xFF;
// Khoi tao cong D
  PORTD  = 0;          // Xóa dữ liệu đang tồn tại sẵn trên cổng D
  TRISD  = 0;            // Định nghĩa cổng D là digital Output
// Khoi tao cong E
  PORTE  = 0;
  TRISE  = 0;
  ADCON1  = 0xE;
// Khoi tao LCD
  Lcd_Config(&PORTD,4,7,6,3,2,1,0);    // các bạn xem sơ đồ mạch để hiểu được cách khai các tham số của hàm này
  Lcd_Cmd(Lcd_CLEAR);                // xóa màn hình
  Lcd_Cmd(Lcd_CURSOR_OFF);        // tắt con trỏ nhấp nháy của LCD

void LCD_DISPLAY() {
  LCD_Out(1,1,"Hello");                // hiện chứ Hello bắt đầu ở dòng 1 cột 1
  LCD_Out(2,1,"Picvietnam");        // hiện chữ Picvietnam bắt đầu ở dòng 2 cột 1
}

void MAIN() {
  INIT_MAIN();
  LCD_DISPLAY();
}

Bạn nên sắp xếp các chương trình con như trên. Trong chương trình chính ta chỉ việc gọi tên các chương trình con thôi.


bác ơi ! mình đã tìm được thư viện lệnh của LCD gòy! nhưng sao viết như bác chỉ mà nó chẳng xuất ra chữ nào hết
có file kèm theo đây:

tallht 17-07-2008 12:50 PM

????
 
Trích:

Nguyên văn bởi tinhthanthep (Post 10926)
Chào các bạn!
Hiện mình đã làm xong mạch Lịch Vạn niên sử dụng PIC16F877A. Mình sẽ lần lượt post các chương trình thử nghiệm trên mạch này. Qua Project này các bạn sẽ làm chủ được con PIC16F877A và trình dịch MikroC, một trình biên dịch rất dễ sử dụng cho người mới bắt đầu học.
Đây là sơ đồ mạch nguyên lý:

bác ơi! trong sơ đồ của bác có cái ICSP-BLD là cái gì vậy? trong proteus mình chẳng thấy đâu cả? nó dùng làm gì trong sơ đồ mạch này?
ah còn con 24c04 của bác,trong proteus chỉ có 2 chân A1,A2 thôi ,đâu có tới 3 chân như của bác đâu? bác giải thích rõ chút ah! cảm ơn bác nha!

minhsondaklak 18-07-2008 10:30 AM

Khởi tạo ds1307
 
Trích:

Nguyên văn bởi tinhthanthep (Post 11447)
Ban đầu, ds1307 chưa có giá trị nào cả trong các thanh ghi. Vì vậy, việc đầu tiên là phải nạp một giá trị bất kỳ cho các thanh ghi. Chương trình sau sẽ thực hiện công việc này. Sau này , bạn có thể dùng 4 nút bấm để hiệu chỉnh lại thời gian cho đúng với thực tế.

Code:

void INIT_MAIN() {
// Khoi tao truyen thong I2C
  I2C_Init(100000);      // Kích hoạt môddun truyền thông i2c với tốc độ baud là 100kHz
// Khoi tao DS1307
  I2C_Start();    // điều kiện start
  I2C_Wr(0xD0); // truyền địa chỉ của ds1307 và chọn ghi dữ liệu lên ds1307
  I2C_Wr(0x00); // Truyền địa chỉ ô nhớ đầu tiên của ds1307
  I2C_Wr(0x13); // Khoi tao gia tri ban dau cho  thanh ghi giây
  I2C_Wr(0x03); // Khoi tao gia tri ban dau cho  thanh ghi phút
  I2C_Wr(0x02); // Khoi tao gia tri ban dau cho  thanh ghi giờ
  I2C_Wr(0x03); // Khoi tao gia tri ban dau cho  thanh ghi thứ
  I2C_Wr(0x05); // Khoi tao gia tri ban dau cho  thanh ghi ngày
  I2C_Wr(0x03); // Khoi tao gia tri ban dau cho  thanh ghi tháng
  I2C_Wr(0x03); // Khoi tao gia tri ban dau cho  thanh ghi năm
  I2C_Wr(0x90); // đặt cấu hình cho thanh ghi điều khiển, sử dụng xung 1Hz.
  I2C_Stop();    // Điều kiện stop
}

Chương trình chính
Code:

void MAIN() {
  INIT_MAIN();
}


Chào các huynh !
Theo "lịch vạn niên" của Bác Thép, mình còn thắc mắc 1 điều, nhờ các Huynh xem giúp:
Trong hàm INIT_MAIN() có đoạn khởi tạo cho ds1307 như trên. Như thế cứ mỗi lần con PIC được cấp điện lại (mất điện lưới rồi có lại ấy !) thi đồng hồ lại bị Reset theo giá trị mình khởi tạo ban đầu cho nó. Thế hoá ra mỗi lần như vậy phải đi chỉnh lại giờ cho đồng hồ à !
Hay phải xử lý thế nào đây ? mong các Huynh chỉ giúp, xin cám ơn !

nguyenthinho 19-07-2008 01:53 PM

bác Tinhthanthep có thể gửi cho mình cái software và crack của Mickro C với nha. Cảm ơn bác nhiều lắm.Mail của mình là ghetnguoithu3@yahoo.com

david 19-07-2008 01:57 PM

http://www.picvietnam.com/forum//showthread.php?t=2505
tìm trong diễn đàn trước rồi hãy hỏi nhé bạn ! :)

minhsondaklak 19-07-2008 05:57 PM

Mô phỏng "Lịch vạn niên" với proteus
 
1 Attachment(s)
Cùng thực hành với "lịch vạn niên"

minhsondaklak 20-07-2008 12:33 AM

Khởi tạo ds1307
 
Hôm nay mình đã cho chạy trên mạch thực nghiệm, kết quả:
- Phần code khởi tạo cho ds1307 chỉ cho chạy 1 lần, để khởi tạo cho IC ds1307
- Sau đó phải xoá đoạn code này đi, biên dịch lại và nạp lại cho PIC thì OK !!!

meishun 20-07-2008 04:01 PM

con DS1307 có vùng ram cho người dùng tùy ý sử dụng, sao ta không đặt 1 giá trị bất kì (ví dụ 0xff) tại 1 ô nhớ nào đó (chẳng hạn tại 0x09). Trong hàm main, ta kiểm tra giá trị tại 0x09 của DS1307, nếu = 0xff thì nhảy đến vòng lặp chính, nếu khác thì gọi hàm thiết lập giá trị cho DS1307. Đây là cách mà tôi bẫy DS mỗi khi cúp điện.

minhsondaklak 20-07-2008 06:02 PM

???
 
Chào meishun !
Bạn có thể nói rõ hơn được không: Lệnh ghi giá trị 0xff vào địa chỉ 0x09 cho DS thì đặt ở đâu được ?

meishun 21-07-2008 03:33 PM

ví dụ hàm khởi tạo cho DS1307 tôi trích ra trong 1 project trước kia của tôi (do ưu tiên giao tiếp SPI cho MMC nên tôi thiết lập giao tiếp I2C bằng phần mềm, trình biên dịch MikroC)
Code:

void RTC_init()
{
    unsigned char i,RTC_flag;
    // dat ba^~y DS1307
    RTC_flag = RTC_get(0x08);        // doc gia tri tại địa chỉ 0x08 của DS1307 .
    if(RTCflag!=0xFF)                    // neu ko phai 0xFF
    {
        RTC_setdate(0x21,0x07,0x08);        // thi khoi tao gia tri cho DS1307
        RTC_settime(0x14,0x30,0x00);
        Soft_I2C_Start();                // dat cau hinh cho DS
        Soft_I2C_Write(RTC_ID);
        Soft_I2C_Write(0x07);                //dat con tro tai vi tri nay
        Soft_I2C_Write(0x10);                // tao xung 1Hz tai chan so 7.
        Soft_I2C_Write(0xFF);          // ghi giá trị 0xFF vào ô nhớ có địa chỉ 0x08;
        Soft_I2C_Stop();
    }
}

- với các hàm do người dùng tự định nghĩa (nếu nắm được nguyên tắc I2C thì thật dễ dàng):
unsigned char RTC_get(unsigned char addr);
RTC_settime(unsigned char hh, unsigned char mm, unsigned char ss);
RTC_setdate(unsigned char dd, unsigned char mm, unsigned char yy);
- khi đó, trong hàm main():
Code:

void main()
{
  // thiet lap PORT cho PIC
  // thiet lap gia tri cho cac thanh ghi chuc nang khac, v.v...
  RTC_init();  // goi ham khoi tao DS1307 - da co "trap".
  // cac ham khac ....
  while (1)
  {
      // hien thi hoac cac cong viec khac....
  }
}

như vậy, khi được cấp điện lại, đầu tiên con PIC sẽ lấy giá trị trong ô nhớ 0x08 của 1307 để kiểm tra, nếu là 0xFF thì bỏ qua việc khởi tạo.
Thực tình, việc bẫy này cũng chỉ "khá" hiệu quả thôi. Tôi cung ko hiểu tại sao lâu lâu con DS1307 bị treo (?), một ngày mà cúp điện chừng 3-4 lần là nó chạy "tào lao" thôi. Có lẽ bị sốc nguồn chăng??

minhsondaklak 21-07-2008 07:45 PM

Khởi tạo ds1307
 
Xin cám ơn meishun nhiều nhé !
Mình hiểu cái bẫy DS của bạn thế này: Đặt lệnh ghi vào d/c 0x08 ngay trong hàm khởi tạo DS.
Trong hàm Main() thì kiểm tra lại d/c 0x08 xem có còn duy trì giá trị đó không. Nếu không còn tức là các thông số thời giờ trong DS cũng đã sai, phải cho khởi tạo lại DS. Nếu còn thì bỏ qua bước khởi tạo. Đại khái code như thế này phải không meishun.

READ_DS(); //Đọc ds1307, có đọc X = giá trị lưu tại 0x08 (0x08 chứa 0xff)
if (X != 0xff) SET_DS(); //Nếu khác 0xff thì Khởi tạo DS1307, có ghi vào 0x08 giá trị 0xff
---------------------------------------------------------------------
22/7/2008
Mình đã cho chạy trên mạch, kết quả OK rồi. Riêng con DS chạy cũng ổn định mà. Có khi bạn thay con DS khác xem sao.
Và mình đề nghị thêm: thay giá trị 0xff bằng 1 giá trị khác, 0x55 chẳng hạn. Bởi vì số 0xff đôi khi mạch bị nhiễu cũng ngẫu nhiên sinh ra sô 0xff (hoặc 0x00) nên dùng làm mốc theo dỏi thì không chắc lắm, còn số khác như 0x55 chẳng hạn, thì xác xuất do mạch phát sinh ngãu nhiên sẽ ít xảy ra -> chống hiễu tốt hơn !

tallht 08-08-2008 10:49 AM

Giúp mình với!!!
 
1 Attachment(s)
Mình đang làm đề tài đồng hồ dùng ds1307 với 16f877a hiển thị giờ phút giây ra led 7 đoạn !
Chân swq mình cho vào chân rb0 để tạo ngắt ngoài mỗi 1 giây(cập nhật thời gian) ,mình thiết lập xung cạnh lên thì ngắt xảy ra.vậy mà trong proteus thì lúc xung cạnh xuống thì nó hiển thị dữ liêu bậy bạ,cạnh lên thì hiển thị đúng.vây mà nó còn báo lỗi là excessive load nữa .giờ phải khắc phục sao đây?
***mô tả mạch: Dùng 6 led 7 đoạn,mỗi con gắn thêm 1 con 74hc595 để ghi dịch dữ liệu hiển thị nhận từ ds1307,chỉ dùng 3 chân rb1,rb2,rb3 để điều khiển truyền dữ liệu.chân rb0 nhận xung ngắt ngoài(đã có hàm chuyển đổi sang bcd cho led 7 đoạn)

tallht 08-08-2008 10:59 AM

http://megasharesvn.com/forum/showthread.php?t=44893

ĐÂY LÀ ĐƯỜNG LINK TẢI MIKROC!

meishun 10-08-2008 11:46 AM

Trích:

Nguyên văn bởi tallht (Post 18025)
Mình đang làm đề tài đồng hồ dùng ds1307 với 16f877a hiển thị giờ phút giây ra led 7 đoạn !

***mô tả mạch: Dùng 6 led 7 đoạn,mỗi con gắn thêm 1 con 74hc595 để ghi dịch dữ liệu hiển thị nhận từ ds1307,chỉ dùng 3 chân rb1,rb2,rb3 để điều khiển truyền dữ liệu.chân rb0 nhận xung ngắt ngoài(đã có hàm chuyển đổi sang bcd cho led 7 đoạn)

hì, dùng PIC16F877A mà còn dùng thêm 74595 cho mỗi LED 7 seg nữa, rườm rà quá. Bạn có thể làm mạch gọn hơn nữa mà ko cần dùng IC ghi dịch.

tallht 10-08-2008 01:19 PM

mình không nghĩ ra là phải dùng con gì? bạn có đề nghị gì không?


Múi giờ GMT. Hiện tại là 02:49 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam