历史上的今天
今天是:2025年08月11日(星期一)
2021年08月11日 | MC9S12XET256之ECT模块(3)
2021-08-11 来源:eefocus
实验3:输出比较 7 通道的特殊功能
输出比较通道OC7 具有特殊的权限,可以废止其他输出比较通道的动作,直接决定各个输出通道的状态。这种特权功能是通过配置两个额外的寄存器OC7M和OC7D来实现的。
OC7M寄存器(Output Compare 7 Mask Register)
使OC7Mx=1,OC7强行参与管理通道x的输出,但通道OC7 对通道OC0~OC6的管理仅限于使其引脚PT0~PT6 清0或置1,不能将引脚电平翻转,引脚的动作来自于输出比较7数据寄存器OC7D中的对应位OC7Dx定义的电平状态,必须事先通过程序设置。。

图 11 OC7M寄存器
OC7D寄存器(Output Compare 7 Data Register)
OC7Dx=0,则对应事件发生时相应PTx位将被输出为低电平,OC7Dx=1,则对应事件发生时相应PTx位将被输出为高电平。

图 12 OC7D寄存器
可以开始我们的实验了。这个实验将在PT0 管腿上输出一个占空比位1/4 的方波。实现方法为在 TCNT = 10000 时将 PT0 置为高电平,TCNT = 26384 时将PT0 置为低电平。下面是程序片段。
#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
TIOS_IOS0 = 1; // channel 0 as output compare
TC0 = 10000;
TCTL2_OL0 = 1;
TCTL2_OM0 = 1; // 使 channel 0 输出高电平
TIOS_IOS7 = 1; // channel 7 as output compare
TC7 = 26384;
//TIE_C7I = 1; // 使能 channel 7 中断
OC7M_OC7M0 = 1;
OC7D = 0; // 使 channel 0 输出低电平
TCTL1_OL7 = 0;
TCTL1_OM7 = 0;
TSCR2_TOI = 1; //timer overflow interrupt enable
TSCR1_TEN = 1; //timer enable
}
void main(void)
{
SCIInit();
SCISetBaudRate (SCI0, 9600, 8192000L);
ECTInit();
DDRM_DDRM0 = 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)
{
TFLG1 = TFLG1_C0F_MASK; //clear channel 0 interrupt flag
}
interrupt VectorNumber_Vtimch1 void ECT_1_ISR(void)
{
TFLG1 = TFLG1_C1F_MASK; //clear channel 1 interrupt flag
}

利用这种方式可以模拟个 PWM 功能出来。不过模拟出来的PWM周期只有8种选择。
在第一篇应用笔记中,我提到过TCSR2寄存器有一位叫 TCRE。TCRE 位是 Timer Counter Reset Enable 的简写。TCRE 位为 0表示TCNT自由运行,TCRE 位为1表示当TCNT = OC7 时复位。
下面将给出一个利用 TCRE的例子。同样是占空比25%,但是同时还调整了波形的周期。这个例子中,TC0 = 1000, TC7 = 4000。PT0 在1000时翻转一下,在4000时再翻转一下。同时4000时将TCNT值复位到0重新计数。这样波形的频率就成了 4000/8192000=4.88ms。
void ECTInit(void)
{
TSCR2_PR = 7; //prescale factor is 8, bus clock/128=8Mhz/8
TIOS_IOS0 = 1; // channel 0 as output compare
TC0 = 1000;
TIE_C0I = 1; // 使能 channel 0 中断
TCTL2_OL0 = 1;
TCTL2_OM0 = 1; // 使 channel 0 输出高电平
TIOS_IOS7 = 1; // channel 7 as output compare
TC7 = 4000;
TIE_C7I = 1; // 使能 channel 7 中断
TCTL1 = 0x40;
OC7M_OC7M0 = 1;
OC7D = 0; // 使 channel 0 输出低电平
TCTL1_OL7 = 0;
TCTL1_OM7 = 0;
TSCR1_TEN = 1; //timer enable
}

上面是实际波形,这里出现了个有意思的现象。PM0 一直为低电平,这表明TCNT 的Overflow 中断没有进去。说明这个中断只有在 TCNT为自由计数器时才有用,这点需要特别注意。
史海拾趣
|
Programming Examples for the TMS320F281x eCAN Programming Examples for the TMS320F281x eCAN… 查看全部问答> |
|
keil 进入调试状态 我在下方的command窗口输入 tmod,scon等,可以读到这些寄存器的值 可是还有其他的寄存器不知道怎么读取。比如数据手册上有:0x8100 MAC_Control_Register_0这样一个寄存器 我在command敲入0x8100读出的还是0x8100,这肯定不是 ...… 查看全部问答> |
|
WinCE中,基于对话框的程序,怎样拥有唯一的窗口类? 为了取得窗口句柄 两个基于对话框的程序, GetClassName取得的窗口类名都是Dialog,两个窗口都没有标题,所以不能通过窗口标题,使用FindWindow取得窗口句柄。那么怎样取得窗口句柄?… 查看全部问答> |
|
我使用的是 AnyDATA CDMA DTGS800-6025模块 接收短信提前设置 AT+UGSM=1(使用第二套短信接口) AT+CMGF=0(普通编码输出格式) AT+CMGR=0 接收第一条短信.模块的输出内容是 13 10 43 67 77 71 82 58 32 48 48 48 48 48 50 51 ...… 查看全部问答> |
|
smtp客户端程序在linux下编译通过且能发送邮件,用arm-linux-gcc编译通过,在板端运行不能发送邮件的原因是什么呢? 在linux下用ctrl+d实现发送,但arm板没有这功能,该怎么解决????… 查看全部问答> |
|
还是说说吧,好像常见的驱动兼容性还是不错的,但是默认状态下安装许多驱动还是有问题,因为好多存在无有效签名验证,所以需要更改win8的配置,在启动选项里配置,有一项叫“强制兼容XXX...”的选项,以后安装驱动是就会出现是否继续安装驱动的安全 ...… 查看全部问答> |
|
这一期的降价物品是一个目标板,就是用作给24脚的芯片做测试用的。 具体链接如下: https://estore.ti.com/MSP-TS430PW24-MSP430AFE2xx-24-Pin-Socket-Target-Board-P2415.aspx 降价额度比较大从89刀->30刀(买过芯片测试座的筒子们知道,这个 ...… 查看全部问答> |




