首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[求助]DG128定时器功能(定时、捕捉和输出比较一起)测试出现问题

[求助]DG128定时器功能(定时、捕捉和输出比较一起)测试出现问题

DG128定时器功能
我想做一个工程来测试一下(定时、捕捉和输出比较)一起用时能不能工作,按理来说是应该可以的,可测试就是不行!问题如下:
单单定时、捕捉可以
单单定时、比较可以
综合就是不行!
我定时1S是用来计算捕捉到的个数
比较是用来产生一个PWM脉冲输出(PWM可以用其他的,这里是测试想用ECT产生)
达人帮忙看看,问题出现在那里?
#include /* common defines and macros */
#include /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

#include "main_asm.h" /* interface to the assembly module */
uint number_flag;
uint n0,n1,n2,n3;/*显示参数的个,十,百,千位*/
uchar table[10]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09};
uint counter;
uint i;
//asm_main(); /* call the assembly function */
//EnableInterrupts;
/*******************************************************
函数名称:InitClock
说明:
功能:初始化系统时钟
调用子函数:
输入:
返回值:
********************************************************/
void InitClock(void)
{
SYNR=0x02; /*PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)*/
REFDV=0x01;
FCLKDIV=0x31;
ECLKDIV=0x31;
while(!(CRGFLG&0x08))
{ }/*等待时钟频率稳定*/
CLKSEL=0x80;/*PLL Enable*/
}
/*******************PACB计数累加器初始化****************/
void PacbInit()
{
TCTL4 = 0X03;
PBCTL = 0x40; //PBEN=1,事件计数模式,上升沿触发,PACLK 允许中断
ICPAR = 0X0F;
PACN0 = 0X00;
PACN1 = 0X00;+
}
/*******************************************************/
/******************定时器定时中断***********************/
void ECTInit(void)
{
MCCTL = MCCTL&0xFB; //模数计数器禁止运行
MCCTL = 0xE3; //允许中断,模数计数方式 返回时重新加载所用的常数,分频常数为16
MCCTL = MCCTL|0x04; //模数计数器使能
MCCNT = 50000; //(16/8M)*50000 = 100ms (16/12M)*50000 = 200ms/3
MCCTL = MCCTL|0X08 ; //把模数常数寄存器的值加载到模数计数器FLMC;
}
/*********************************************************/
//ECTPWM输出初始化,脉冲可调,周期可调 选择通道3
void ECTPWMInit(void){
TIOS=0X04; //Channel 3 output compare
TSCR1=0X90; //Timer enable
TTOV=0X04;
TCTL2=0X80; //clear zero
TSCR2=0X03; //8分频,调周期65535*(分频数)/时钟周期:65535/12M*8=43.69ms
TC3=0X7fFF; //1/2初始占空比
}
/*******************************************************
函数名称:delay_ms
说明:延时子程序
功能:实现毫秒级的延时 每次的延迟时间为8000/8M=1ms 或8000/12M=0.67MS
调用子函数:
输入:延时参数
返回值:
********************************************************/
void delay_ms(uint b){
uint a,c;
for(a=0;a<=b;a++) {
for(c=0;c<=1329;c++) {
}
}
}
/*****************************************************
函数名称:display
说明:参数显示子程序
功能:
调用子函数:delay_ms
输入:需要显示的数据
返回值:
********************************************************/
void display(int test) {
n3=test/1000;
n2=(test-n3*1000)/100;
n1=(test-n3*1000-n2*100)/10;
n0=test%10;
PTM=table[n3];
PTP=0XFe;
delay_ms(0);
PTM=table[n2];
PTP=0XFd;
delay_ms(0);
PTM=table[n1]-1;
PTP=0XFb;
delay_ms(0);
PTM=table[n0];
PTP=0XF7;
delay_ms(0);
}

/*****************************************************/
void main(void) {
DisableInterrupts;
InitClock();
PacbInit();
ECTInit();
ECTPWMInit();
DDRB = 0xFF;
PORTB = 0xaa;
DDRP=0XFF;
DDRM=0XFF;
DDRK=0XFF;
number_flag = 0;
for(;;){
EnableInterrupts;
if(PTT_PTT3==0)PORTB=0;
if(PTT_PTT3==1)PORTB=1;
display(counter);
}
}
/*-------中断函数-------------------------------*/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 26 MDC_ISR(void){
MCFLG = 0x80; //清标志位
number_flag ++;
if(number_flag==15) { // 200ms/3*15=1s 就是1S测一次速度
number_flag=0;
counter=PACN10*10/16;
PACN0=0x00;
PACN1=0x00;
}
}
ECTInit();
ECTPWMInit();
这两初始化只用一个可以
两个一起用不行!
没有人知道?
还是没有解决,帮忙下!是不是他们同时用到TCNT?
你是说同一个通道同时用作输入捕捉和输出比较吗?那应该是不可以的。
海纳百川  有容乃大
不是同一通道的!一个采用模数向下计数器定时200ms/3,一个是用通道3或通道4进行输出比较,没有采用同一通道!
同一个定时器的各个通道使用的同一个TCNT计数器。
海纳百川  有容乃大
返回列表