现在用TIMER0的CAP0.0和CAP0.1做捕获输入计脉冲,单路计数数据正确(脉冲在2K左右),打开CAP0.1的脉冲输入后,其中一路偶尔出现特别大的数据,现贴上程序!
void __irq IRQ_Time0(void) { if((T0IR&0X10)==0X10) { if(fCap0==0) { if(Count_cap0++==1) { Pulse_cap0_old= T0CR0; Count_cap0=0; fCap0=1; } } if(fCap0==1) { if(Count_cap0++==1) { Pulse_cap0_new= T0CR0; Count_cap0=0; flag_cap0=1; } //通知主程序可以对数值处理了 } T0IR|= 0x10; // 清除中断标志 } if((T0IR&0X20)==0X20) { if(fCap1==0) { if(Count_cap1++==1) { Pulse_cap1_old= T0CR1; Count_cap1=0; fCap1=1; } } if(fCap1==1) { if(Count_cap1++==1) { Pulse_cap1_new= T0CR1; Count_cap1=0; flag_cap1=1; } //通知主程序可以对数值处理了 } T0IR|= 0x20; // 清除中断标志 } VICVectAddr = 0x00; // 通知VIC中断处理结束 } 中断程序,结果输出是用串口输出的! void Target_Init(void) { PINSEL0=0X00050005; //将外部设备连接到UART0UART1 PINSEL1=0X3A854000; //将0。27-----0。30配置成CAP0------3输入 PINSEL2=0XFFFFFF34; IO1DIR=Beep; T0PR = 0; //PCLK=11.0592*2 不分频 T0CCR = 0x36; // 设置CAP0.0下降沿捕获.可以中断,CAP0.1下降沿捕获,可以中断 T0TC = 0; //记数从0开始记 /* 设置定时器0中断IRQ */ VICIntSelect = 0x00; // 所有中断通道设置为IRQ中断 VICVectCntl0 = 0x24; // 定时器0中断通道分配最高优先级(向量控制器0) VICVectAddr0 = (uint32)IRQ_Time0; // 设置中断服务程序地址向量 VICIntEnable = 0x00000010; // 使能定时器0中断 T0TCR=0X01; //使能中断TIMER0 } 定时器的初始化! |