手把手教你写S12XS128程序(24)--Timer模块应用实例1
输入捕捉(IC)编程步骤:****
初始化函数
TIOS---选择工作方式为IC
TCTLx---设置对应位输入捕捉的方式(x=3、4,高位是3,低位是4)
TSCRx---控制寄存器设置,包括工作使能、 确定工作方式(x=1)、中断允许 、预分频
TIE---中断使能
中断函数
清除标志位---TFLG1
处理函数
【例程3】
//---------------------------------------------------------------------------// //功能说明:利用PP3通道产生40Hz,占空比为50%的方波 // 利用PT0采集方波的个数,并在PB口显示 //程序设计:电子设计吧 //设计时间:2010.01.13 //---------------------------------------------------------------------------// #include <hidef.h> /* common defines and macros / #include <mc9s12dg128.h> / derivative information / #pragma LINK_INFO DERIVATIVE "mc9s12dg128b" unsigned int Input_Num; //----------------------时钟初始化------------------------------// void PLL_Init(void) //PLLCLK=2OSCCLK*(SYNR+1)/(REFDV+1) { //锁相环时钟=216(2+1)/(1+1)=48MHz REFDV=1; //总线时钟=48/2=24MHz SYNR=2; while(!(CRGFLG&0x08)); CLKSEL=0x80; } //--------------------通道0输入捕捉初始化-------------------// void ECT0_Init(void) { TSCR2=0x06; //禁止溢出中断,分频系数64(24/64MHz) TIOS_IOS0=0; //通道0为输入捕捉 TCTL4=0x01; //捕捉上升沿 TIE_C0I=1; //通道0输入捕捉中断允许 TSCR1=0x80; //使能定时器 } //---------------------PWM通道3初始化程序-------------------// void PWM_Init(void) { PWME_PWME3=0x00; // PWW is disabled 禁止 PWMPRCLK=0x33; // 0b0011 0011 A=B=24M/8=3M 时钟预分频寄存器设置 PWMSCLA=150; // SA=A/2/150=10k 时钟设置 PWMSCLB=150; // SB=B/2/15 =10k 时钟设置 PWMCTL=0x00; // no concatenation 控制寄存器设置 PWMCLK_PCLK3=1; // PWM3-----SB 时钟源的选择 PWMPOL_PPOL3=1; // Duty=High Time 极性设置 PWMCAE_CAE3=0; // left-aligned 对齐方式设置 PWMPER3=250; // Frequency=SB/250=40 周期寄存器设置 PWMDTY3=125; // Duty cycle = 50% 占空比寄存器设置 PWME_PWME3=1; // enable 使能 } //----------------------主函数-------------------------// void main(void) { PLL_Init(); PWM_Init(); ECT0_Init(); DDRB=0XFF; PORTB=0X00; EnableInterrupts; for(;;) { } /* wait forever / / please make sure that you never leave this function */ } //--------------------转速计算:-------------------------------// // //智能车转速子函数 // //----------------------------------------------------------------// #pragma CODE_SEG NON_BANKED //定时器通道0输入捕捉中断 void interrupt 8 Timer0_Onput(void) { TFLG1_C0F=1; //清中断标志位 Input_Num++; PORTB=Input_Num; if(Input_Num>=255) { Input_Num=0; } }
