打印
[技术讨论]

mc9s12X中断服务程序问题

[复制链接]
1071|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
问题描述:自己写的中断服务程序在仿真的时候遇到中断就无法执行了,初步判断是识别不了中断服务程序,求大佬指点一二
芯片型号:MC9S12XS128
编译器:codewarriorV5.1
仿真器:USBDM()三合一版本)
现象描述:写的这个程序烧录到单片机后,用仿真器仿真,运行起来正常,当摁下按键后,程序就不运行了。
描述补充:这个中断函数,需要在project.prm文件最后一行添加这一句才能识别中断函数;“VECTOR ADDRESS 0xffcc Key_interrupt”;我想知道为什么用中断号和中断向量地址的方式不行
代码:
#include <hidef.h>      /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */

#define LED_dir    DDRB  //LED口的方向
#define LED    PORTB   //定义IO口数据
#define KEY_dir    DDRH    //按键IO口方向
#define KEY    PTH     //按键IO口数据
#define KEY1    PTH_PTH3    //按键1
#define KEY2    PTH_PTH2    //按键2
#define KEY3    PTH_PTH1    //按键3
#define KEY4    PTH_PTH0    //按键4

void delay(unsigned int n); //定义延时函数
void LED_Init(void);    //初始化LED
void KEY_Init(void);   //初始化按键

  
/******************************************按键中断服务函数******************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED   //将接下来的代码置于非分页区,中断函数只有被置于非分页区内才能被寻址到
void interrupt VectorNumber_Vpit0 Key_interrupt(void)      //这里需要注意这个中断名,需要加载Project.Prm文件的末尾去
{
     if(PIFH != 0)      //如果触发了中断,中断标志寄存器PIFH的对应位会置1;
     {
            PIFH |= 0x0f;    //0000 1111 清除中断标志位
            
            if(KEY1==0)     //如果按键1摁下
            {
                LED &= 0xfe;
            }
            
            if(KEY2==0)     //如果按键2摁下
            {
                LED &= 0xfd;
            }
            
            if(KEY3==0)     //如果按键3摁下
            {
                LED &= 0xfb;
            }
            
            if(KEY4==0)     //如果按键4摁下
            {
                LED &= 0xf7;
            }
     }
}
#pragma CODE_SEG DEFAULT          //后面的代码置于默认区域内


/******************************************主函数******************************************/
void main(void)
{
  /* put your own code here */
    DisableInterrupts;
    LED_Init();     //初始化LED
    KEY_Init();     //初始化按键
    EnableInterrupts;

    // LED = 0x00;   //0000 0000
    // delay(1000);
    //LED |= 0xf0;    //1111 0000   与1相或置位,表示将bit4~bit7置1
    //LED = 0xFF;    //1111 1111
    //delay(1000)
    //LED &=0xf0;  //1111 0000  与0相与清零,表示将bit0~bit3清零;
   
   
    for(;;)
    {
            LED=0x0f;
            delay(1000);
            LED=0xf0;
            delay(1000);
    }
}

/******************************************延时函数******************************************/
void delay(unsigned int n)
{
    unsigned int i,j;
    for(i=0;i<n;i++)
    {
        for(j=0;j<1500;j++)
        {
            ;
        }
    }
}

/******************************************LED初始化函数******************************************/
void LED_Init(void)   
{
    LED = 0xFF;          //设置LED对应的IO口全部高电平,LED全部熄灭;
    LED_dir = 0xFF;    //设置LED对应的IO口全部为输出;
}
/******************************************按键初始化函数******************************************/
void KEY_Init(void)
{
     KEY    |= 0x0f;   //0000 1111 按键对应IO口低四位拉高
     KEY_dir &= 0xf0;    //1111 0000 低四位清零,设置为输入
     PPSH &= 0xf0;      //设置中断触发方式
     PIFH |= 0x0f;        //清除相应位的中断标志位
     PIEH |= 0x0f;        //中断使能寄存器打开
}

使用特权

评论回复

相关帖子

沙发
小疙瘩|  楼主 | 2021-5-12 09:23 | 只看该作者
补充一下原理图:

原理图.png (35.74 KB )

原理图.png

使用特权

评论回复
板凳
tyw| | 2021-5-12 09:41 | 只看该作者
MC9S12XS128 相关专辑.rar (61.04 MB)


使用特权

评论回复
地板
小疙瘩|  楼主 | 2021-5-12 10:14 | 只看该作者

谢谢你的资料,已帮助我解决了问题;
解决方式参考了资料“MC9S12XS128学习中文精华版”,中中断向量表的说明

使用特权

评论回复
5
小疙瘩|  楼主 | 2021-5-12 10:19 | 只看该作者
问题已解决:
原因:我这边参考书上的向量表出错了,也就说这里用的是PH口,和他的中断向量不对应,不应该是“VectorNumber_Vpit0”
解决方式:
将中断号换成这个就对了“VectorNumber_Vporth”,已经过测试;
总结:这种方式是使用中断号的方式来写的,不用更改project.prm文件,出错几率相对较小
当然,如果这样是在是搞不定,修改project.prm文件也是一种方式;
最后我修改后的中断函数为:
/******************************************按键中断服务函数******************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED   //将接下来的代码置于非分页区,中断函数只有被置于非分页区内才能被寻址到
void interrupt VectorNumber_Vporth  Key_interrupt(void)      //这里需要注意这个中断名,需要加载Project.Prm文件的末尾去
{
     if(PIFH != 0)      //如果触发了中断,中断标志寄存器PIFH的对应位会置1;
     {
            PIFH |= 0x0f;    //0000 1111 清除中断标志位
            //自己的中断处理代码
     }
}
#pragma CODE_SEG DEFAULT          //后面的代码置于默认区域内

使用特权

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

本版积分规则

1

主题

9

帖子

0

粉丝