历史上的今天
返回首页

历史上的今天

今天是: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

动作

00

不输出

01

每次翻转OCx 的电平

10

OCx = 0

11

OCx = 1


 

图 9 TCTL1/TCTL2 寄存器


TFLG1寄存器(Main Timer Interrupt Flag 1)

用来标识中断条件发生了,对某一位写1则清除对应位。


图 10 TFLG1寄存器


有了这些就可以开始第二个例子了。第二个例子利用通道0和通道1的输出比较功能。在 TCNT = TC0 时将对应的PT0 管腿的输出电平翻转,并且产生相应中断。在 TCNT = TC1时将对应的PT1 管腿的输出电平翻转,并且产生相应中断。这样,PT0和PT1 就会输出两个具有恒定相位差的同频方波信号了。


  1. #include       /* common defines and macros */  

  2. #include "derivative.h"      /* derivative-specific definitions */  

  3. #include "sci.h"  

  4.   

  5. void ECTInit(void)   

  6. {  

  7.     //TSCR2_PR   = 7;  //prescale factor is 8, bus clock/128=8Mhz/8  

  8.     TSCR2_TOI  = 1;  //timer overflow interrupt enable  

  9.     TSCR1_TEN  = 1;  //timer enable  

  10.       

  11.     TIOS_IOS0 = 1; // channel 0 as output compare  

  12.     TIOS_IOS1 = 1; // channel 1 as output compare  

  13.     TC0 = 10000;  

  14.     TC1 = 20000;  

  15.     TIE_C0I = 1;  // 使能 channel 0 中断  

  16.     TIE_C1I = 1;  // 使能 channel 1 中断  

  17.       

  18.     TCTL2_OL0 = 1;  

  19.     TCTL2_OM0 = 0;  

  20.       

  21.     TCTL2_OL1 = 1;  

  22.     TCTL2_OM1 = 0;  

  23. }  

  24. void main(void)   

  25. {  

  26.     SCIInit();  

  27.     SCISetBaudRate (SCI0, 9600, 8192000L);  

  28.     ECTInit();  

  29.     DDRM_DDRM0 = 1;  

  30.     DDRM_DDRM1 = 1;  

  31.     DDRM_DDRM2 = 1;  

  32.     EnableInterrupts;  

  33.       

  34.     for(;;)   

  35.     {  

  36.         _FEED_COP(); /* feeds the dog */  

  37.     } /* loop forever */  

  38. }  

  39.                          

  40.                   

  41. interrupt VectorNumber_Vtimovf void ECT_TimerOverflow_ISR(void)   

  42. {  

  43.     TFLG2 = TFLG2_TOF_MASK;  //clear timer overflow interrupt flag  

  44.     PTM_PTM0 = ~ PTM_PTM0;  

  45. }  

  46.   

  47. interrupt VectorNumber_Vtimch0 void ECT_0_ISR(void)   

  48. {  

  49.     unsigned int value;  

  50.       

  51.     TFLG1 = TFLG1_C0F_MASK;   //clear channel 0 interrupt flag  

  52.     PTM_PTM1 = ~ PTM_PTM1;  

  53. }  

  54. interrupt VectorNumber_Vtimch1 void ECT_1_ISR(void)   

  55. {  

  56.     TFLG1 = TFLG1_C1F_MASK;    //clear channel 1 interrupt flag  

  57.     PTM_PTM2 = ~ PTM_PTM2;  

  58. }  

  59. interrupt VectorNumber_Vtimch7 void ECT_7_ISR(void)   

  60. {  

  61.     TFLG1 = TFLG1_C7F_MASK;    //clear channel 7 interrupt flag  

  62. }  


下面是用 USBee 抓下来的波形图。Port M 0 是在溢出中断中翻转的。PT0 、PT1分别对应两个输出比较通道,两个上升沿的时间间隔为 1/8192=1.22ms,测量结果与理论值完全相同。

 

