【大赛原创经验贴】基于MSP430G2231实现的频率计
1. 初始化模块设备初始化包括关闭看门狗,时钟初始化,端口初始化以及液晶初始化
初始化程序如下
voidConfigWDT()//关闭看门狗
{
WDTCTL = WDTPW + WDTHOLD;
}
void ConfigClocks() //配置时钟
{
BCSCTL1 = CALBC1_1MHZ; // Set range
DCOCTL= CALDCO_1MHZ; // Set DCO step +modulation
BCSCTL3|= LFXT1S_0; //LFXT1 = VLO
IFG1&= ~OFIFG; // Clear OSCFault flag
BCSCTL2|= SELM_0 + DIVM_0 + DIVS_0; // MCLK= DCO, SMCLK = DCO
}
voidConfigPort() //设置端口
{
P1DIR&=~BIT(5); //P1.5设为输入
P1IES&=~BIT(5); //P1.5设为第二功能
P1IE|=BIT(5); // 开启I/O中断
}
voidConfigTimer() //设置定时器
{
TACTL=TASSEL_1+MC_2+TAIE+TACLR+ID_0; //TA基准时钟为32768HZ、
} 连续计数模式、无分频、开启定时中断
2. 中断模块
首先开启定时溢出中断和I/O中断,再打开总中断,计数器开始计数,当计数溢出时进入溢出中断,且溢出次数加1,当有上升沿到来时,进入I/O中断,计算两次中断之间(一个周期内)的计数值,并转化为频率值,当频率较大时,计数值较小,产生的误差大,所以利用多个周期的计数值,最后再取均值,这样得到的频率值就比较精确,本设计采用100个周期的计数值。
TA中断
//I/O中断
#pragmavector=PORT1_VECTOR
__interrupt void P1_ISR (void)
{
static unsigned int i=0; //I/O中断计数值
if(P1IFG&BIT(5))
i++;
if(i>=100) // 计数100次
{
i=0;
Period=(((unsignedlong int)TA_OverflowCnt)<<16)+TAR; // 获得100个周期内的时钟个数
TA_OverflowCnt=0;
TACTL|=TACLR; // 定时清零
}
P1IFG=0;
}
// Timer_A中断程序
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A (void)
{
switch(TAIV) //TA中断方式选择
{
case 2:break;
case 4:break;
case 10: TA_OverflowCnt++; // 溢出中断计数加1
break;
}
}
3.显示模块
首先根据12864液晶的时序图写出液晶驱动函数,并调用驱动函数完成在指定位置处显示字符的功能函数,这样通过定时刷新液晶屏就可以显示频率值了,而且显示位置可以根据需要任意指定。
3.3软件调试
本设计使用C语言作为控制语言,在CCS环境下进行调试,调试的时候可以分功能模块进行。分为LCD显示模块,计数模块和中断模块。编译过程如下:
1. 在CCS下编写完程序后,执行编译(Build)
如果出现错误,编译框下方会提示出错的原因,根据提示耐心修改。
2. 编译通过,执行Debug,
这时必须仔细检查硬件与下载线是否连接完好,如果没有正确连接,程序无法被下载到单片机内。
3. 调试过程中,可在线查看变量和寄存器的值
Debug窗口下,自左向右依次是去掉断点、全速运行、暂停、停止、进入、单步、汇编进入、汇编单步、返回、同步时钟、复位。
在程序运行后,暂停时可以打开Watch和Regesiter窗口内观察寄存器和变量的变化。
页:
[1]