打印

为什么我的MC9S12DG128进不了中断?

[复制链接]
4356|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yetboy|  楼主 | 2007-4-4 23:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟初学飞思卡尔的单片机,在网上找了些例程来调试。运行程序都没问题,但一进入中断就停下来了。试过了N道程序了,包括ECT,ATD,IO中断等。用的是CW4.6版本,其它版本也试过,均有同样问题。在DEBUG里面看,进中断后就停在0000这个地址上了。不知道是不是中断向量的问题。还望各位大虾不惜赐教。

相关帖子

沙发
XUHUADONG| | 2007-4-5 09:02 | 只看该作者

程序中断跑飞复位了

1,你把所有的中断都写入空程序
2,在所有的中断入口都打断点
3,DEBUG开始后看停在哪个断点
4,检查向量与你所想得是否一致

注意:MOTO的单片机有的中断是开的,在初始化时要关掉,如IRQ中断

使用特权

评论回复
板凳
free_tech| | 2007-4-5 10:26 | 只看该作者

中断向量出错

使用特权

评论回复
地板
free_tech| | 2007-4-5 10:28 | 只看该作者

有中断来了没找到入口,pc指针跑飞了

使用特权

评论回复
5
yetboy|  楼主 | 2007-4-5 10:39 | 只看该作者

能不能具体教一下应该怎样写?

能不能具体教一下应该怎样写?下面一道是道AD中断简单的例子


#include <hidef.h>
#include <mc9s12dg128.h>

interrupt void AD0(void)
{
   PORTB = ~PORTB;           //进入中断后取反PORTB各位,实现闪灯。
}

void Port_Init(void)
{
    PORTB = 0xF0;           //程序运行到这里都是正常的
    DDRB = 0xFF; 
}

void AD(void)

    //中断使能
    ATD0CTL2=0xC2;

    //转换通道数为1
    ATD0CTL3=0x20;

    //8位精度,2MHz时钟
    ATD0CTL4=0x83; 

    //右对齐,连续转换模式
    ATD0CTL5=0xA6;

    //禁止数字输入缓冲
    ATD0DIEN = 0x00; 
}


void main() 
{
  Port_Init();
  AD();
  EnableInterrupts;//开总中断,但打开后就不能动了 
  for(;;);

使用特权

评论回复
6
yetboy|  楼主 | 2007-4-5 10:43 | 只看该作者

很感谢楼上各位

请问在哪里可以找到各中断源对应的中断向量资料?

使用特权

评论回复
7
free_tech| | 2007-4-5 11:09 | 只看该作者

看mc9s12dg128.h文件

我还没有装s12的编辑器
你可以看mc9s12dg128.h中有

使用特权

评论回复
8
yetboy|  楼主 | 2007-4-5 15:43 | 只看该作者

终于找到了

在MC9S12DG128.H里面找到了中断向量表

/**************** interrupt vector table ****************/
#define VReserved63             0x0000FF80
#define VReserved62             0x0000FF82
#define VReserved61             0x0000FF84
#define VReserved60             0x0000FF86
#define VReserved59             0x0000FF88
#define VReserved58             0x0000FF8A
#define Vpwmesdn                0x0000FF8C
#define Vportp                  0x0000FF8E
#define Vcan4tx                 0x0000FF90
#define Vcan4rx                 0x0000FF92
#define Vcan4err                0x0000FF94
#define Vcan4wkup               0x0000FF96
#define VReserved51             0x0000FF98
#define VReserved50             0x0000FF9A
#define VReserved49             0x0000FF9C
#define VReserved48             0x0000FF9E
#define VReserved47             0x0000FFA0
#define VReserved46             0x0000FFA2
#define VReserved45             0x0000FFA4
#define VReserved44             0x0000FFA6
#define VReserved43             0x0000FFA8
#define VReserved42             0x0000FFAA
#define VReserved41             0x0000FFAC
#define VReserved40             0x0000FFAE
#define Vcan0tx                 0x0000FFB0
#define Vcan0rx                 0x0000FFB2
#define Vcan0err                0x0000FFB4
#define Vcan0wkup               0x0000FFB6
#define Vflash                  0x0000FFB8
#define Veeprom                 0x0000FFBA
#define VReserved33             0x0000FFBC
#define Vspi1                   0x0000FFBE
#define Viic                    0x0000FFC0
#define VReserved30             0x0000FFC2
#define Vcrgscm                 0x0000FFC4
#define Vcrgplllck              0x0000FFC6
#define Vtimpabovf              0x0000FFC8
#define Vtimmdcu                0x0000FFCA
#define Vporth                  0x0000FFCC
#define Vportj                  0x0000FFCE
#define Vatd1                   0x0000FFD0
#define Vatd0                   0x0000FFD2
#define Vsci1                   0x0000FFD4
#define Vsci0                   0x0000FFD6
#define Vspi0                   0x0000FFD8
#define Vtimpaie                0x0000FFDA
#define Vtimpaaovf              0x0000FFDC
#define Vtimovf                 0x0000FFDE
#define Vtimch7                 0x0000FFE0
#define Vtimch6                 0x0000FFE2
#define Vtimch5                 0x0000FFE4
#define Vtimch4                 0x0000FFE6
#define Vtimch3                 0x0000FFE8
#define Vtimch2                 0x0000FFEA
#define Vtimch1                 0x0000FFEC
#define Vtimch0                 0x0000FFEE
#define Vrti                    0x0000FFF0
#define Virq                    0x0000FFF2
#define Vxirq                   0x0000FFF4
#define Vswi                    0x0000FFF6
#define Vtrap                   0x0000FFF8
#define Vcop                    0x0000FFFA
#define Vclkmon                 0x0000FFFC
#define Vreset                  0x0000FFFE

从最下面由0数起,数到22就是AD0的中断向量了。所以中断服务程序应该改成
interrupt 22 void AD0(void)
{****}

不过就这样编译不能通过。后来中服前面又加了一句
#pragma  CODE_SEG __NEAR_SEG NON_BANKED    
虽然不知道这句话是什么意思,但加了就能在CW4.6里面通过了。哪位大虾知道的?

使用特权

评论回复
9
张明峰| | 2007-4-5 17:58 | 只看该作者

正确

中断服务代码前必须要声明
#pragma  CODE_SEG __NEAR_SEG NON_BANKED

这样编译器产生的指针(向量)为16bit长。如果不加"NON_BANKED"声明,缺省代码指针为24bit长(为代码段分页考虑),这样向量表的一个单元就不能容纳。

使用特权

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

本版积分规则

7

主题

18

帖子

0

粉丝