Board logo

标题: 百思不得其解----求助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。所以进不了中断。
作者: benbentl    时间: 2011-1-9 12:22

看这个帖子,学到很多东西,收获很大!




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