PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 24-11-2008, 10:12 PM   #1
bubeohl
Đệ tử 1 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 17
:
Smile giup em ve ngat 16F887 với???

chào các bác! em có chút rắc rối như sau:
em sử dụng 2 ngắt của 16f887 là ngắt ngoài(trên rb0), và một ngắt on_change(rb5 chẳng hạn) .em sử dụng 2 phím bấm nối tới 2 chân này.
mục đích của em là: ấn button1 thì thực hiện chuong_trinh1
ấn button2 thì thực hiện void chuong_trinh2()
nhưng khi lắp mạch test thì kết quả luôn như sau:
đầu tiên , hiện dòng chữ " hello" trong main(),5 giây sau thì chương trình TỰ ĐỘNG nhảy vào ngắt luôn (thực hiện chương _trinh1) mà em chưa hề ấn phím(tất nhiên ấn phím 2 cũng ko tác dụng).em ko hiểu tại sao nữa.đây là code:

Code:
#include <16f887.h>
#include <def_877a.h>
#device *=16 ADC=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#include <lcd_lib_4bit.c>
void chuong_trinh1();
void chuong_trinh2();
#int_RB
void RB_isr(void)
{ chuong_trinh1();

}

#int_EXT
void EXT_isr(void)
{
chuong_trinh2();
}

void chuong_trinh1()
{
lcd_init();
lcd_putcmd(0x01);//xoa man hinh
lcd_putcmd(0x80);
lcd_putchar("chaocacban");
delay_ms(5000);
}
void chuong_trinh2()
{
lcd_init();
lcd_putcmd(0x01);//xoa man hinh
lcd_putcmd(0xc0);
lcd_putchar("mynamehung");
delay_ms(5000);
}
void main()
{ trisb=0xff;
enable_interrupts(INT_RB);
enable_interrupts(INT_EXT);
ext_int_edge( H_TO_L );
enable_interrupts(GLOBAL);
lcd_init();
lcd_putcmd(0x01);//xoa man hinh
lcd_putcmd(0x80);
lcd_putchar("hello");
delay_ms(5000);
while(1);


}
các bác giúp em với.thanks các bác nhiều
ah,còn một vấn đề nữa là muốn thoát khỏi ngắt thì làm thế nào ạ(ví dụ đang làm ctrinh thu nhất em muốn thực hiện chuong trình 2 ngay sau động tác bấm phím chẳng hạn)

thay đổi nội dung bởi: namqn, 24-11-2008 lúc 11:15 PM.
bubeohl vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 24-11-2008, 11:19 PM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Phím nối vào RB5 có bị kẹt không? Các chân điều khiển LCD của bạn nối vào đâu? Có thể có nhiễu đến các chân có tính năng interrupt-on-change của PORTB dẫn đến ngắt. Bạn nên cho biết sơ đồ nguyên lý của mạch thử nghiệm mà bạn đang dùng.

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-11-2008, 11:11 AM   #3
bubeohl
Đệ tử 1 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 17
:
ko phải thế đâu bác ah.em đã dùng 2 mạch để test liền mà đều chung một kết quả,nó cứ tự nhảy vào ngắt thôi.có thể phần mạch làm phím bấm của em chống nhiễu ko tốt lắm nhưng em nghĩ đó ko phải lí do chính gây hiện tượng trên.em đã tháo hết phần phím bấm ra khỏi mạch nhưng nó vẫn chạy như vây.trước em làm với ngắt của 877a thì okie,nhưng sang 16f887 thì die.hixhix.bác xem lại chương trình của em xem có sai chỗ nào ko?
cám ơn các bác nhé
bubeohl vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-11-2008, 04:05 PM   #4
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Bạn đọc thêm về cách xử lý I/O này, bởi vì vấn đề có thể đến từ phần cứng của bạn nếu bạn thiết kế không chuẩn. Bạn để chân sw trôi nổi hay thế nào?

Bạn nên post thiết kế của bạn lên đây để cùng tham khảo. Bạn có mặc tụ điện kèm theo không?

Về chương trình của bạn, về cơ bản đối với PIC16F887 thì cần các phần khởi tạo portB là digital nữa, vì portB của 887 có chức năng Analog.

Ngoài vấn đề này, kỹ thuật Shadow Register là một kỹ thuật cần thiết cho việc xử lý I/O đối với các dòng PIC Midrange trở xuống (PIC16F trở xuống).

