MC9S12XET256之ECT模块(6)

本文详细介绍了ECT模块中的模数递减计数器MCCNT的工作原理,包括其分频设置、工作模式(单次与循环)、中断触发机制等关键特性。并通过实例展示了如何利用MCCNT产生特定频率的方波信号,深入探讨了MCCNT在实际应用中的具体操作与配置。

实验6:模数递减计数器MCCNT和定时中断

    ECT 模块包含一个16位的模数递减计数器计数寄存器MCCNTMCCNT的输入时钟信号由BUSCLOCK 分频得到,分频系数有四种选择。每次时钟到来后MCCNT自动1。当MDC计数值减0,立即置位模数递减计数器标志寄存器MCFLG中的中断标志MCZF,若MCCTL中的中断允许位MCZI=1,则向CPU发出中断请求,MCFLGMCZF位写1将清除该标志。

MCCNT有两种工作方式:单次计数方式循环(连续)工作方式。由模数递减计数器控制寄存器MCCTL中的模数模式允许位MODMC决定当前工作方式。

l 当MODMC=0时为单次计数方式,计数值减到$0000后便停止计数。如果再次将定时常数直接写入计数寄存器MCCNTMDC便又开始一次递减计数,减到0后停止。

l 当MODMC=1时为循环(连续)工作方式,计数值减到$0000后,自动从加载寄存器加载定时常数,并开始新一轮递减计数。

MCCNT寄存器(Modulus Down-Counter Count Register

如前所述,MCCNT为一个可置初值的递减计数器。当递减到0后可以产生中断信号。


图 1 MCCNT寄存器

MCCTL寄存器(Modulus Down-Counter Control Register

    MCZI 位是 Modulus Counter Underflow Interrupt Enable 的缩写。MCZI = 1 时使能中断

MODMC位是 Modulus Mode Enable 的缩写。MODMC = 0 表示单次计数模式。MODMC = 1 表示循环计数模式。

RDMCL位是 Read Modulus Down-Counter Load的缩写。RDMCL = 0 时读MCCNT 读出的是MCCNT 的当前值。RDMCL = 1 时读 MCCNT 读的是加载寄存器的值。所谓加载寄存器存放的是当 MCCNT 递减到0后重新加载的那个值。加载寄存器和MCCNT公用一个地址,通过RDMCL 来确定当前读的是哪个值。

FLMC位是 Force Load Register into the Modulus Counter Count Register的缩写。向 ELMC 写 强制 将加载寄存器的值加载到 MCCNT

MCEN位是 Modulus Down-Counter Enable的缩写。MCEN = 1 表示使能 MCCNT

MCPR1, MCPR0位是 Modulus Counter Prescaler select的缩写。确定分频系数。当MCPR1MCPR0 组成的两位2进制数为N时,表示分频系数为2^N

 

图 2 MCCTL寄存器

MCFLG寄存器(Modulus Down-Counter FLAG Register

MCZF — Modulus Counter Underflow Flag


图 3 MCFLG寄存器

下面的例子产生 500Hz 的方波。

[cpp]  view plain copy
  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.     MCCTL_MODMC = 1; // 循环计数模式  
  8.     MCCTL_MCEN = 1;  
  9.       
  10.     MCCTL_MCPR = 0;  
  11.     MCCNT = 8192;  
  12.   
  13.     MCCTL_MCZI = 1; // Modulus Counter Underflow Interrupt Enable  
  14.     TSCR1_TEN  = 1;  //timer enable      
  15. }  
  16. void main(void)   
  17. {  
  18.     ECTInit();  
  19.     DDRM_DDRM0 = 1;  
  20.     EnableInterrupts;  
  21.       
  22.     for(;;)   
  23.     {  
  24.         _FEED_COP(); /* feeds the dog */  
  25.     } /* loop forever */  
  26. }  
  27.                   
  28. interrupt VectorNumber_Vtimmdcu void ECT_ModulusDown_ISR(void)   
  29. {  
  30.     MCFLG_MCZF = 1;  
  31.     PTM_PTM0 = ~ PTM_PTM0;  
  32. }                  
  33.    

 


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值