中断处理18F4550 PIC

时间:2016-11-04 16:14:48

标签: embedded interrupt pic microchip

当谈到18F4550 PIC时,我试图让自己熟悉Interrupts。此时我已经编写了一个软件,只要INT0引发一个标志就会点亮一个LED。 我的代码声明每隔500毫秒,INT0将引发一个标志,并且“应该”跳入ISR并启动一个LED,同时“在端口C和端口D之间传输虚拟数据” 我已经尝试过调试,但是一旦调试器到达将INT0标志设置为1的代码,调试器就会说“当前PC没有找到源代码行”。 这是下面的代码。非常感谢任何形式的帮助。非常感谢!

请注意我使用的是MPLAB X和PicKit3

#include <xc.h>
#include <p18f4450.h>
#include <stdlib.h>
#define mybit LATBbits.LATB1  //LED
#define _XTAL_FREQ 10000000   //Using a crystal oscillator

void chk_isr(void);          
void INT0_ISR(void);
void delay(unsigned int);

#pragma interrupt chk_isr   //used for high-priority interrupt only

void chk_isr (void)
{
    if(INTCONbits.INT0IF == 1)  //INT0 causes interrupt?
        INT0_ISR();             //Yes, Execute INT0ISR

}

#pragma code My_HiPrio_Int=0x08//high priority interrupt
void My_HiPrio_Int (void)
{
    asm("GOTO chk_isr");
}

void main(void)
{
    TRISBbits.TRISB1 = 0;   //RB1 = output

    mybit = 0;              //Initially LED is OFF
    TRISC = 0xFF;           //PORTC = input
    TRISD = 0;              //PORTD = output


    INTCONbits.INT0IF = 0;  //clear INT0
    INTCONbits.INT0IE = 1;  //enable INT0 interrupt

    INTCONbits.GIE = 1;     //enable all interrupts globally

    while(1)
    {
        PORTD = PORTC;          
        delay(500);         //After 500 ms
        INTCONbits.INT0IF = 1; //Flag

    }
}


void INT0_ISR(void)
{
    mybit=~mybit;           //Toggle LED
    INTCONbits.INT0IF = 0;  //clear INT0 Flag
}

void delay(unsigned int delayInput) {
    unsigned int mul = delayInput/50;
    unsigned int count = 0;
    for (count = 0; count <= mul; count ++)
        __delay_ms(50);
}

0 个答案:

没有答案