打印

PIC C语言中断程序,可不可以分几个部分来写?

[复制链接]
9537|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zacharyguo|  楼主 | 2011-7-12 13:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PIC C语言中断程序,可不可以分几个部分来写?
    因为 void interrupt ISR(void)
      {
          //各种中断处理程序。
       }
这样很不方便,不适合模块化设计。
不知道各位有什么方法,可以将各个中断处理部分,分模块写?
请指教。。谢谢。。。
沙发
dodome521| | 2011-7-12 13:53 | 只看该作者
PIC16只有一个中断入口。

使用特权

评论回复
板凳
yewuyi| | 2011-7-12 14:11 | 只看该作者
怎么不适合模块化设计了呢?

程序结构是很清晰的,例如:
void interrupt ISR(void)
{
if(TMR0IE&&TMR0IF){}
if(TMR1IE&&TMR1IF){}
...
...
}

使用特权

评论回复
地板
庄庄| | 2011-7-12 15:45 | 只看该作者
PIC16 就是这样,PIC18有两级。不过你可以定义子程序,例如:
void interrupt ISR(void)
{
if(1){函数1}
if(2){函数2}
}
...
...

使用特权

评论回复
5
yewuyi| | 2011-7-12 16:46 | 只看该作者
尽量不要在中断中添加函数,因为PIC的堆栈空间是固定的,长度有限,使用函数的话,则会占用宝贵的堆栈空间。

可以使用宏的方式,例如:
#define  TIME0INT()     TIMEIE=0;

使用特权

评论回复
6
zacharyguo|  楼主 | 2011-7-12 16:57 | 只看该作者
我想把不同的处理程序放在不同的文件 中。。。。现在这样,很难分开。。。

使用特权

评论回复
7
yewuyi| | 2011-7-12 17:29 | 只看该作者
我想把不同的处理程序放在不同的文件 中。。。。现在这样,很难分开。。。
zacharyguo 发表于 2011-7-12 16:57



多文件方式也不是你这样把代码割的零零碎碎的,一般是中断单独建立.C、.H文件,这在各种MCU中都是如此。

使用特权

评论回复
8
daiwei123456| | 2011-7-16 14:07 | 只看该作者
我用过的16系列的中断入口只有一个

使用特权

评论回复
9
hwwyhy| | 2011-7-16 14:29 | 只看该作者
本帖最后由 hwwyhy 于 2011-7-20 16:01 编辑

//*************************************
// Interrupt ServiceRoutine
//*************************************
void interrupt ServiceRoutine(void)
{
        //----- TMR0 Interrupt -----//
        if(T0IE && T0IF)
        {
                T0IF = 0;
                TMR0=-250;
                ISR_Timer0();
        }
        //----- TMR1 Interrupt -----//
        if(TMR1IE && TMR1IF )
        {
                TMR1IF=0;
                TMR1H=0xE2;TMR1L=0x6F;
                ISR_Timer1();
        }
         ……

这是我以前写的,不知道符合LZ的意思不?呵呵

使用特权

评论回复
10
jackhwang| | 2011-7-24 21:27 | 只看该作者
PIC中低端单片机中断只有一个入口,只有这样写!

使用特权

评论回复
11
echenlf| | 2011-8-11 15:41 | 只看该作者
只有写得好,符合要求,不要拘泥神马模块化

使用特权

评论回复
12
dogglove| | 2011-8-13 09:30 | 只看该作者
pic18有两个中断入口, pic16一个,

使用特权

评论回复
13
jamin.x| | 2011-10-21 07:23 | 只看该作者
学习了

使用特权

评论回复
14
cynfox| | 2011-10-29 10:10 | 只看该作者
5楼: 尽量不要在中断中添加函数,因为PIC的堆栈空间是固定的,长度有限,使用函数的话,则会占用宝贵的堆栈空间。

可以使用宏的方式,例如:
#define  TIME0INT()     TIMEIE=0;

能否说得详细些

使用特权

评论回复
15
电子三极管| | 2011-10-29 12:53 | 只看该作者
PIC16系列比较适合初学学习

使用特权

评论回复
16
diweo| | 2011-10-29 17:36 | 只看该作者
以下内容节选自《MPLAB® C30C 编译器用户指南》,但同样适用于PIC16系列的编程。

7.3.1 编写中断服务程序的要领
编写ISR 的要领为:
• 不带参数并以void 返回值类型声明ISR (强制)
• 不要通过一般程序调用ISR (强制)
• 不要用ISR 调用其他函数(建议)
MPLAB C30 的ISR 和任何其他C 函数一样,可以有局部变量,可以访问全局变量。
但是, ISR 需要声明为没有参数,没有返回值。这是必须的,因为ISR 作为对硬件中
断或陷阱的响应,对它的调用与一般C 程序异步(即ISR 不是按通常的方式调用的,
因此不能有参数和返回值)。
ISR 只能通过硬件中断或陷阱调用,不能通过其他C 函数调用。ISR 使用中断返回
(RETFIE)指令退出函数,而不是使用一般的RETURN 指令。不恢复现场使用
RETFIE 指令退出中断服务程序会破坏处理器资源,如status 寄存器的值。
最后,由于中断响应时间的原因,建议不要使用ISR 调用其他函数。更多信息请参阅
第7.6 节“中断响应时间”

7.6 中断响应时间
有两个因素影响中断源发生到执行ISR 代码第一条指令之间的周期数。这两个因素
是:
• 处理器处理中断时间 — 处理器识别中断并跳转到中断向量第一个地址的时间。这
个值与具体器件和所使用中断源有关,为确定这个值的大小,请参考相应器件的数
据手册。
• ISR 代码 — MPLAB C30 在ISR 中保存它使用的寄存器,这包括工作寄存器和
RCOUNT 特殊功能寄存器。而且,如果ISR 调用一个普通的函数,编译器要保存
所有的工作寄存器和RCOUNT,即使在ISR 中没有显式使用这些寄存器。必须要
保存这些寄存器,因为一般来说,编译器不知道被调用函数使用了哪些资源。

使用特权

评论回复
17
fanwei326| | 2011-11-15 11:49 | 只看该作者
只有写得好,符合要求,不要拘泥神马模块化

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

24

帖子

1

粉丝