Freescale 9S12 系列单片机应用笔记(ECT 模块) 6
实验6:模数递减计数器MCCNT和定时中断
ECT模块包含一个16位的模数递减计数器计数寄存器MCCNT。MCCNT的输入时钟信号由BUSCLOCK分频得到,分频系数有四种选择。每次时钟到来后MCCNT自动减1。当MDC计数值减到0后,立即置位模数递减计数器标志寄存器MCFLG中的中断标志MCZF,若MCCTL中的中断允许位MCZI=1,则向CPU发出中断请求,向MCFLG的MCZF位写1将清除该标志。
MCCNT有两种工作方式:单次计数方式和循环(连续)工作方式。由模数递减计数器控制寄存器MCCTL中的模数模式允许位MODMC决定当前工作方式。
l当MODMC=0时为单次计数方式,计数值减到$0000后便停止计数。如果再次将定时常数直接写入计数寄存器MCCNT,MDC便又开始一次递减计数,减到0后停止。
l当MODMC=1时为循环(连续)工作方式,计数值减到$0000后,自动从加载寄存器加载定时常数,并开始新一轮递减计数。
MCCNT寄存器(ModulusDown-CounterCountRegister)
如前所述,MCCNT为一个可置初值的递减计数器。当递减到0后可以产生中断信号。
图1MCCNT寄存器
MCCTL寄存器(ModulusDown-CounterControlRegister)
MCZI位是ModulusCounterUnderflowInterruptEnable的缩写。MCZI=1时使能中断。
MODMC位是ModulusModeEnable的缩写。MODMC=0表示单次计数模式。MODMC=1表示循环计数模式。
RDMCL位是ReadModulusDown-CounterLoad的缩写。RDMCL=0时读MCCNT读出的是MCCNT的当前值。RDMCL=1时读MCCNT读的是加载寄存器的值。所谓加载寄存器存放的是当MCCNT递减到0后重新加载的那个值。加载寄存器和MCCNT公用一个地址,通过RDMCL来确定当前读的是哪个值。
FLMC位是ForceLoadRegisterintotheModulusCounterCountRegister的缩写。向ELMC写1强制将加载寄存器的值加载到MCCNT。
MCEN位是ModulusDown-CounterEnable的缩写。MCEN=1表示使能MCCNT。
MCPR1,MCPR0位是ModulusCounterPrescalerselect的缩写。确定分频系数。当MCPR1、MCPR0组成的两位2进制数为N时,表示分频系数为2^N。
图2MCCTL寄存器
MCFLG寄存器(ModulusDown-CounterFLAGRegister)
MCZF—ModulusCounterUnderflowFlag
图3MCFLG寄存器
下面的例子产生500Hz的方波。
- #include
/*commondefinesandmacros*/ - #include"derivative.h"/*derivative-specificdefinitions*/
- #include"sci.h"
- voidECTInit(void)
- {
- MCCTL_MODMC=1;//循环计数模式
- MCCTL_MCEN=1;
- MCCTL_MCPR=0;
- MCCNT=8192;
- MCCTL_MCZI=1;//ModulusCounterUnderflowInterruptEnable
- TSCR1_TEN=1;//timerenable
- }
- voidmain(void)
- {
- ECTInit();
- DDRM_DDRM0=1;
- EnableInterrupts;
- for(;;)
- {
- _FEED_COP();/*feedsthedog*/
- }/*loopforever*/
- }
- interruptVectorNumber_VtimmdcuvoidECT_ModulusDown_ISR(void)
- {
- MCFLG_MCZF=1;
- PTM_PTM0=~PTM_PTM0;
- }
Freescale9S12系列单片机ECT模 相关文章: