PDA

View Full Version : Thắc mắc về ngắt ngoài


photoman
09-01-2008, 12:23 PM
Mình đang dùng con dsPic30f4011 ,đến phần ngắt ngoài của nó thì thậy có điểm lạ như sau :

void Init_INT2(void)
{
_INT2IF=0;
_INT2EP=1;
_INT2IE=1;
}

void Init_PortsForINT2(void)
{
_TRISD1=0;
_LATD1=0;
}

trên đây là hai hàm dùng để thiết lập port và ngắt cho INT2 , _INT2EP là bit chọn sườn ngắt (lên hoặc xuống) . Điều lạ là với cùng một giá trị của LATD1 thì việc thay đổi _INT2EP không có tác động gì :
_LATD1=0 --> sườn tác động luôn là sườn lên.
_LATD1=1 --> sườn tác động luôn là sườn xuống.

Nếu vậy thì bit _INT2EP có ý nghĩa gì nhỉ ?
Thêm một điểm nữa em thấy dsPic rất vô lý khi muốn kiểm tra một đầu vào thì phải đặt nó là đầu ra ( _TRISD1=0;) nghe nó chả logic gì cả .

Các bác làm ơn giải thích giùm em mấy cái trên với. Thanks lot !

namqn
09-01-2008, 06:08 PM
Mình đang dùng con dsPic30f4011 ,đến phần ngắt ngoài của nó thì thậy có điểm lạ như sau :

void Init_INT2(void)
{
_INT2IF=0;
_INT2EP=1;
_INT2IE=1;
}

void Init_PortsForINT2(void)
{
_TRISD1=0;
_LATD1=0;
}

trên đây là hai hàm dùng để thiết lập port và ngắt cho INT2 , _INT2EP là bit chọn sườn ngắt (lên hoặc xuống) . Điều lạ là với cùng một giá trị của LATD1 thì việc thay đổi _INT2EP không có tác động gì :
_LATD1=0 --> sườn tác động luôn là sườn lên.
_LATD1=1 --> sườn tác động luôn là sườn xuống.

Nếu vậy thì bit _INT2EP có ý nghĩa gì nhỉ ?
Thêm một điểm nữa em thấy dsPic rất vô lý khi muốn kiểm tra một đầu vào thì phải đặt nó là đầu ra ( _TRISD1=0;) nghe nó chả logic gì cả .

Các bác làm ơn giải thích giùm em mấy cái trên với. Thanks lot !
Bạn cũng không có lý lắm khi chỉ đưa code mà không cho biết mạch phần cứng ra sao, và code trên được lấy từ đâu.

Thân,

photoman
09-01-2008, 06:56 PM
Ấy .Chỉ là kiểm tra ngắt ngoài là chân D1 để thử nghiệm thôi mà ,với lại mạch em chỉ có thach anh với jump thui .Hi Hi .
Code trên là do em tự viết . Tất cả code đều chỉ có thế với hàm xử lý ngắt nữa thui , em thấy không quan trọng nên không copy lên .
Mong bác giải đáp giùm em

namqn
09-01-2008, 10:34 PM
Bạn đã thử với _TRISD1 = 1 chưa?

Khi đặt _TRISD1 = 0, làm thế nào bạn tạo ra xung ngắt tại chân D1? Bạn có thực hiện thao tác gì trong main() không?

Thân,

photoman
09-01-2008, 10:51 PM
_TRISD1 = 1 thì ngắt sảy ra liên tục không thể kiểm soát được .
Còn khi đặt _TRISD1=0 , em tạo xung ngát bằng cách dùng dây châm +5v hoặc 0v vào pin D1 thôi .
Hàm main() em hiển thị LCD , trong ngắt em đặt một biến để đếm số lần ngắt rôig hiển thị biến đó ra LCD .

namqn
09-01-2008, 11:03 PM
_TRISD1 = 1 thì ngắt sảy ra liên tục không thể kiểm soát được .
Còn khi đặt _TRISD1=0 , em tạo xung ngát bằng cách dùng dây châm +5v hoặc 0v vào pin D1 thôi .
Hàm main() em hiển thị LCD , trong ngắt em đặt một biến để đếm số lần ngắt rôig hiển thị biến đó ra LCD .
Tôi đoán ra bạn đã dùng cách đó để tạo ngắt khi đặt _TRISD1=0 (làm cách đó dễ làm hỏng chân của vi mạch lắm). Từ thông tin rằng với _TRISD1 = 1 thì dsPIC bị ngắt liên tục, tôi cho rằng chân D1 đang bị nhiễu mạnh. Bạn nên dùng một điện trở khoảng vài k để kéo lên/kéo xuống chân D1, kết hợp với một nút nhấn nối thích hợp vào chân D1 để tạo xung ngõ vào. Có lẽ bây giờ bạn hiểu rằng vì sao tôi đề nghị bạn cho biết mạch phần cứng. Nếu bạn không chịu khó vẽ một mạch nguyên lý cho phần cứng đang dùng để thử nghiệm, và post lên diễn đàn, những người đang tìm cách giúp bạn như tôi sẽ phải giả thiết rất nhiều điều, và sẽ gặp nhiều khó khăn để chỉ ra cho bạn những chỗ không ổn.

Thân,

photoman
10-01-2008, 11:50 AM
cám ơn bác namqn đã giúp đỡ. ĐÚng là trong mạch em không có điện trở treo vào các chân vdk . Trong lập trình em khắc phục bằng cách đặt _TRIS=0 và cho LAT=1 để kiểm tra mức 0 ở ngõ vào . Bây giờ mọi vấn đề đã được giải quyết . zui wa' ha ha