打印

不能进入中断

[复制链接]
567|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zyf部长|  楼主 | 2018-2-11 14:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AI, LED, TE, BLE, AN
使用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 ;
}

但是并不能进入中断,求大虾帮忙解决,不胜感激
沙发
xxmmi| | 2018-2-11 14:46 | 只看该作者
中断服务入口在Boot.asm中定义了么?

使用特权

评论回复
板凳
kangzj| | 2018-2-11 14:49 | 只看该作者

http://www.cypress.com/?rID=48990
这个例程一定会帮助你解决问题

使用特权

评论回复
地板
zyf部长|  楼主 | 2018-2-11 14:52 | 只看该作者
嗯 也定义了 但是还是没用

使用特权

评论回复
5
zwll| | 2018-2-11 14:56 | 只看该作者
比较一下你的和他的有什么不同啊

使用特权

评论回复
6
chuxh| | 2018-2-11 14:58 | 只看该作者
把中断代码写在单独的文件里。

使用特权

评论回复
7
renyaq| | 2018-2-11 15:02 | 只看该作者
问题问题已经解决,现发上来供大家共同探讨
测试代码:
#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
juventus9554| | 2018-2-11 15:05 | 只看该作者
你确定:
INT0_ISR:
     lcall _Key_ISR       //Key_ISR是我定义的中断服务函数,前面的“_”不能省
RETI

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

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

使用特权

评论回复
9
stly| | 2018-2-11 15:09 | 只看该作者

还有,你确定:
同样在boot.tpl文件中,将   
   org 08h                 ;INT0 Interrupt Vector
     ljmp    INT0_ISR
      reti
修改为
      org 08h                     ;INT0 Interrupt Vector
      ljmp     _Key_ISR       //同样 “_”不能省
         reti
是ljmp,而不是lcall?

使用特权

评论回复
10
zyf部长|  楼主 | 2018-2-11 15:11 | 只看该作者


测试是实际硬件
我理解就像调用一个函数,在汇编里可以用ljmp、jmp、call、lcall来实现,具体该用哪条?

使用特权

评论回复
11
llljh| | 2018-2-11 15:15 | 只看该作者

第2点呢

使用特权

评论回复
12
zyf部长|  楼主 | 2018-2-11 15:18 | 只看该作者
可以对比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
均能正确响应


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

使用特权

评论回复
13
zyf部长|  楼主 | 2018-2-11 15:21 | 只看该作者

嗯,我再好好缕一缕吧,有了好消息及时通知大家,结贴喽

使用特权

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

本版积分规则

694

主题

7102

帖子

8

粉丝