pk178
05-12-2010, 10:09 PM
Chào các bác, em đang gặp phải vấn đề với chú pps này, em chỉ làm để test thôi, em thử với con dsPIC33FJ12MC202, với ngắt ngoài INT0 thì ko vấn đề gì, nhưng với ngắt ngoài INT1 và INT2 thì em không chọn được chân nối với 2 ngắt này, mặc dù em đã tham khảo code ở trên diễn đàn của Microchip.
Đây là code của em, cứ mỗi khi có ngắt ngoài xảy ra thì thay đổi mức logic của chân A0 :
#include <p33FJ12MC202.h>
#include <pps.h>
_FOSCSEL(FNOSC_FRC) // Su dung thach anh noi
_FGS(GSS_OFF&GWRP_OFF) // Tat che do bao ve code
_FWDT(FWDTEN_OFF) // Khong dung watchdog
_FPOR(PWMPIN_ON&FPWRT_PWR1) // Cho phep chan PWM, Cam Power on reset
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void interrupt_init();
void _ISR _INT0Interrupt(void);
void _ISR _INT1Interrupt(void);
void _ISR _INT2Interrupt(void);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void main(){
TRISB = 0;
LATB = 0;
TRISA = 0;
TRISB = 0xFFFF;
interrupt_init();
while(1);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void interrupt_init(){
PPSUnLock; // Unlock
_INT1R = 0; // Chan RP0 la chan ngat ngoai 1
_INT2R = 3; // Chan RP3 la chan ngat ngoai 2
PPSLock; // Lock
_INT0IE = 1; // Cho phep ngat ngoai 0
_INT1IE = 1; // Cho phep ngat ngoai 1
_INT2IE = 1; // Cho phep ngat ngoai 2
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void _ISR _INT0Interrupt(void){
_LATA0 = !_LATA0;
IFS0 = 0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void _ISR _INT1Interrupt(void){
_LATA0 = !_LATA0;
IFS0 = 0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void _ISR _INT2Interrupt(void){
_LATA0 = !_LATA0;
IFS0 = 0;
}
Các bác xem giúp em xem chương trình trên có lỗi gì không mà em mô phỏng trên proteus không thấy chạy ! Cám ơn các bác nhiều !
Đây là code của em, cứ mỗi khi có ngắt ngoài xảy ra thì thay đổi mức logic của chân A0 :
#include <p33FJ12MC202.h>
#include <pps.h>
_FOSCSEL(FNOSC_FRC) // Su dung thach anh noi
_FGS(GSS_OFF&GWRP_OFF) // Tat che do bao ve code
_FWDT(FWDTEN_OFF) // Khong dung watchdog
_FPOR(PWMPIN_ON&FPWRT_PWR1) // Cho phep chan PWM, Cam Power on reset
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void interrupt_init();
void _ISR _INT0Interrupt(void);
void _ISR _INT1Interrupt(void);
void _ISR _INT2Interrupt(void);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void main(){
TRISB = 0;
LATB = 0;
TRISA = 0;
TRISB = 0xFFFF;
interrupt_init();
while(1);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void interrupt_init(){
PPSUnLock; // Unlock
_INT1R = 0; // Chan RP0 la chan ngat ngoai 1
_INT2R = 3; // Chan RP3 la chan ngat ngoai 2
PPSLock; // Lock
_INT0IE = 1; // Cho phep ngat ngoai 0
_INT1IE = 1; // Cho phep ngat ngoai 1
_INT2IE = 1; // Cho phep ngat ngoai 2
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void _ISR _INT0Interrupt(void){
_LATA0 = !_LATA0;
IFS0 = 0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void _ISR _INT1Interrupt(void){
_LATA0 = !_LATA0;
IFS0 = 0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void _ISR _INT2Interrupt(void){
_LATA0 = !_LATA0;
IFS0 = 0;
}
Các bác xem giúp em xem chương trình trên có lỗi gì không mà em mô phỏng trên proteus không thấy chạy ! Cám ơn các bác nhiều !