打印

CY7C63813的INT0做外部中断输入

[复制链接]
1270|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gongche|  楼主 | 2014-9-6 15:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用CY7C63813的INT0做外部中断输入,配置为:
Input_CMOS ;Open Drain,Pullup;FallingEdge

程序为
#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
#pragma interrupt_handler KeyISR  //定义中断服务函数button_svr()
void Delay_MS(void);
BYTE LedFlag = 0 ;
void main(void)
{

// Insert your main routine code here.
  M8C_EnableGInt ;    // Uncomment this line to enable Global Interrupts
  M8C_EnableIntMask(INT_MSK0,INT_MSK0_GPIO_PORT0);
  while(1)
  {
  }
}
void KeyISR(void)   //中断服务程序
{
  LedFlag = ~LedFlag ;
  if(LedFlag)
   P0DATA = 0x7f ;
  else
      P0DATA = 0xff ;
}

但是并不能进入中断,求大虾帮忙解决,不胜感激
沙发
huwr| | 2014-9-6 15:18 | 只看该作者
中断服务入口在Boot.asm中定义了么?

使用特权

评论回复
板凳
huanghuac| | 2014-9-6 15:19 | 只看该作者
http://www.cypress.com/?rID=48990
这个例程一定会帮助你解决问题

使用特权

评论回复
地板
gongche|  楼主 | 2014-9-6 15:20 | 只看该作者
嗯 也定义了 但是还是没用

使用特权

评论回复
5
happy_10| | 2014-9-6 15:21 | 只看该作者
比较一下你的和他的有什么不同啊

使用特权

评论回复
6
冰清玉洁| | 2014-9-6 15:22 | 只看该作者
把中断代码写在单独的文件里。

使用特权

评论回复
7
gongche|  楼主 | 2014-9-6 15:24 | 只看该作者
问题问题已经解决,现发上来供大家共同探讨
测试代码:
#include <m8c.h>      
#include "PSoCAPI.h"   

#pragma interrupt_handler Key_ISR      //定义中断服务函数Key_ISR

BYTE LedFlag = 0 ;
void main(void)
{
        M8C_EnableGInt ;            
        M8C_EnableIntMask(INT_MSK0,INT_MSK0_GPIO_INT0);      //注意这里和原帖的区别
         while(1);
}

void Key_ISR(void)      //中断服务程序
        {
                LedFlag = ~LedFlag ;
                if(LedFlag)
                     P0DATA = 0x7f ;   
                else
                     P0DATA = 0xbf ;
               
        }
关于boot.tpl的设置问题:
jxin传的连接里的地方我修改成:
INT0_ISR:
     lcall _Key_ISR       //Key_ISR是我定义的中断服务函数,前面的“_”不能省
RETI

这样之后能进入中断服务程序,但是我调试发现只能进入一次中断就“挂”了,ps:我测试应该没出错

随后,我再修改一个地方,程序就按自己的要求“跑”起来了:
同样在boot.tpl文件中,将   
   org 08h                 ;INT0 Interrupt Vector
     ljmp    INT0_ISR
      reti
修改为
      org 08h                     ;INT0 Interrupt Vector
      ljmp     _Key_ISR       //同样 “_”不能省
         reti
哈哈,成功解决了中断问题
注意:这里我用的是外部中断0,对应其datasheet,它的中断入口地址为08h,若是其他中断,我的理解找到对应的中断入口地址修改即可,在boot.tpl里面有。

使用特权

评论回复
8
wenfen| | 2014-9-6 15:25 | 只看该作者
你确定:
INT0_ISR:
     lcall _Key_ISR       //Key_ISR是我定义的中断服务函数,前面的“_”不能省
RETI

是lcall 不是ljmp? 在您“进入一次中断就“挂”了“ 的Project中?

可以传上您的这个Project大家分享一下?

使用特权

评论回复
9
wenfen| | 2014-9-6 15:27 | 只看该作者
还有,你确定:
同样在boot.tpl文件中,将   
   org 08h                 ;INT0 Interrupt Vector
     ljmp    INT0_ISR
      reti
修改为
      org 08h                     ;INT0 Interrupt Vector
      ljmp     _Key_ISR       //同样 “_”不能省
         reti
是ljmp,而不是lcall?

使用特权

评论回复
10
gongche|  楼主 | 2014-9-6 15:28 | 只看该作者
测试是实际硬件

使用特权

评论回复
11
gongche|  楼主 | 2014-9-6 15:28 | 只看该作者
我理解就像调用一个函数,在汇编里可以用ljmp、jmp、call、lcall来实现,具体该用哪条?

使用特权

评论回复
12
zhuhuis| | 2014-9-6 15:32 | 只看该作者
第2点呢

使用特权

评论回复
13
gongche|  楼主 | 2014-9-6 15:33 | 只看该作者
可以对比C51中断的汇编
ORG 0000H
LJMP MAIN   ;跳到主程序
ORG 0003H   ;中断0 入口
LJMP INSER0  ;到中断服务0

所以  org      08h
          ...............
相类似

在测试中
当  INT0_ISR: 中为lcall  _Key_ISR时, ORG  08H中为:
(1)ljmp  INT0_ISR 时只响应一次中断;
(2)ljmp _Key_ISR正确响应中断

当  INT0_ISR:  中为ljmp  _Key_ISR时,ORG 08H中可为:ljmp  INT0_ISR / ljmp _Key_ISR
均能正确响应


测试时是这情况,有空继续测试

使用特权

评论回复
14
wenfen| | 2014-9-6 15:34 | 只看该作者
我明白了,赞楼主

使用特权

评论回复
15
gongche|  楼主 | 2014-9-6 16:07 | 只看该作者
呵呵,结贴了,多谢大家

使用特权

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

本版积分规则

768

主题

9410

帖子

2

粉丝