Randy 发表于 2012-7-18 09:28:24

【大赛原创经验贴】基于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]
查看完整版本: 【大赛原创经验贴】基于MSP430G2231实现的频率计