历史上的今天
今天是:2025年08月11日(星期一)
2021年08月11日 | MC9S12XET256之ECT模块(2)
2021-08-11 来源:eefocus
实验2:输出比较功能(Output Compare)
所谓输出比较功能就是根据需要设置输出比较寄存器的值,自由运行计数器的值与输出比较寄存器的值每隔4个总线周期比较一次,当两者相等时,会在规定的通道引脚上输出预定的电平。如果允许中断,会产生一次输出比较中断。
相应需要操作的寄存器有如下几个:
TCx 寄存器(Timer Input Capture/Output Compare 0-7)
总共8个16位寄存器,分别对应8个输出比较通道。当 TCx = TCNT 时满足输出比较条件,这时根据程序设置在对应输出管腿输出特定的电平(具体方法见TCTL1/TCTL2 寄存器的功能设置)或者产生对应的中断事件。
TIOS寄存器(Timer Input Capture/Output Compare Select)
用来设定某一通道是输入捕捉功能还是输出比较功能。IOSx = 1 对应位为输出比较功能,IOSx = 0 对应位为输入捕捉功能。

图 7 TIOS寄存器
TIE寄存器(Timer Interrupt Enable Register)
其中某一位置 1 后则使能相应的通道的中断,这里控制的中断既包括输出比较中断也包括后面要介绍的输入捕捉中断。

图 8 TIE寄存器
TCTL1/TCTL2 寄存器(Timer Control Register 1/2)
用来决定输出比较时的输出模式和输出电平。具体参见表格 1。
表格 1 输出比较动作
OMx | OLx | 动作 |
|---|---|---|
| 0 | 0 | 不输出 |
| 0 | 1 | 每次翻转OCx 的电平 |
| 1 | 0 | OCx = 0 |
| 1 | 1 | OCx = 1 |

图 9 TCTL1/TCTL2 寄存器
TFLG1寄存器(Main Timer Interrupt Flag 1)
用来标识中断条件发生了,对某一位写1则清除对应位。

图 10 TFLG1寄存器
有了这些就可以开始第二个例子了。第二个例子利用通道0和通道1的输出比较功能。在 TCNT = TC0 时将对应的PT0 管腿的输出电平翻转,并且产生相应中断。在 TCNT = TC1时将对应的PT1 管腿的输出电平翻转,并且产生相应中断。这样,PT0和PT1 就会输出两个具有恒定相位差的同频方波信号了。
#include
/* common defines and macros */ #include "derivative.h" /* derivative-specific definitions */
#include "sci.h"
void ECTInit(void)
{
//TSCR2_PR = 7; //prescale factor is 8, bus clock/128=8Mhz/8
TSCR2_TOI = 1; //timer overflow interrupt enable
TSCR1_TEN = 1; //timer enable
TIOS_IOS0 = 1; // channel 0 as output compare
TIOS_IOS1 = 1; // channel 1 as output compare
TC0 = 10000;
TC1 = 20000;
TIE_C0I = 1; // 使能 channel 0 中断
TIE_C1I = 1; // 使能 channel 1 中断
TCTL2_OL0 = 1;
TCTL2_OM0 = 0;
TCTL2_OL1 = 1;
TCTL2_OM1 = 0;
}
void main(void)
{
SCIInit();
SCISetBaudRate (SCI0, 9600, 8192000L);
ECTInit();
DDRM_DDRM0 = 1;
DDRM_DDRM1 = 1;
DDRM_DDRM2 = 1;
EnableInterrupts;
for(;;)
{
_FEED_COP(); /* feeds the dog */
} /* loop forever */
}
interrupt VectorNumber_Vtimovf void ECT_TimerOverflow_ISR(void)
{
TFLG2 = TFLG2_TOF_MASK; //clear timer overflow interrupt flag
PTM_PTM0 = ~ PTM_PTM0;
}
interrupt VectorNumber_Vtimch0 void ECT_0_ISR(void)
{
unsigned int value;
TFLG1 = TFLG1_C0F_MASK; //clear channel 0 interrupt flag
PTM_PTM1 = ~ PTM_PTM1;
}
interrupt VectorNumber_Vtimch1 void ECT_1_ISR(void)
{
TFLG1 = TFLG1_C1F_MASK; //clear channel 1 interrupt flag
PTM_PTM2 = ~ PTM_PTM2;
}
interrupt VectorNumber_Vtimch7 void ECT_7_ISR(void)
{
TFLG1 = TFLG1_C7F_MASK; //clear channel 7 interrupt flag
}
下面是用 USBee 抓下来的波形图。Port M 0 是在溢出中断中翻转的。PT0 、PT1分别对应两个输出比较通道,两个上升沿的时间间隔为 1/8192=1.22ms,测量结果与理论值完全相同。

