Board logo

标题: 求助:ECT定时溢出进入中断后标志位无法清除 [打印本页]

作者: kingcathy    时间: 2008-5-26 11:21     标题: 求助:ECT定时溢出进入中断后标志位无法清除

程序代码如下。不知道是什么原因使得标志位无法清除,哪位达人解答一下啊

#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
/******************************************************************
*函数名:PLLINIT
*入口参数SNNR寄存器值,REFDV0寄存器值
*出口参数: 无
*功能描述:使用PLLCLK,时钟频率等于2*晶振频率*(SYNR0+1)/(REFDV0+1)
*******************************************************************/
void PLLINIT(uchar SYNR0,uchar REFDV0)
{
CLKSEL=0x00; //disable pll;
CLKSEL_PLLSEL = 0;
PLLCTL_PLLON = 0;
SYNR = SYNR0; //
REFDV = REFDV0;
PLLCTL = 192; //0xC0 CME=1,PLLON=1
PLLCTL_PLLON = 1;
while(!CRGFLG_LOCK);
CLKSEL_PLLSEL = 1;
}

/******************************************************************
*函数名C0_Init()
*入口参数无
*出口参数: 无
*功能描述:设置IOC通道为比较输出,当成功发生匹配时OC0输出翻转
*******************************************************************/
void OC0_Init()
{
TIOS_IOS0=1; //定义IOC0作为比较输出
TCTL2_OM0=0; //OC0输出翻转//00:与输出引脚断开;01:翻转;10:输出清零;11:输出置1
TCTL2_OL0=1;
TC0=10000; //输出占空比为15.3%的方波
TTOV_TOV0=1; //Enable toggle on OC0
}

void main(void) {
/* put your own code here */
DisableInterrupts;
DDRB_BIT0=1;
PLLINIT(24,5);//6M晶振获得25M总线频率
TSCR2_TOI=1; //允许定时中断
TSCR2|=3; //预分频器输出时钟频率为P时钟的1/8,定时器溢出时间为21.97ms
OC0_Init();
TSCR1_TEN=1; //TIMER ENABLE
EnableInterrupts;
for(;;) {} /* wait forever */
/* please make sure that you never leave this function */
}

#pragma CODE_SEG NON_BANKED
void TOI_ISR(void) //定时器溢出{
DisableInterrupts;
TFLG2=0x80; //对标志位清零
PORTB_BIT0=!PORTB_BIT0;
EnableInterrupts;
}


作者: strongchen    时间: 2008-5-26 13:55

在中断程序里无需软件开关中断,MCU硬件会自动完成。另外,如何知道标志位没有清楚呢?
作者: kingcathy    时间: 2008-5-26 14:29

谢谢指点。标志位是否清除通过观察连接PB0的指示灯的亮灭。我设定的总线频率25M,定时器的基频位25M/8=3.125M,那么定时溢出时间为65536/3.125M=21ms,PB0口输出的波形频率25HZ,足以用肉眼观察。用示波器查看没有输出波形,程序调试自动运行的话会自己停止,在汇编窗口出现如下代码:BGND,反复执行


作者: strongchen    时间: 2008-5-27 10:23

你可以设置断点看一下是否进了中断。
作者: kingcathy    时间: 2008-5-28 16:33

中断能进入。反复执行BGND,是不是表示程序跑飞了


作者: strongchen    时间: 2008-5-29 14:37

程序应该是跑飞了。中断矢量地址对吗?
作者: kingcathy    时间: 2008-5-29 19:42

矢量地址定义:VECTOR ADDRESS 0xFFDE  TOI_ISR,应该没有错
作者: strongchen    时间: 2008-5-30 11:42

把整个project打包上传吧。
作者: toumingse    时间: 2010-6-12 16:17

这个问题,我也遇到了,楼主解决了吗?急。
作者: zhouweibit    时间: 2010-8-20 15:14

小弟也遇到了同样的问题,请问楼主解决了吗?
作者: zephanshaka    时间: 2010-8-26 21:19

你 的 中断 程序 void TOI_ISR(void) 有问题。
前面没有加 interrupt 关键字,也没有加#pragma TRAP_PROC,
所以编译器在编译成汇编指令时会当成普通函数处理。
在程序返回时 指令变成RTC ,而不是中断程序应该有的RTI。
这样,你的中断函数应该只能进一次。没办法恢复中断前的现场。
所以程序肯定就异常了。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0