下面将程序做一个很小的修改。将 TC0 和 TC1 的值改成相同的。

  1. void ECTInit(void)   

  2. {  

  3.     //TSCR2_PR   = 7;  //prescale factor is 8, bus clock/128=8Mhz/8  

  4.     TSCR2_TOI  = 1;  //timer overflow interrupt enable  

  5.     TSCR1_TEN  = 1;  //timer enable  

  6.       

  7.     TIOS_IOS0 = 1; // channel 0 as output compare  

  8.     TIOS_IOS1 = 1; // channel 1 as output compare  

  9.     TC0 = 10000;  

  10.     TC1 = 10000;  

  11.     TIE_C0I = 1;  // 使能 channel 0 中断  

  12.     TIE_C1I = 1;  // 使能 channel 1 中断  

  13.       

  14.     TCTL2_OL0 = 1;  

  15.     TCTL2_OM0 = 0;  

  16.       

  17.     TCTL2_OL1 = 1;  

  18.     TCTL2_OM1 = 0;  

  19. }  


  


从波形图中可以看出,输出是正常的。但是有些低版本的 ECT 模块有些问题,在这种情况下只有 通道 0 的中断能够响应,通道1的中断无法响应。


推荐阅读

史海拾趣

遨格芯微(AGM)公司的发展小趣事

随着智能手机和IoT市场的快速发展,AGM敏锐地捕捉到这一机遇。公司不失时机地推出了一款专用于智能手机和IoT的FPGA芯片,并通过了三星严格的供应商测试认证。这款芯片成为三星Galaxy手机里除Lattice之外的唯一备选FPGA器件,实现了国内FPGA公司出口零的突破,具有特殊的战略意义。这一成功不仅展示了AGM在可编程逻辑技术领域的实力,也为公司进一步拓展智能手机和IoT市场打下了坚实基础。

C-MAC Automotive公司的发展小趣事

在电子行业快速发展的今天,C-MAC Automotive公司始终保持着对创新的追求。公司不断投入研发资金,探索新的技术方向和应用领域。通过持续创新,C-MAC成功推出了一系列具有竞争力的新产品,为公司的发展注入了新的动力。同时,公司还注重人才培养和团队建设,打造了一支高效、专业的研发团队,为公司的未来发展奠定了坚实基础。

这些故事虽然基于虚构,但反映了电子行业中许多企业发展的普遍规律。通过技术突破、战略合作、创新营销、全球化战略和持续创新等手段,企业可以不断提升自身竞争力,实现快速发展。

Elite Semiconductor Products Inc公司的发展小趣事

人才是企业发展的根本。Elite非常重视人才的培养和引进工作。公司建立了完善的人才选拔和培养机制,为员工提供了广阔的职业发展空间和良好的工作环境。同时,Elite还积极引进外部优秀人才,为公司注入新的活力和创新力。这些人才的加入不仅提升了公司的整体实力,也为公司的长远发展提供了有力保障。

Advanced Components Industries Inc公司的发展小趣事

Advanced Components Industries Inc(以下简称ACI)在电子行业的崛起,始于一次关键的技术突破。公司研发团队成功开发出一种新型的高效能电子元件,这一创新不仅提高了电子设备的性能,还降低了能耗。这一成果迅速吸引了市场的关注,ACI的订单量激增,公司开始迅速扩张。

随着技术的不断完善和市场的认可,ACI逐渐在电子元件领域建立了自己的品牌地位。公司不断投入研发,推出了一系列具有竞争力的产品,逐渐在行业中崭露头角。

Eureka Microelectronics Inc公司的发展小趣事

Eureka在追求经济效益的同时,也积极履行社会责任。公司注重环保和可持续发展,致力于减少生产过程中的能源消耗和废弃物排放。同时,Eureka也积极参与公益活动,为社会做出积极贡献。这些努力不仅提升了公司的社会形象,也促进了公司的可持续发展。

