MC9S12XET256之ECT模块(4)

来源:互联网 发布:世界图书出版社 知乎 编辑:程序博客网 时间:2024/04/30 12:34

实验4:定时器溢出翻转功能

    所谓定时器溢出翻转就是在TCNT溢出时将某个通道的输出管腿PTx电平翻转一下。这个功能很实用,可以实现PWM 功能。首先,还是要介绍个相关的寄存器TTOV

TTOV寄存器 (Timer Toggle On Overflow Register 1)

定时器溢出触发寄存器 TTOV很简单,8位寄存器每一位对应一个输出比较通道,相应位置1后表示允许根据溢出特性翻转对应输出比较引脚。置0则禁止这一功能。

 

图 13 TTOV寄存器

 

有这些知识就足够了,下面开始我们的实验。这个实验的输出和上一个实验相同,将在PT0 管腿上输出一个占空比位1/4 的方波,不同的是实现方法。在 TCNT = TC0 = 49152 时将PT0管腿置 1,然后在TCNT溢出时翻转 PT0。程序片段如下。

[cpp] view plaincopy
  1. #include <hidef.h>      /* 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.       
  9.     TSCR2_TOI  = 1;  //timer overflow interrupt enable     
  10.     
  11.     TIOS_IOS0 = 1; // channel 0 as output compare     
  12.     TC0 = 49152;    
  13.     TCTL2_OL0 = 1;    
  14.     TCTL2_OM0 = 1; // 使 channel 0 输出高电平     
  15.                 
  16.     TTOV_TOV0 = 1; // TCNT 计数溢出时翻转 PT0     
  17.     TSCR1_TEN  = 1;  //timer enable   
  18. }  
  19. void main(void)   
  20. {  
  21.     SCIInit();  
  22.     SCISetBaudRate (SCI0, 9600, 8192000L);  
  23.     ECTInit();  
  24.     DDRM_DDRM0 = 1;  
  25.     EnableInterrupts;  
  26.       
  27.     for(;;)   
  28.     {  
  29.         _FEED_COP(); /* feeds the dog */  
  30.     } /* loop forever */  
  31. }  
  32.                              
  33.                   
  34. interrupt VectorNumber_Vtimovf void ECT_TimerOverflow_ISR(void)   
  35. {  
  36.     TFLG2 = TFLG2_TOF_MASK;  //clear timer overflow interrupt flag  
  37.     PTM_PTM0 = ~ PTM_PTM0;  
  38. }  



程序运行后就能在PT0 管腿上观测到 1/4 占空比的方波了。

 

这里需要特别说明的是TTOV不能与TCRE同时使用,比如下面这个例子。这个例子本意是在 TCNT = 10000 时翻转 PT0 通道,然后当 TCNT = 20000 时利用TTOV 功能再次翻转 PT0 的输出,同时由于 开启了 TCRE,让 TCNT 直接回到 0

[cpp] view plaincopy
  1. #include <hidef.h>      /* common defines and macros */  
  2. #include "derivative.h"      /* derivative-specific definitions */  
  3. #include "sci.h"  
  4.   
  5. void ECTInit(void)   
  6. {  
  7.     TSCR2_TOI  = 1;  //timer overflow interrupt enable     
  8.           
  9.     TIOS_IOS0 = 1; // channel 0 as output compare     
  10.     TC0 = 15000;    
  11.     TCTL2_OL0 = 1;    
  12.     TCTL2_OM0 = 0; // 使 channel 0 输出高电平     
  13.       
  14.     TIOS_IOS7 = 1; // channel 7 as output compare  
  15.     TC7 = 20000;  
  16.       
  17.     TCTL1_OL7 = 1;    
  18.     TCTL1_OM7 = 0; // 使 channel 0 输出高电平   
  19.   
  20.     TSCR2_TCRE = 1;  //TCNT overflow when TCNT = TC7 = 20000   
  21.     TTOV_TOV0 = 1; // TCNT 计数溢出时翻转 PT0     
  22.     TSCR1_TEN  = 1;  //timer enable   
  23. }  
  24. void main(void)   
  25. {  
  26.     SCIInit();  
  27.     SCISetBaudRate (SCI0, 9600, 8192000L);  
  28.     ECTInit();  
  29.     DDRM_DDRM0 = 1;  
  30.     EnableInterrupts;  
  31.       
  32.     for(;;)   
  33.     {  
  34.         _FEED_COP(); /* feeds the dog */  
  35.     } /* loop forever */  
  36. }  


这里说明TCRE 功能开启后,TTOV 就不起作用了。其实这也不难理解,TTOV 发生的条件和 TCNT Overflow 中断产生的条件是相同的,都是在 TCNT 从 65536 向 溢出时才会发生。其他条件下都没有作用。

原创粉丝点击