Chúc vui
File Kèm Theo
File Type: pdf shadow-registers.pdf (245.4 KB, 251 lần tải)
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 25-11-2008, 11:10 PM   #5
bubeohl
Đệ tử 1 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 17
:
cám ơn bác falleaf nhiều.em sẽ nghiên cứu phần này.kiến thức của e còn nhiều thiếu sót lắm mong các bác chỉ giáo thật nhiệt tình.hihi.em sẽ xem lại các gợi ý của bác.hi vọng sẽ có kết quả sớm.
ah nhân tiện bác cho em hỏi: kĩ thuật Shadow Register thực chất là tn ạ(em sẽ đọc tài liệu bác gửi để hiểu hơn)
bubeohl vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-11-2008, 07:54 AM   #6
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Đại ý của nó là bởi khi ghi và khi đọc, mặc dù giá trị mong muốn là giá trị logic 0/1, nhưng thực tế tín hiệu ghi ra chân và tín hiệu đọc vào CPU để xử lý có thể khác nhau (mức điện áp). Để tránh tình trạng này, khi ghi ra chân PIC thì người ta ghi nhớ nó vào một biến tạm (thanh ghi đệm port - shadow register), sau đó khi đọc vào thì đọc luôn cái biến tạm này (0/1).

Kỹ thuật này dùng cho các chân I/O, và một hình thức của nó chính là việc xử lý ngắt. Một tín hiệu nhiễu hay sự trôi nổi điện áp cũng có thể gây ra hoạt động ngắt. Tuy nhiên, nếu có một biến tạm trước đó, và sử dụng nó để kiểm tra lại, hoặc dùng hình thức gây trễ bằng phần mềm để kiểm tra lại (tương tự như việc dùng tụ điện trên các nút bấm), thì việc xác nhận ngắt sẽ hiệu quả hơn, và sẽ ko gây ra các lỗi tương tự.

Tốt hơn bạn nên đọc các tài liệu hướng dẫn, chứ không nên hỏi ngay. Nó rất thừa và mất thời gian của các thành viên khác. Khi bạn đọc hiểu rồi, nếu bạn thực sự hiểu vấn đề, bạn hãy dành thời gian của mình dịch lại tài liệu đó và post lên đúng chỗ này. Như vậy, một mặt bạn sẽ hiểu vấn đề sâu hơn, mặt khác bạn sẽ giúp cho các thành viên khác nắm vấn đề nhanh hơn.

Chúc vui
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-11-2008, 11:07 AM   #7
bubeohl
Đệ tử 1 túi
 
Tham gia ngày: Jul 2008
Bài gửi: 17
:
cám ơn bác đã chỉ giáo.em mới tham gia nen chưa biết cách học tốt nhất.hihi.em sẽ nghiên cứu
bubeohl vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-12-2010, 12:55 AM   #8
dophuhoacdt
Nhập môn đệ tử
 
Tham gia ngày: Jun 2009
Bài gửi: 1
:
sữ dụng interrupt on change.

mình có viết chương trình ngắt cho interrupt on chage ở chân RB0 của port b như sau ( dùng hi-tech c viết):
void interrupt ngat(){
if(RBIE&&RBIF){
RBIF=0; // xoa co ngat
RB0=1;
cnt++;// biến này đã được khai báo rùi!
switch(cnt){
case 1:
chay8ledsTP();// đây là chương trình chạy 8 led từ trái sang phải
break;
case 2:
sangled();// sáng 8 leds
break;
default:
PORTA=0xff;
cnt=0;
}





}
}


mình viết chương trình và chương trình chạy được theo yêu cầu. nhưng gặp vấn đề như sau:
khi nhấn nút bấm nối vào chân RB0 1 lần, chương trình con chay8ledsTP chạy, nhưng khi mình bấm nút RB0 thêm lần nữa, thì chương trình con tat8leds ko chay ngay mà phải đợi chương trình chay8ledsTP chạy xong thì chương trình tat8leds mới chạy. có phải khi sữ dụng ngắt portb thì chương trình ngắt ko thực thi ngay lệnh ngắt trong lúc chương trình này đang chạy một ứng dụng khác?
dophuhoacdt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 21-12-2010, 02:46 PM   #9
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Trích:
Nguyên văn bởi dophuhoacdt View Post
sữ dụng interrupt on change.

mình có viết chương trình ngắt cho interrupt on chage ở chân RB0 của port b như sau ( dùng hi-tech c viết):
void interrupt ngat(){
if(RBIE&&RBIF){
RBIF=0; // xoa co ngat
RB0=1;
cnt++;// biến này đã được khai báo rùi!
switch(cnt){
case 1:
chay8ledsTP();// đây là chương trình chạy 8 led từ trái sang phải
break;
case 2:
sangled();// sáng 8 leds
break;
default:
PORTA=0xff;
cnt=0;
}





}
}


mình viết chương trình và chương trình chạy được theo yêu cầu. nhưng gặp vấn đề như sau:
khi nhấn nút bấm nối vào chân RB0 1 lần, chương trình con chay8ledsTP chạy, nhưng khi mình bấm nút RB0 thêm lần nữa, thì chương trình con tat8leds ko chay ngay mà phải đợi chương trình chay8ledsTP chạy xong thì chương trình tat8leds mới chạy. có phải khi sữ dụng ngắt portb thì chương trình ngắt ko thực thi ngay lệnh ngắt trong lúc chương trình này đang chạy một ứng dụng khác?
nó vẫn chạy ngay có thể là do hàm [sangled();// sáng 8 leds]nhanh quá mà bạn không nhìn thấy.
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề.
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 05:52 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam