百思不得其解----求助ECT模块OC时钟问题(急!)
- UID
- 148086
- 性别
- 男
|
百思不得其解----求助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; } |
|
|
|
|
|
- UID
- 148086
- 性别
- 男
|
附注:
我遇到的问题是它不能按我设定的中断500次成1s后小灯明灭转换
当我把设定i=5,小灯明灭转换倒更像是间隔1s
所用单片机为9S12DG128
谢谢大虾! |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
|
|
|
|
|
- UID
- 148086
- 性别
- 男
|
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
需要理解输出比较的含义是,当TC0的值等于TCNT的值时,产生比较中断。而TCNT是一个自由运行的正向计数器。如果总线频率为8M,则产生比较中断的周期应该是:
128×0x10000/8M=1.05 S。 |
|
|
|
|
|
- UID
- 148086
- 性别
- 男
|
感谢搂主!
当TC0=TCNT的时候产生中断,在上面的程序中我设定TC0=125,就是说当TCNT计数125个机器周期的时候就应该产生一个比较中断
128*125/8M=2ms
为什么搂主上面所写式子中系数会是65536呢 |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
TCNT是一个自由运行计数器,从0x0000计到0xFFFF,然后再从0x0000开始计数。TC0只是一个比较值,是不变的。 |
|
|
|
|
|
- UID
- 148086
- 性别
- 男
|
请问LZ我下面的思路是否正确:
自由定时计数器TCNT从0x0000开始计数,计到0x007d(即125)时与TC0比较成功,将产生中断,从0x0000到0x007d用时2ms
然后TCNT从0x007d再往下计数125,将产生下一个中断
这样重复,当程序中的计数器i到达500时PORTA的输出将翻转
以楼主的意思,是否只有TCNT从0x0000到0xffff循环一次的时候才产生中断?如果这样的话TC0不就没用处了?而且如果只有这样的循环到头才能产生中断,那比较中断就没意义了,完全可以用溢出中断
请版主出手
谢谢 |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
如果是只有一个通道,当然可以这么说。但ECT有8个通道,它们共用TCNT。另外,这种比较输出方式对PWM信号的发生是非常高效的。希望你仔细看一下使用手册,了解其工作原理和控制方式。 |
|
|
|
|
|
- UID
- 148086
- 性别
- 男
|
再请教楼主:
如果要在上面原程序基础上实现这个1秒钟间隔的PWM,请问该如何修改?
感激! |
|
|
|
|
|
- UID
- 148086
- 性别
- 男
|
请问如何用中断实现该PWM?
TC0赋值125后,有没有引发中断,引发的中断到底用时为多少?
|
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
|
|
|
|
|
- UID
- 148086
- 性别
- 男
|
占空比0.5
主要目的还是要实现间隔1秒的小灯的闪烁,这就是我原程序要达到的
我主要练习输出比较产生的中断,到底设置TCO=125能否实现我2ms中断的目的?
如果能在我上面的程序中要如何修改?
我上面程序必能达到目的问题到底出在哪?是我的思路有问题还是哪个寄存器每设置好?请指正
上面程序中我只用到PORTT口0,并把它设为输出比较
谢谢版主! |
|
|
|
|
|
- UID
- 148086
- 性别
- 男
|
感谢楼主!
我现在发觉我的思路从根本上就有问题!在重新学习你的指教并作了相关试验(在原程序中增加查询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开始计数?
有几种方法?
|
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
现在你的理解基本上是正确的了。
TCNT可以用TSCR2中的TCRE进行清零。请看文档《S12ECT16B8CV1.pdf》的25页。 |
|
|
|
|
|