标题: 百思不得其解----求助ECT模块OC时钟问题(急!) [打印本页]
作者: wsyali 时间: 2006-9-14 00:21 标题: 百思不得其解----求助ECT模块OC时钟问题(急!)
想测试练习ECT的OC中断,却突然发现不能确定其所用时钟
程序很简单,就是想做间隔一秒钟闪烁的小灯,请各位大侠慷慨相助,谢谢!
程序如下,编译环境为CodeWarrior3.1
#include <hidef.h> /* common defines and macros */
#include <mc9s12dg128.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
volatile char i=0;
void interrupt 8 timch0(void);
void main(void) {
/* put your own code here */
DDRA=1;
TIOS=1; //设定PORTT口1为输出
TSCR1=0x90;//置位ten
TSCR2=0x07;//选定与分频系数为128
TC0=125;//中断间隔2ms
TIE=1;//允许中断
EnableInterrupts;
for(;;) {} /* wait forever */
}
void interrupt 8 timch0(void){
i+=1;
if(i==500){
PORTA=~PORTA;
i=0;
}
TC0=125;
}
作者: wsyali 时间: 2006-9-14 08:52
附注:
我遇到的问题是它不能按我设定的中断500次成1s后小灯明灭转换
当我把设定i=5,小灯明灭转换倒更像是间隔1s
所用单片机为9S12DG128
谢谢大虾!
作者: strongchen 时间: 2006-9-14 09:16
总线频率是多少?
作者: wsyali 时间: 2006-9-14 09:24
晶振16M
没设置PLL
总线频率应是8M
作者: strongchen 时间: 2006-9-14 10:18
需要理解输出比较的含义是,当TC0的值等于TCNT的值时,产生比较中断。而TCNT是一个自由运行的正向计数器。如果总线频率为8M,则产生比较中断的周期应该是:
128×0x10000/8M=1.05 S。
作者: wsyali 时间: 2006-9-14 11:26
感谢搂主!
当TC0=TCNT的时候产生中断,在上面的程序中我设定TC0=125,就是说当TCNT计数125个机器周期的时候就应该产生一个比较中断
128*125/8M=2ms
为什么搂主上面所写式子中系数会是65536呢
作者: strongchen 时间: 2006-9-14 11:44
TCNT是一个自由运行计数器,从0x0000计到0xFFFF,然后再从0x0000开始计数。TC0只是一个比较值,是不变的。
作者: wsyali 时间: 2006-9-14 15:28
请问LZ我下面的思路是否正确:
自由定时计数器TCNT从0x0000开始计数,计到0x007d(即125)时与TC0比较成功,将产生中断,从0x0000到0x007d用时2ms
然后TCNT从0x007d再往下计数125,将产生下一个中断
这样重复,当程序中的计数器i到达500时PORTA的输出将翻转
以楼主的意思,是否只有TCNT从0x0000到0xffff循环一次的时候才产生中断?如果这样的话TC0不就没用处了?而且如果只有这样的循环到头才能产生中断,那比较中断就没意义了,完全可以用溢出中断
请版主出手
谢谢
作者: strongchen 时间: 2006-9-14 15:36
如果是只有一个通道,当然可以这么说。但ECT有8个通道,它们共用TCNT。另外,这种比较输出方式对PWM信号的发生是非常高效的。希望你仔细看一下使用手册,了解其工作原理和控制方式。
作者: wsyali 时间: 2006-9-14 16:24
再请教楼主:
如果要在上面原程序基础上实现这个1秒钟间隔的PWM,请问该如何修改?
感激!
作者: wsyali 时间: 2006-9-14 16:42
请问如何用中断实现该PWM?
TC0赋值125后,有没有引发中断,引发的中断到底用时为多少?
作者: strongchen 时间: 2006-9-14 17:04
你要产生周期为1秒的PWM信号吗?占空比是多少?
作者: wsyali 时间: 2006-9-14 17:49
占空比0.5
主要目的还是要实现间隔1秒的小灯的闪烁,这就是我原程序要达到的
我主要练习输出比较产生的中断,到底设置TCO=125能否实现我2ms中断的目的?
如果能在我上面的程序中要如何修改?
我上面程序必能达到目的问题到底出在哪?是我的思路有问题还是哪个寄存器每设置好?请指正
上面程序中我只用到PORTT口0,并把它设为输出比较
谢谢版主!
作者: wsyali 时间: 2006-9-15 00:18
感谢楼主!
我现在发觉我的思路从根本上就有问题!在重新学习你的指教并作了相关试验(在原程序中增加查询TOF控制另一小灯闪烁,发现两灯闪烁时间基本相同)之后,对ECT模块的OC功能作了新的审视,试探性的做了以下总结,由于没找到确切资料,加之实际应用检验有限,正确与否还希望以版主丰富的经验加以佐证。
1。自由运行定时计数器TCNT
一旦TEN置位,16位TCNT就开始从$0000-$FFFF之间循环计数,不受其他动作影响,循环周期由预分频系数Pre和系统时钟St决定,计算公式:Pre*65536/St
2。输出比较OC中断
该功能中断中,两次中断时间间隔并不以TCn的值确定,而是依据设定的预分频系数Pre和系统时钟St确定,公式为:Pre*65536/St
3。TCn值
它主要应用在对应管脚需预设定动作情况,配合OMn、OLn,计数器TCNT就像在数轴$0000-$FFFF上运行,一旦TCNT运行到的值等于TCn,就会产生预设定动,然后TCNT接着往下运行到$FFFF,到$0000,当再次到达TCn时再次产生动作,如此循环。
当同时须设定多个管脚的预定动作时,TCn值只能决定各管脚动作在数轴$0000-$FFFF上的哪一点出现,但这些动作出现的时间周期都是相同的,即为自由运行定时计数器的循环周期。
但请教版主:如何在TCNT=TCn产生中断的同时清零TCNT,让它重新从$0000开始计数?
有几种方法?
作者: strongchen 时间: 2006-9-15 10:02
现在你的理解基本上是正确的了。
TCNT可以用TSCR2中的TCRE进行清零。请看文档《S12ECT16B8CV1.pdf》的25页。
作者: wsyali 时间: 2006-9-15 18:48
谢谢楼主,我现在已经明白了
作者: wsyali 时间: 2006-9-15 18:49
谢谢楼主,我现在已经明白了
作者: ky3453079 时间: 2006-9-18 17:44
TRCE置1,对TCNT清零,那么中断就不会再产生,
如果把TRCE再次清零的话,那定时的时间还是由时钟决定。
达不到我们想要的定时时间,这该怎么办啊?
作者: strongchen 时间: 2006-9-19 14:12
TCRE对TCNT清零后,TCNT会继续从零开始计数,中断还会继续发生。所以TCRE的用法就相当于一个模数,把TCNT由自由运行计数器变成了模数计数器。
作者: ky3453079 时间: 2006-9-19 17:10
原来是我把TC0跟TC7的赋值放太前面了,导致TC0跟TC7都是0。所以进不了中断。
作者: d9912345 时间: 2007-7-10 22:19
关于楼主的程序,我有四个问题想请教一下版主(我对程序作了一些修改,用MC9S12DG128B的PORTB口的小灯作测试,程序见后)
(1)按照版主的意思,当TC0=TCNT的时候产生中断,而TC0=125,依我的理解,TCNT先从0开始计数,当计数到125时,产生中断;中断执行完后,TCNT从125起继续计数,一直计数到65535溢出,然后再从0开始计数,当计数到125时产生中断,依此类推....你们都不是这种说法,不知道是谁对?
(2)我试了楼主的程序,的确是当i=5时,小灯明灭转换像是间隔一秒,但是我觉得要使i=5,必须要产生五次中断,而依版主的意思,产生一次中断的时间为1s,五次中断就是五秒,这是否矛盾呢?我发现中断程序中没有清中断的语句,是不是因为这个缘故呢?
(3)版主不是说TC0是不变的吗?那为什么中断程序又要写上TC0=125呢?而且,我发现如果把TC0=125去掉的话,八只小灯会全亮,这怎么解释呢?
(4)我发现一个奇怪的现象,当中断程序中的i=1时,会出现PB口的低三位和高三位小灯维持亮的状态不变,中间两只小灯保持熄灭状态。取i=2,才会出现交替亮灭的情况,交替时间为2到3秒,取i=5,像前面所说的交替时间为1秒,取i=10时,交替时间又像是2至3秒,当i取更长时,交替时间会更长。似乎i=5时交替时间最短,而当i<5或者i>5时交替时间都大于1s,请问怎么解释这个现象?
可能有些东西我没看明白,请多多指教!http://bbs.chinaecnet.com/uploadImages/OUTPUT COMPARE.rar
作者: strongchen 时间: 2007-7-11 11:05
当使用输出比较功能时,TC0只是一个比较参考值。当TCNG=TC0时,会产生中断。TCNT会一直继续计数,不管是否产生中断。
作者: d9912345 时间: 2007-7-11 13:12
第一个问题算是明白了,可是后面的问题呢?i=5时交替时间为1秒,这怎么计算?
作者: strongchen 时间: 2007-7-11 17:51
问题出在你设置了TSCR1的TFFCA位为1,此时需用写TC0的方法清中断标志C0F。但是用写TC0的方法清中断标志似乎有问题(具体什么问题还要再仔细看看)。最好的方法是设置TFFCA位为0,然后在中断中用TFLG1_C0F=1的方法来清中断,你就可以看到正确的运行状态了。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) |
Powered by Discuz! 7.0.0 |