注册会员
- 积分
- 110
- 威望
- 55
- 贡献
- 25
- 兑换币
- 35
- 注册时间
- 2013-7-3
- 在线时间
- 17 小时
- 毕业学校
- 吉林大学
|
9贡献
飞思卡尔两路输入捕捉测速。。。检查了好久就是不好使。。。求助大家了
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#include <hidef.h> /* common defines and macros */
#include <MC9S12XS128.h> /* derivative information */
void initPT();
void initPA();
void initPIT(void); //PIT初始化 没有看门狗
void stop(void);
void backward(void);
void forward(void);
void delay();
void Init_PLL();
int i=0,j=0,sign=1,a=1;
void Init_PLL()
{
CLKSEL=0X7F;
PLLCTL=0XBF;
SYNR=0X53; //01010011 80MHZ,总线40MHZ
REFDV=0X07;
PLLCTL=0X60;
while(( CRGFLG&0x08)==0); //等待锁相环稳定
CLKSEL=0X80; //使用PLL
}
void main()
{
void initPT();
void initPA();
Init_PLL(); //总线时钟为40MHZ
asm ANDCC #$AF;//将不可屏蔽,可屏蔽中断开启
IRQCR=0xC0;
EnableInterrupts;
for(;;)
{
asm ANDCC #$AF;//将不可屏蔽,可屏蔽中断开启
}
}
//设置下降沿触发,使能
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 5 XIRQ_interrupt(void)// XIRQ中断程序,对应按下j1
{if(a==1) {
forward();
}
a=0;
asm ORCC #$EF;//关不可屏蔽
}
#pragma CODE_SEG DEFAULT//将不可屏蔽中断关闭}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 6 IRQ_interrupt(void)//IRQ中断程序,对应按下j2
{asm ANDCC #$EF; //开可屏蔽
initPIT();
TSCR1_TEN=1;//允许定时器工作
TIOS=0xFC;//通道0,1设置为输入捕捉
TCTL4=0x05;//设置上升沿捕捉
TIE=0x03;//允许通道0,1捕捉后中断
}
#pragma CODE_SEG DEFAULT
//CCR中的I位置0 允许中断
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 8 huoer_interrupt(void)
{
asm ORCC #$FF;//CCR中的I位置1 不允许中断 车轮
TSCR1_TFFCA=1;// 定时器标识位快速清零
TSCR1_TEN=1;//允许定时器工作
i++;//计数变量自加1
TFLG1_C0F=1;//中断标志位置0
asm ANDCC #$EF;
}
#pragma CODE_SEG DEFAULT
//CCR中的I位置0 允许中断
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 9 huoer1_interrupt(void)
{
asm ORCC #$FF;//CCR中的I位置1 不允许中断 带轮
TSCR1_TFFCA=1;// 定时器标识位快速清零
TSCR1_TEN=1;//允许定时器工作
j++;//计数变量自加1
TFLG1_C1F=1;//中断标志位置0
asm ANDCC #$EF;
}//CCR中的I位置0 允许中断}
void initPIT(void)
{
PITCFLMT_PITE=0;//关闭PIT模块 初始化PIT
PITCE_PCE0=1;//定时器通道0使能
PITMUX_PMUX0=0;//定时器通道0使用微定时器0
PITMTLD0=100-1;//8位微定时器加载初值 值需计算 40M下总线5um
PITLD0=2000-1;//16位定时器加载初值 值需计算
PITINTE_PINTE0=1;//定时器0通道的中断使能
PITCFLMT_PITE=1;//定时器的通道0使能
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT0(void)
{
asm ORCC #$FF;//CCR中的I位置1 不允许中断 PIT中断函数
PITTF_PTF0=1;//清中断标志位 写1清除
TSCR1_TEN=0;//不允许定时器工作
i=i*85; //主要调试对象
j=j*100;
if(i<=j)
{backward();
a=1;}
i=0;
j=0;
asm ANDCC #$EF;//CCR中的I位置0 允许中断}
#pragma CODE_SEG DEFAULT
}
void stop() //电机停转程序
{
PORTA=0x00;//PORTA_PA0=0;控制使能端PORTA_PA1=0;正转停ZPORTA_PA2=0; 反转停止
}
void forward() //电机正转程序
{
PORTA=0xF3;//PORTA_PA0=1; PORTA_PA1=1ORTA_PA2=0;
delay(15); //主要调试对象
stop();
sign=1;
}
void backward() //电机反转程序
{
PORTA=0x05;// PORTA_PA0=1;PORTA_PA1=0;PORTA_PA2=1;
delay(15); //主要调试对象
stop();
sign=2;
}
void initPA()
{DDRA=0xFF;}
void initPT()
{DDRT=0x00;}
void delay(int c)
{
int cnt;
int cnt1;
for(cnt=0;cnt<2*c;cnt++)
{
for(cnt1=0;cnt1<625;cnt1++)
{
_asm NOP; _asm NOP;_asm NOP;_asm NOP;
_asm NOP; _asm NOP;_asm NOP;_asm NOP;
_asm NOP; _asm NOP;_asm NOP;_asm NOP;
_asm NOP; _asm NOP;_asm NOP;_asm NOP;
_asm NOP; _asm NOP;_asm NOP;_asm NOP;
}
}
}
|
|