PIC中断不同型号的不同写法

转载 2016年08月31日 09:02:17

PIC中断不同型号的不同写法

[转载]原文地址:http://blog.sina.com.cn/s/blog_77b8b43b0102uwdl.html 中断作者:姚远

PIC单片机有多个中断源,16系列只有一个中断入口,18系列有两个中断入口,不同编译器下书写格式又不大一样。网上资源千篇一律,也不够系统,只是简单的罗列程序,代码生存的环境不一样也少有说明。在此做个简单的总结,因为又走了弯路…

1.先说18系列(MCC18编译器下):

MPLAB C18不自动把中断服务程序放在中端向量处。通常将GOTO指令放在中断向量处,从而把控制权转交给相应中断服务程序。

void low_isr(void);
void high_isr(void); 
*****************************低级中断入口及服务子程序************************************/
#pragma code low_vector=0x18//低优先级中断入口
void interrupt_at_low_vector(void)
{
 _asm  GOTO low_isr  _endasm
}

#pragma interrupt low_isr
#pragma code
void low_isr(void)
{
    //低优先级中断服务函数写在这里
}
*****************************高级中断入口及服务子程序************************************/
#pragma code high_vecotr=0x08//高优先级中断入口
void interrupt_at_high_vector(void)
{
 _asm  GOTO high_isr  _endasm
}

#pragma code
#pragma interrupt high_isr
void high_isr(void)
{
    //高优先级中断服务函数写在这里
}

2.再说18系列(PICC18编译器下):

void PIC18F_High_isr(void);
void PIC18F_Low_isr(void);

*****************************低级中断服务子程序************************************/
#pragma interrupt  lowlow_priority   PIC18F_Low_isr
void PIC18F_Low_isr (void)
{
        //低优先级中断服务函数写在这里
}
*****************************高级中断服务子程序************************************/
#pragma interrupt  PIC18F_High_isr
void PIC18F_High_isr (void)
{
       //高优先级中断服务函数写在这里
}

3.说16系列(PICC编译器下)(只有一个中断入口,无所谓高了就):

void interrupt isr (void)
{
      //中断服务函数写在这里
}

 void init_interrupt()
{

     GIE=0;
     PEIE=1;
     IPEN=1;

    //TMR1IE=1;
    //TMR1IF=0;
    //TMR1IP=0;
    //TMR1L=61;                    
    //T1CON=0xC7;//set up timer0 - 8bit -prescaler

     //TMR0IE=1;
     //TMR0IF=0; 
     //TMR0IP=0;
     //TMR0L=61;                     
     //T0CON=0xC7;//set up timer0 - 8bit -prescaler 1:256 

      GIE=1;
}

4.说dsPIC30系列(XC16编译器下):

dsPIC30系列,对于每个中断源,用户可分配的中断优先级位(IP<2:0>) ,位于 IPCx 寄存器中每个半字节的最低 3位中。每个半字节的 bit 3 未使用,读为 0。这些位定义了用户分配给特定中断的优先级。用户可分配的优先级为从 0 到 7,0是最低优先级,7是最高优先级。
下面是一个定时器的例子:

void time1_init(void)
{
    T1CON=0;
    TMR1=0;
    PR1=(Fcy/256);
    T1CON=0x8030;
    IPC0bits.T1IP=3;//这里定义了优先级 为3
    IFS0bits.T1IF=0;
    IEC0bits.T1IE=1;

}

void __attribute__((interrupt, auto_psv)) _T1Interrupt(void)
{
   //中断服务函数写在这里    
   IFS0bits.T1IF=0;
   //LED_OVER=~LED_OVER;
}

PIC单片机入门_中断系统详解

1.中断的基本概念 当单片机正在执行程序时,出现了某些特殊状况,例如定时时间到、有键盘信号输入等,此时CPU须要暂时停止当前的程序,而转去执行处理这些事件的程序,待执行完这些特定的程序之后,再返...
  • shenziheng1
  • shenziheng1
  • 2016年11月10日 17:05
  • 1905

PIC RB0外部中断程序

#include #include //__CONFIG (CP_OFF&WDTE_OFF& BOREN_OFF&PWRTE_OFF &FOSC_HS&WRT_OFF&LVP_OFF&CPD_O...
  • flywiththejet
  • flywiththejet
  • 2015年09月18日 18:08
  • 1517

PIC单片机之中断程序

什么是中断程序呢?  形象的生活比喻就比如你现在这在看我的文章,突然你的朋友喊你一起去烤地瓜,这时候你就中断了看文章和朋友烤地瓜去了,烤完地瓜之后你又回来看文章。烤地瓜这件事就好比中断程序,他中断了...
  • superanters
  • superanters
  • 2013年01月29日 00:19
  • 11119

C++与c的写法不同在哪里?

例1,hello.cpp #include //c++的头文件不同,头文件没有.h的后缀 int main(void){ std::cout...
  • weixin_38590073
  • weixin_38590073
  • 2017年06月04日 01:03
  • 419

浅析PIC单片机定时器

什么是定时器? 定时器顾名思义就是用来定时的。在单片机应用中常常用于各种各样的定时。比如让LED灯每隔 1S 亮一次。 这个1S 就是由定时器做到的。 指令周期 指令周期就是单片机执行一个指令所...
  • chuckfql
  • chuckfql
  • 2013年11月26日 15:36
  • 4947

PIC单片机之定时器(TMR0)

什么是定时器?   定时器顾名思义就是用来定时的。在单片机应用中常常用于各种各样的定时。比如让LED灯每隔 1S 亮一次。 这个1S 就是由定时器做到的。  指令周期      指令周期就是单片...
  • superanters
  • superanters
  • 2013年01月27日 14:14
  • 13931

STM32工程不同系列芯片间的移植

1.  芯片容量的确定,往往容易疏忽。 小容量产品是指闪存存储器容量在16K至32K字节之间的STM32F101xx、 STM32F102xx和 STM32F103xx微控制器。 中容量产品是...
  • u012378698
  • u012378698
  • 2016年03月03日 20:56
  • 776

共享库中的位置无关代码(PIC)

原作者:Eli Bendersky http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-li...
  • wuhui_gdnt
  • wuhui_gdnt
  • 2016年04月08日 11:11
  • 1866

xHTML与HTML的写法有什么不同?

xhmtl我们需要注意的地方?
  • CC_jiao0126
  • CC_jiao0126
  • 2014年05月29日 11:22
  • 599

并查集的不同写法

#define MAX_SIZE 100005 int pa[MAX_SIZE]; //存储有向图的边 void init() //初始化 该函数可以根据具体情况保存和初始...
  • sxc1414749109
  • sxc1414749109
  • 2016年04月12日 17:30
  • 200
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PIC中断不同型号的不同写法
举报原因:
原因补充:

(最多只允许输入30个字)