下面将程序做一个很小的修改。将 TC0 和 TC1 的值改成相同的。
void ECTInit(void)
{
//TSCR2_PR = 7; //prescale factor is 8, bus clock/128=8Mhz/8
TSCR2_TOI = 1; //timer overflow interrupt enable
TSCR1_TEN = 1; //timer enable
TIOS_IOS0 = 1; // channel 0 as output compare
TIOS_IOS1 = 1; // channel 1 as output compare
TC0 = 10000;
TC1 = 10000;
TIE_C0I = 1; // 使能 channel 0 中断
TIE_C1I = 1; // 使能 channel 1 中断
TCTL2_OL0 = 1;
TCTL2_OM0 = 0;
TCTL2_OL1 = 1;
TCTL2_OM1 = 0;
}

从波形图中可以看出,输出是正常的。但是有些低版本的 ECT 模块有些问题,在这种情况下只有 通道 0 的中断能够响应,通道1的中断无法响应。
史海拾趣
|
你知道显卡为什么会花屏吗? 没错,你肯定听说过“主板爆浆”,或者你还在对商家唾沫横飞的“专业分析”深信不疑?但您知道“爆浆”为什么会发生,而爆浆产生的环境、条件、原理又是如何? 你可能也被主板或显卡花屏所困惑,你知道罪魁祸首很可 ...… 查看全部问答> |
|
1. 状态机标识符见名识义。 2. 状态机二进制代码最好为格雷码或ONE-HOT编码; 3. 状态机数量最好不超过20个; 4. 状态机不要采用一段式描述,尽量采用二段式或三段式描述; 5. 状态机 ...… 查看全部问答> |
|
AT89C52片内只有8K字节的可反复擦写的只读程序存储器(PEROM),那么我写的程序代码是不是不要超过8K,如果代码超过8K,没有扩充的PEROM,那如何办啊? PCF8574如何使用,有哪位高手提供这样的程序,能还判断是哪个INT发过来的中断,才能进入相应的执行过程. ...… 查看全部问答> |
|
各位大虾: 在UART通信中,波特率的大小产生是由分频计数器的时钟频率(BITCLK)通过分频产生器产生的,其中在计算分频因子的时候,是用BITCLK除以波特率,整数部分是通过计数器设置,而小数部分是通过调整器来调整,我不明白 ...… 查看全部问答> |
|
在用C6713+SRAM做一个项目 假如将函数放置到DSP片内IRAM内,程序运行正常,打断点调试也正常 一旦将函数分配到外部SRAM后,程序就跑飞了,运行到一些没有放置断点的代码处,或者汇编窗口中的汇编代码处,有时是一堆NOP指令 折腾了四五天了,没有 ...… 查看全部问答> |
|
现在DIY电源前后面板图纸已经出来了。和厂家联系想定做一套机箱。但是厂家的要求是开孔的必须大于30套的订购量才能下单。 前后面板不开孔的则单套也可以卖。 初步计划先买一套自己开孔。希望坛里哪位有雕刻机的能帮忙开孔制作一套用以制作样机。 ...… 查看全部问答> |




