Giúp đỡ nút bấm chỉnh giờ đồng hồ dùng ds1307 và pic

t10000

Trứng gà
Tôi làm một mạch đồng hồ dùng pic16f877a theo bài học I2C mà CLB đã cung cấp.
Dùng CCS để viết code, nói chung là khá ổn, song còn mỗi việc chưa biết dùng ngắt ngoài như thế nào để chỉnh giờ cả.
Ý tưởng của tôi là dùng 3 nút nhấn đặt vào RB4, RB5, RB6 cùng với điện trở treo 2k7 lên nguồn để set time, khi nhấn nút tương ứng thì RB4,5,6 sẽ có điện áp 0.
nếu nhấn giữ nút RB4 và nhấn RB5 thì giờ tăng 1 đơn vị, nếu nhấn giữ nút RB4 và nhấn RB6 thì phút tăng 1, tức là khi không nhấn giữ nút RB4 thì bấn nút khác không có tác dụng chỉnh giờ.
Vui lòng giúp cho cách dùng ngắt như thế nào để thực hiện ý tưởng trên. Mình tìm mãi chưa có bài viết nào nói kỹ về interrupt cả nên bí.

đây là đoạn code do tự nghĩ ra không biết có đúng không (các bạn đừng cười mình nhé, mình dân IT tự nghiên cứu PIC thôi)

/*
#int_RB
void interrup_RB()
{
if(RBIE && RBIF)
{
if(RB4==0)
{
if(RB5==0)
{
if(gio<24) gio++;
else gio=0;
}
if(RB6==0)
{
if(phut<60) phut++;
else phut = 0;
}
}
RBIF=0;
}
}
*/
và rồi cũng chưa biết là sử dụng nó ra sao trong hàm main().

Xin vui lòng chỉ giúp, hoặc ai đó viết bài hướng dẫn kỹ về interrupt càng tốt.

(Tôi tự mình nghiên cứu PIC, không có điều kiện để đi học và ngay bên cạnh tôi cũng chưa có ai cùng sở thích, nên gặp nhiều khó khăn. Xin cảm ơn những bài viết của các anh chị falleaf, namqn, 2death, nhh ... và tất cả các bạn tham gia diễn đàn này cũng như bên picvietnam đã mở ra cho tôi những kiến thức mới trong khoa học)
mail của tôi anhtt01@gmail.com, rất vui nếu có thêm bạn cùng giao lưu!
 

t10000

Trứng gà
trong khi chờ đợi sự giúp đỡ của các bạn, tôi đã tranh thủ xem thêm các luồng khác thì có thêm thông tin là: nếu dùng ngắt ngoài RB4-7 thì mỗi khi có thay đổi trạng thái trên RB4->7 thì hàm ngắt sẽ twj động thực hiện mà không cần gọi hàm ở chương trình chính, như vậy chỉ cần thêm đoạn code mà tôi đã viết trên là xong phải không các bạn?
 

tungbk

Cố Vấn CLB
Staff member
Chào bạn không biết hôm trước cái dấu dot không hiện là lỗi gì nhỉ ? :)
Để dùng phần ngắt của PIC bạn có thể tham khảo mục
>>14.0 Special Features of the CPU>>Interrupts >> hình 14-7 interrupt logic
Ở đây cung cấp đầy đủ về các ngắt có trong PIC . Theo sơ đồ để dùng ngắt RB4-RB5-RB6 thì :
GIE = 1 ; //global interrupt enable
RBIE = 1; //Port B interrupt enable

Khi RB4 đổi mức thì nhảy vào ngắt (nhưng đồng thời nếu RB5,RB6 mà nhấn thì cũng vào ngắt luôn vì RBIE là bit ngắt toàn bộ PORTB) rồi sử dụng chương trình đọc 2 nút RB5,RB6 giống như bạn làm là được.
Hoặc có thể gắn vào RB0 vì RB0 có thêm bộ ngắt riêng là INTE/INTF. Khi này không cần enable ngắt portB chỉ đợi có ngắt cạnh xuống RB0 là vào ngắt rồi đọc 2 nút còn lại.
 

t10000

Trứng gà
Chào bạn không biết hôm trước cái dấu dot không hiện là lỗi gì nhỉ ? :)
Cảm ơn tungbk,
Hôm trước cái dấu dot nó không chạy, nó không do phần cứng, vì như mình đã nói là đã test phần cứng ok, lỗi do không thể nào xuất data ra RB7 được, (cho đến nay vẫn chưa hiểu tại sao, port không chết, vì vẫn dùng RB7 tốt khi nạp). Mình đổi phương án là viết lại code để cho port RD5 điều khiển riêng cho dấu dot thay vì dùng RB7.

Chúc tungbk và mọi người vui!
 
Top