#include <msp430x54x.h>
#include "LCD_12864.h"
#include "CLOCK.h"
unsigned int end,start;
unsigned char overflow;
unsigned long fre;
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
InitSysCLKXT2(); //8M SMCLK,MCLK为8M,ACLK为32768
INI_LCD();
P2SEL|=BIT2;
TA1CTL|=TAIE+TASSEL__SMCLK+TACLR+ MC__CONTINOUS;//选择计时器时钟为SMCLK打 分频比为1 UP增模式
TA1CCTL1|=CCIE+CAP+CM0+SCS;//打开中断 打开捕获 上升沿捕获 同步捕获
_EINT();
while(1)
{
__bis_SR_register(LPM0+GIE);
TA1CCTL1&=~CAP;
fre=8000000/(2*(end+overflow*65536-start));
write_cmd(0x01);
write_cmd(0x80);
displayshu(fre);
__delay_cycles(800000);
TA1CCTL1|=CAP;
}
}
#pragma vector=TIMER1_A1_VECTOR
__interrupt void TIMER1_A1_ISR(void)
{
switch(__even_in_range(TA1IV,14))
{
case 0: break; // No interrupt
case 2: // Add Offset to CCR1
{
if(TA1CCTL1&CM0)
{
TA1CCTL1=(TA1CCTL1&(~CM0))|CM1; //改为下降沿触发
//TA1CTL|=TACLR;
start=TA1CCR1;
overflow=0;
}
else if(TA1CCTL1&CM1)
{
TA1CCTL1=(TA1CCTL1&(~CM1))|CM0; //有可能是先捕到下降沿
end=TA1CCR1;
LPM0_EXIT;
}
}
break;
case 4: break; // CCR2 not used
case 6: break; // CCR3 not used
case 8: break; // CCR4 not used
case 10: break; // CCR5 not used
case 12: break; // Reserved not used
case 14: // 溢出数加1
overflow++;
break;
default: break;
}
}
参考了论坛上一位兄弟贴出的程序,不过一开始不能测,后来发现是退出低功耗模式在显示那里它还在改数据,干脆就把捕获关了,数据显示了再测,结果出来可以,60K以内试过可以(总会在50HZ左右抖动)。不过频率高了就不行,论坛上有人说能在250HZ内精确到1Hz,知道的话还望不吝赐教,感谢3g465的建议!
此帖出自
小平头技术问答
一周热门 更多>