查看完整版本: PSOC中断

sxna_yzq 2008-6-18 19:36

PSOC中断

谁有PSOC中断的程序,可以分享一下吗

sxna_yzq 2008-6-18 19:39

我想用p1.3、p1.4作为外部中断口,但是设置和编程总不成功,谁有做好的中断,分享一下吧!

独自唱和 2008-6-18 22:23

以前我也尝试过,不过后来好像没用上,所以没有现成的好程序,可以讨论一下。

#pragma interrupt_handler PSoC_GPIO_ISR   
void  PSoC_GPIO_ISR()
{
……
}

要配置一个GPI/O的中断,必须使能引脚中断与选择中断状态(读改变、上升沿中断、下降沿中断),这个可以在器件编辑子系统的Interconnect View模式下完成。[color=blue]在多个引脚上使能中断时,你的ISR必须提供一个机制来决定哪一个引脚是中断源。[/color]
[color=#0000ff][/color]
你选择了2个引脚作为外部中断口,由于所有口的中断都连接到一个中断地址,你就需要判断到底是哪个I/O产生的中断,这个到底怎么弄我不太明白。

按照下面的步骤操作:
(1)设置中断模式;
(2)允许GPI/O中断;
(3)允许GPI/O中断被挂起;
(4)打开全局中断。

以上都是些通常性的建议,可能你也都了解。
[color=blue]M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);
[/color][color=blue]M8C_DisableIntMask(INT_MSK0, INT_MSK0_GPIO);[/color]
这2个语句是否出现在了你的中断执行程序中?

还有,不知道你把相应的端口驱动模式设置成了什么,是否设置成了Pull Up模式?

翻遍所有的PSoC例子,我没有找着合适的,只有我们以前师兄做的一个电流源的程序当中应用到了这个功能,他的P1_2管脚应该是外部中断口,不过他的设计比较复杂,我还是发给你吧,不知道能不能有所帮助。

顺便说一句:如果你调试成功了的话,一定不要忘了和我们分享一下。:)

[[i] 本帖最后由 独自唱和 于 2008-6-18 22:34 编辑 [/i]]

sxna_yzq 2008-6-19 12:23

谢谢帮忙!!^_^

sxna_yzq 2008-6-19 12:27

M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);
M8C_DisableIntMask(INT_MSK0, INT_MSK0_GPIO);
这两个语句我不太懂,能给解释一下吗,是什么作用呀?

sxna_yzq 2008-6-19 13:15

#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
void    timer_handler(void);
#pragma interrupt_handler  timer_handler;
void main()
{ int i;
  M8C_EnableIntMask( INT_MSK0, INT_MSK0_GPIO );
  M8C_EnableGInt;
  PRT0DR|=0x02;  //将p0.1置为高电平
  while(1)
  {
  }
}
void timer_handler(void)   //p0.0的中断响应程序(p0.0为外部中断入口)
{int a,b,c;
  while(1)                //p0.1口高低电平延时转变  
  {PRT0DR&=0xfd;          //将p0.1置为低电平
   for(a=0;a<=16;a++)
    {for(b=0;b<=100;b++)
     {for(c=0;c<=100;c++){}}}
   PRT0DR|=0x02;          //将p0.1置为高电平
   for(a=0;a<=16;a++)
    {for(b=0;b<=100;b++)
     {for(c=0;c<=100;c++){}}}
  }
}
    我的这个程序是设定p0.0为外部中断入口。当无中断时,p0.1为高电平;当产生中断时,p0.1为高低电平延时转变。p0.0为下降沿触发中断方式。
    但是,我导入psoc中始终p0.1为高电平,中断触发无效。你能帮我看看是什么原因吗?具体内容我放在了附件中,谢谢!!

独自唱和 2008-6-19 19:19

应该是对INT_MSK0寄存器的定义,INT_MSK0是中断屏蔽寄存器。
[attach]2665[/attach]
里面有GPIO对应的屏蔽位,如果不使能被提交中断的相应屏蔽位,则这个被提交的中断不能进入挂起状态。如果INT_MSKx被清除,它的每一位将阻碍相应被提交中断成为一个挂起中断,如果INT_MSKx中的某一位被置位,则与之相关的中断源所产生的中断将成为一个挂起中断。
[attach]2666[/attach]

独自唱和 2008-6-19 19:27

你的程序似乎存在比较大的问题。在你的程序中,[color=blue]#pragma interrupt_handler [b] timer_handler[/b][/color]中的[color=#0000ff]timer_handler[/color]到底指的是什么呢,因为据我所知,它应该是有具体所指的,比如说作为内部中断源的某个计数器或者定时器,又或者是管脚,具体形式应该如下:
#pragma interrupt_handler [color=blue][b]Timer16_1[/b][/color]_ISR         //declare the timer16's interrupt function
void [color=blue][b]Timer16_1[/b][/color]_ISR(void)                        //define the timer's interrupt function
    {         
……                                    
    }
或者
#pragma interrupt_handler PSoC_GPIO_ISR   
void  PSoC_GPIO_ISR()
{
……
}

而在你的工程时,我没有找到任何计数器或者定时器模块,我觉得这个设计应该是有问题的。

tony 2008-6-19 20:28

本人专门替别人设计中断扩展模块,有需求请站内联系,::datu15::

sxna_yzq 2008-6-20 15:09

//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------
#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules

void main()
{ M8C_EnableGInt;
  M8C_EnableIntMask( INT_MSK0, INT_MSK0_GPIO );
  PRT0DR|=0x02;     //将p0.1置为高电平
  while(1)
  { }
}
#pragma interrupt_handler PSoC_GPIO_ISR
void PSoC_GPIO_ISR()     //p0.0的中断响应程序(p0.0为外部中断入口)
{int a,b,c;
  while(1)
  {PRT0DR&=0xfd;         //将p0.1置为低电平
   for(a=0;a<=20;a++)    //延时
    {for(b=0;b<=100;b++)
     {for(c=0;c<=100;c++){}}}
   PRT0DR|=0x02;         //将p0.1置为高电平
   for(a=0;a<=20;a++)    //延时
    {for(b=0;b<=100;b++)
     {for(c=0;c<=100;c++){}}}
   }
}
  我按照你说的做了改进。其中,p0.0为上升沿触发中断方式;p0.1为输出高低电平口。当无中断时,p0.1为高电平;当产生中断时,p0.1为高低电平延时转变。
   但是,我导入psoc芯片中,中断还是无法触发,p0.1始终为高电平,实在是令我不知所措了。具体内容我放在了附件中,能抽时间再帮我看看吗?又给添麻烦发了,真是不好意思呀,呵呵。

sxna_yzq 2008-6-20 16:01

不好意思,p0.0为下降沿中断,我上面输错了,其他内容不变,你能帮我看看为什么无法中断吗

独自唱和 2008-6-20 22:53

回复 11楼 的帖子

总算找着相应的范例程序了,之前我自己照着设想的试了一下果然也不行,原来这其中还有些问题要解决。
[url]http://www.psocdeveloper.com/forums/viewtopic.php?t=1586&postdays=0&postorder=asc&start=0[/url]
这个网址是我好不容易搜到的,网上相关的资源实在是太少了,不过这个帖很不错,解决了我们可能遇到的问题,你好好看看吧,对我们的帮助很大。
顺便说一句:psocdeveloper这个论坛是个很好的第三方论坛。

sxna_yzq 2008-6-24 09:41

谢谢你,呵呵

u3360601 2008-8-8 06:04

感謝啦
我寫中斷寫好久了
多謝妳的範例
页: [1]
查看完整版本: PSOC中断