Board logo

标题: 中断 [打印本页]

作者: mmanyy    时间: 2006-12-13 09:01     标题: 中断

目的:产生600Hz的RTI中断,并用LED每秒闪一次来测试该中断.


我用的是9S12xdp512,外部晶振频率8M.


为什么进不去中断?


有人愿意留下邮箱吗?我说不大清楚,可以发project过去.


作者: mmanyy    时间: 2006-12-13 09:09

http://bbs.eccn.com/uploadImages/xdp512_1130.rar

这是PROJECT..
请帮忙看下,最好能发还正确的,指正错误,谢谢

邮箱:mmanyy@sina.com
MSN:mmanyy@hotmail.com
QQ:277728518
作者: strongchen    时间: 2006-12-13 12:00

你修改了datapage.c文件吗?在我这里编译无法通过。
作者: mmanyy    时间: 2006-12-13 12:17

没修改啊,在我这里编译是可以,烧录也正常啊,就是中断进不去.
作者: mmanyy    时间: 2006-12-13 17:57

请问strongchen,现在还是无法编译通过吗?报错?
我用的也是CW4.5啊..

作者: strongchen    时间: 2006-12-15 14:58

是的,无法编译通过。请你用引导(wizard)重新建一个project,不要改动任何文件,只把你的源程序拷进source文件夹,再试试。
作者: mmanyy    时间: 2006-12-16 20:00

这两天改了下,中断可以进去了,灯也可以闪,但是跟我想得到的RTI中断频率有很大的出入,就是本来我想得到的是600Hz的中断,但是按灯闪计算出来的是300KHz左右.
后来又发现,本来是通过RTICTL这个寄存器来配置分频的,但是现在对它的改动不影响灯闪烁的频率.说明根本就没有按照我做的那样分频.
还有,好象我的中断函数这样写有很大问题,虽然是可以记数的,但是要占用很长时间.怎么样用toggle来写这段600次反转LED的代码呢?COM好象不是按位反转.汇编指令里有按位反转的吗?或者有其他什么办法来反转?http://bbs.eccn.com/uploadImages/xdp512_1215.rar
作者: strongchen    时间: 2006-12-18 16:14

你的晶振是多少?把你的分频方法列出来看看。你是想怎样得到600Hz的中断的?
作者: mmanyy    时间: 2006-12-19 10:31

晶振是8M的,想产生600Hz的RTI中断.这样分频的:
void main(void) {
disableRTI();
disableInterrupt();
initMCU();
enableInterrupt();
enableRTI();
while(1)
{ }
}
static void initMCU(void)
{
#ifdef OSCILLATOR_PREQUENCY
CLKSEL_PLLSEL = 0; // make sure PLL is *not* in use;
PLLCTL_PLLON = 1;
PLLCTL_AUTO = 1; // enable PLL module, Auto Mode;
#if OSCILLATOR_PREQUENCY == 8
REFDV = 0; // set up Reference Divider;
SYNR = 2; // set up Synthesizer Multiplier; PLLCLK=48..
setRTIInterval(0x1C); // make sure RTI timeout period is 5/3 ms;
#elif OSCILLATOR_PREQUENCY == 16
REFDV = 1; // set up Reference Divider;
SYNR = 2; // set up Synthesizer Multiplier;
setRTIInterval(0x2C); // make sure RTI timeout period is 5/3 mS;
#endif
while ((CRGFLG & 0x08) == 0x00); // wait until PLL is locked;
CLKSEL_PLLSEL = 1; // switch over to PLL clock;
#endif
return;
}
作者: strongchen    时间: 2006-12-20 16:33

setRTIInterval(0x1C)具体是什么?
作者: mmanyy    时间: 2006-12-21 15:42

#define setRTIInterval(x) {\
*(volatile unsigned char *)0x003B = (unsigned char)x;\
}

0x003B就是寄存器RTICTL的地址,是用来配置分频倍数的,为1C的时候分频倍数为13*2e10,因为RTI中断的来源为OSC,所以这样用8M除以13*2e10,得到约601Hz.
作者: mmanyy    时间: 2006-12-21 15:44

对不起,刚才表示错了,2e10在上面的意思就是2的10次方
作者: strongchen    时间: 2006-12-25 09:50

看起来你的分频计算方法没错,不知问题出在哪里。建议你重新安装一下最新版本的CodeWarrior试试。




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