/******************************************************************************************************************************
*
* 文件名: main.c
*
* 文件描述: 基于MSP430F1232的ADC10系列通道单次采样实验
*
* 创建人: areak, 2009 年8 月16 日
*
* 版本号: 1.0
*
* 修改记录:
*
********************************************************************************************************************************/
//==============================================================================================================================
#include "io430.h"
#include "in430.h"
//==============================================================================================================================
unsigned long int result[3]; //用来存放转换结果的数组
unsigned int AD_VALUE[3];
char ADC10FLAG=0; //转换标志
/*==============================================================================================================================
*
* 函 数 名: readdata.
*
* 参 数: 无
*
* 功能描述:
*
* 将转换数据读出,存放在 result[3]中;
*
* 返 回 值: 无
*
* 作 者: areak 2009/8/16
*
================================================================================================================================*/
void readdata(void)
{
char i,j=2;
for(i=0;i<3;i++)
{
result[j] = AD_VALUE[i];
j=j-1;
}
_NOP();
}
/*==============================================================================================================================
*
* 函 数 名: Init_Clk.
*
* 参 数: 无
*
* 功能描述:
*
* 基础时钟初始化设置;
*
* 返 回 值: 无
*
* 作 者: areak 2009/8/16
*
================================================================================================================================*/
void Init_Clk(void)
{
int i;
BCSCTL1 = XTS + DIVA_3;
do
{
BCSCTL1 &= ~XT2OFF; //turn on XT2
IFG1 &= ~OFIFG; //high frequency crystal is stable
for (i=0; i < 2000; i++)
{ }
}while ((IFG1 & OFIFG) !=0);
// MClk = 6M / 1 = 6M ;
// SMClk = 6M / 8 = 750K;
// AClk = 6M / 8 = 750K;
BCSCTL2 |= SELM_2 + DIVM_0 + SELS + DIVS_3;
}
/*==============================================================================================================================
*
* 函 数 名: TimerA_Uint.
*
* 参 数: 无
*
* 功能描述:
*
* 定时器初始化设置,定时1秒;
*
* 返 回 值: 无
*
* 作 者: areak 2009/8/16
*
================================================================================================================================*/
void TimerA_Uint(void)
{
P2DIR |= 0x02; // P2.1 output
TACTL = TACLR;
TACCR0 = 46875; //750K/8/46875 =2Hz
TACCTL0 = CCIE;
TACTL = TASSEL_2 + ID_3 + MC_1;
}
/*==============================================================================================================================
*
* 函 数 名: ADC_Uint.
*
* 参 数: 无
*
* 功能描述:
*
* ADC10设置,系列通道单次采样;
*
* 返 回 值: 无
*
* 作 者: areak 2009/8/16
*
================================================================================================================================*/
void ADC_Uint(void)
{
ADC10CTL0 &= ~ENC;
ADC10DTC0 = ADC10CT; //选择为连续转移数据
ADC10CTL0 |= SREF_1;
ADC10CTL0 |= ADC10SHT_3;
ADC10CTL0 |= REFON;
ADC10CTL0 |= REF2_5V;
ADC10CTL0 |= MSC; //连续采样转换
ADC10CTL0 |= ADC10IE;
ADC10CTL0 |= ADC10ON;
ADC10CTL1 |= INCH_2; //A2--A0
ADC10CTL1 |= SHS_0;
ADC10CTL1 |= CONSEQ_1; //系列通道单次采样
ADC10DTC1 = 0x03; // 连续采样3次中断一次
ADC10SA = (unsigned int)AD_VALUE + 1; //数据转移起始地址
ADC10CTL0 |= ENC + ADC10SC;
}
/*==============================================================================================================================
*
* 函 数 名: main.
*
* 参 数: 无
*
* 功能描述:
*
* 系统主程序
*
* 返 回 值: 无
*
* 作 者: areak 2009/8/16
*
================================================================================================================================*/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
Init_Clk();
TimerA_Uint();
ADC_Uint();
_EINT();
while(1)
{
if(ADC10FLAG==1)
{
ADC10FLAG = 0;
readdata();
_NOP();
}
}
}
/*==============================================================================================================================
*
* 函 数 名: ADC10_ISR.
*
* 参 数: 无
*
* 功能描述:
*
* ADC10中断服务程序,用于设置转换结束标志;
*
* 返 回 值: 无
*
* 作 者: areak 2009/8/16
*
================================================================================================================================*/
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
{
ADC10FLAG = 1;
}
/*==============================================================================================================================
*
* 函 数 名: Timer_A.
*
* 参 数: 无
*
* 功能描述:
*
* Timer_A中断服务程序,定时1秒钟启动一次转换;
*
* 返 回 值: 无
*
* 作 者: areak 2009/8/16
*
================================================================================================================================*/
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P2OUT ^= 0x02; // Toggle P2.1
ADC10CTL0 |= ENC + ADC10SC;
}
//==============================================================================================================================
//END OF FILE
//==============================================================================================================================