极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10838|回复: 0

【大赛原创经验贴】基于MSP430G2231实现的频率计

[复制链接]
发表于 2012-7-18 09:28:24 | 显示全部楼层 |阅读模式
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窗口内观察寄存器和变量的变化。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-19 17:50 , Processed in 0.039490 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表