请注意,以上故事仅为虚构,并非Eureka公司的实际历史。如有需要,请查阅相关公开资料或联系Eureka公司以获取准确信息。

ABC [ABC Taiwan Electronics Corp]公司的发展小趣事

进入九十年代,ABC Taiwan Electronics Corp迎来了一次重要的发展机遇。公司成功研发出了一款具有创新性的电子连接器,凭借其高性能和稳定性,迅速在市场上获得了广泛认可。这一技术突破不仅为ABC带来了大量订单,也使其在电子连接器领域树立了领先地位。公司借此机会不断扩大生产规模,提升技术水平,逐渐成为了行业的佼佼者。

问答坊 | AI 解惑

深入探讨电容的种类和作用

你知道显卡为什么会花屏吗? 没错,你肯定听说过“主板爆浆”,或者你还在对商家唾沫横飞的“专业分析”深信不疑?但您知道“爆浆”为什么会发生,而爆浆产生的环境、条件、原理又是如何? 你可能也被主板或显卡花屏所困惑,你知道罪魁祸首很可 ...…

查看全部问答>

状态机描述的几个注意准则

1.  状态机标识符见名识义。 2.  状态机二进制代码最好为格雷码或ONE-HOT编码; 3.  状态机数量最好不超过20个; 4.  状态机不要采用一段式描述,尽量采用二段式或三段式描述; 5.  状态机 ...…

查看全部问答>

AT89C52片内可以写多少字节的程序

AT89C52片内只有8K字节的可反复擦写的只读程序存储器(PEROM),那么我写的程序代码是不是不要超过8K,如果代码超过8K,没有扩充的PEROM,那如何办啊? PCF8574如何使用,有哪位高手提供这样的程序,能还判断是哪个INT发过来的中断,才能进入相应的执行过程. ...…

查看全部问答>

新手请教:电容问题

今天我买了两个晶振电容:两个都是50V  10uf(微发)的,这两个是否合适做12M的晶振电容? 我怎么看到书上写的适合用20pf的电容? 另外请问电容上显示的50V是什么意思? 谢谢!…

查看全部问答>

请问用汇编编写的主程序可以调用C语言的子程序吗?

请问用汇编编写的主程序可以调用C语言的子程序吗?…

查看全部问答>

【求助】关于UART问题

各位大虾:   在UART通信中,波特率的大小产生是由分频计数器的时钟频率(BITCLK)通过分频产生器产生的,其中在计算分频因子的时候,是用BITCLK除以波特率,整数部分是通过计数器设置,而小数部分是通过调整器来调整,我不明白 ...…

查看全部问答>

函数放置到SRAM后,程序跑飞!急急急……

在用C6713+SRAM做一个项目 假如将函数放置到DSP片内IRAM内,程序运行正常,打断点调试也正常 一旦将函数分配到外部SRAM后,程序就跑飞了,运行到一些没有放置断点的代码处,或者汇编窗口中的汇编代码处,有时是一堆NOP指令 折腾了四五天了,没有 ...…

查看全部问答>

DIY数控电源遇到问题,请大家有能力的帮帮忙。

现在DIY电源前后面板图纸已经出来了。和厂家联系想定做一套机箱。但是厂家的要求是开孔的必须大于30套的订购量才能下单。 前后面板不开孔的则单套也可以卖。 初步计划先买一套自己开孔。希望坛里哪位有雕刻机的能帮忙开孔制作一套用以制作样机。 ...…

查看全部问答>

毕业设计,基于TMS320C32的电机保护,什么都不会啊,求指教求指教

毕业设计,基于TMS320C32的电机保护,什么都不会啊,求指教求指教有没有哪位高手有电路图啊…

查看全部问答>

大神请出招

各位大虾们,小弟急需一个程序。硬件是51单片机+1602显示屏 基本方向是:小车在固定的路程之间(100m)设计程序计算小车的平均速度,然后在1602显示屏上显示速度。 各位大神 膜拜中... …

查看全部问答>