美文网首页
值班电路 程序分块测试

值班电路 程序分块测试

作者: nino天 | 来源:发表于2014-08-09 16:15 被阅读32次

    1.时钟测试

    用P5.4,5.5可以分别输出系统时钟和辅助系统时钟
    MCLK = 8MHZ,SMCLK = 1MHZ
    <pre>void Init_clk(void)
    {
    unsigned int i;

    BCSCTL1=0X00; //将寄存器BCSCTL1的内容清零
    //XT2开启,LFTX1工作在低频,ACLK的分频因子为1
    do
    {
    IFG1 &=~OFIFG; //清除OSCFault标志位
    for(i=0x20;i>0;i--); //IFG1中断标志寄存器1
    }
    while((IFG1 & OFIFG)== OFIFG);//如果OSCFault=1

    BCSCTL2=0X00;
    BCSCTL2 += SELM_2;            //MCLK的时钟源为TX2CLK,分频因子为1  8MHZ
    BCSCTL2 += SELS +DIVS_3;      //SMCLK的时钟源为TX2CLK,分频因子为8  1MHZ
    return;
    

    }</pre>

    2.TIMER A 测试:

    增计数模式下,TA OUT1 = 50/1M = 0.05MS周期的方波,也就是20kHZ的方波,OUTMOD选择3,即计数到CCR1,SET,计数到CCR0,RESET。在P2.3可以检测方波的输出。
    <pre>void Init_timer(void)
    {
    P2SEL |= BIT3;
    P2DIR |= BIT3;
    CCR0 = 50;
    CCR1 = 25;
    TACCTL1 = OUTMOD_3;
    TACTL = TASSEL_2 | MC_1 | TACLR; //SMCLK作为TA的时钟源 增计数模式
    }</pre>
    3.AD 测试:
    AD中断中去反转一个LED,示波器看到LED的反转周期是1ms
    因为TA OUT1是0.05ms,所以AD转换每0.05ms一次
    Num_of_Results = 10,完成10次转换要0.5ms,LED周期为0.5*2= 1ms
    <pre>void Init_ADC(void)
    {
    P2DIR = 0xFF;
    P2OUT = 0x00;
    P6SEL |= 0x01; // 使能ADC通道P6.0即A0
    ADC12CTL0 = ADC12ON+SHT0_1; // 打开ADC,设置采样时间
    ADC12CTL1 = SHP+CONSEQ_2+SHS_1; // 使用采样定时器
    //ADC12CTL1 = ADC12SSEL_3+ADC12DIV_0; //ADC内核时钟SMCLK 1MHZ
    //之前一直出错是因为这一句
    ADC12MCTL0 = INCH_0;
    ADC12IE = 0x0001; // 使能中断
    }</pre>

    4.注意:
    (1)不要用MSC,使用了单次通道序列转换之后,希望每次转换都由SHI来触发
    就是每次都要定时器TA OUT1信号的上升沿触发,而不能自动转换
    (2)可以不去设置ADC12的内核时钟,设置了反而错误,不明原因,
    也许是设置之后采样保持的时间不足,应该是内部问题

    <pre>

    #include <msp430x14x.h>
    #include <stdlib.h>
    #define Num_of_Results 10
    int results[Num_of_Results] = {0};

    void Init_clk(void);
    void Init_timer(void);
    void Init_ADC(void);

    //********************主函数***************************
    void main(void)
    {
    WDTCTL =WDTPW + WDTHOLD; //关闭看门狗

    //P1SEL |= (BIT2+BIT6);
    //P1DIR |= (BIT2+BIT6);
    //P2OUT |= 0xf0;
    //P5SEL |= BIT5+BIT4;
    //P5DIR |= BIT5+BIT4;

    Init_clk();
    Init_ADC();
    Init_timer();
    ADC12CTL0 |= ENC; // 使能转换
    _BIS_SR(GIE); //使能全局中断

    while(1)
    {
    }//while
    }//main

    #pragma vector=ADC_VECTOR
    __interrupt void ADC12ISR (void)
    {
    static unsigned int index = 0;
    results[index++] = ADC12MEM0; // Move results
    if (ADC12MEM0 < 0x7FF)
    P2OUT &= ~0xF0;
    else
    P2OUT |= 0xF0;
    if (index == Num_of_Results)
    {
    index = 0;
    P2OUT ^= 0X01;
    }
    }</pre>

    相关文章

      网友评论

          本文标题:值班电路 程序分块测试

          本文链接:https://www.haomeiwen.com/subject/wwdetttx.html