用CodeWarrior调试,使用的P&E (USB MON08 Multilink Rev.D)工具,在仿真界面下,主程序仿真正确(把口线简单的拉低或拉高,测试口线电压);但一直无法进入中断,提示如下:
Error:At location FFDE_
Error:Attempt to use invalid or uninitialized memory
Error:interrupt processing failed.
程序:
include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908LJ12.h> /* include peripheral declarations */
void delay2(int num);
uchar key_set,key_up,key_down;
void main(void)
{
CONFIG1 = 0x09;
//CONFIG2 = 0x10;
//键盘输入设置及中断
DDRD = 0x8F; //PTD4,5,6作为输入,0,1,2,3,7输出
PTD &= 0x70; //PTD低四位输出初始值为0
KBSCR_MODEK = 1; //选择触发方式为下降沿和低电平
//Initialize KeyBoard(to prevent a false interrupt)
KBSCR_IMASKK = 1;
KBIER = 0x70;
KBSCR_ACKK = 1;
KBSCR_IMASKK = 0;
EnableInterrupts; /* enable interrupts */
//参数初始
key_set=0;key_up=0;key_down=0;
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
for(;;) {
__RESET_WATCHDOG(); /* feeds the dog */
delay2(100);
}
}
interrupt void KBI_ISR(void)
{
KBSCR_IMASKK = 1; //屏蔽键盘中断
if(PTD_PTD4==0) //在中断服务程序中查询是由哪一个口引起的中断
{
PTD=0;
key_set=1;key_up=0;key_down=0;
}
if(PTD_PTD5==0)
{
PTD=0;
key_set=0;key_up=1;key_down=0;
}
if(PTD_PTD6==0)
{
PTD=0;
key_set=0;key_up=0;key_down=1;
}
KBSCR_ACKK = 1; //清除中断确认,避免误中断
KBSCR_IMASKK = 0; //不屏蔽键盘中断
}
void delay2(int num)
{
int delay_i,delay_j;
for(delay_i=0;delay_i<num;delay_i++)
for(delay_j=0;delay_j<num;delay_j++);
}
另外,在P&E_FCS_linker.prm中,添加了:
VECTOR 15 KBI_ISR
还有,好象其它中断,譬如定时器中断也不行,求老大们知道。
KBI的中断号并非数据手册中的15。数据手册中没有把SWI算进去。建议用这样的格式比较不会出错:
VECTOR ADDRESS 0xFFDE KBI_ISR
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |