在线情况
楼主
  • 头像
  • 级别
    • 积分3
    • 经验166
    • 文章5
    • 注册2011-08-07
    紧急求助:一个AD采样再通过串口发送的程序问题
    [P]谁能帮我看看有什么问题啊,用示波器观察P3.4没有输出,有问题就请帮我指出来吧,谢谢了[/P][P]串口发送应该没问题,自己感觉是定时器设置的问题,还有就是需不需要加横线的那一段?[/P][P]#include "msp430x24x.h"
    #define uchar  unsigned char
    void adc12_init(void);
    void timer_init(void);
    void UART_init(void);[/P][P]
    void main(void)
    {  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
       //=========================================================
      unsigned  int i;
        BCSCTL1 &= ~XT2OFF;                       // XT2on
        do
      {
      IFG1 &= ~OFIFG;                           // Clear OSCFault flag
      for (i = 0xFF; i > 0; i--);               // Time for flag to set
      }
      while (IFG1 & OFIFG);                   // OSCFault flag still set?
      BCSCTL2 |= SELM_2 + SELS;                 // MCLK= SMCLK= XT2 (safe)
      //=========================================================
      adc12_init();                               // Initialize ADC12
      UART_init();
      ADC12CTL0 |= ENC;                         // Start conversion
      _BIS_SR(LPM0_bits);                       // Enter LPM0
    }[/P][P]void adc12_init(void)
    {
      P1DIR = 0xff;                             // set port to outputs
      P1OUT = 0;                                // reset port outputs
      P6SEL |= 0x01;                            // select A0 input
      ADC12CTL0 = ADC12ON+SHT0_1+REF2_5V+REFON; // Setup ADC12
      ADC12CTL1 = SHP+CONSEQ_2+SHS_1;           // Timer triggers sampling
      ADC12MCTL0 = INCH_0 + SREF_1;
      ADC12IE = 0x0001;                         // Enable ADC12IFG.0
     
      TACCR0 = 1500;                            // Delay to allow Ref to settle
      TACCTL0 |= CCIE;                          // Compare-mode interrupt.
      TACTL = TASSEL_2 | MC_1;                  // TACLK = ACLK, Up mode.
      _BIS_SR(LPM3_bits + GIE);                 // Wait for delay, Enable interrupts
      TACCTL0 &= ~CCIE;                         // Disable timer
      P2SEL |= BIT3;                            // Set for Timer A1
      P2DIR |= 0x08;
      TACCR0 = 1000;                               // Init TACCR0 w/ sample prd=CCR0+1
      TACCR1 = 500;                               // Trig for ADC12 sample & convert
      TACCTL1 = OUTMOD_3;                       // Set/reset
      TACTL = TACLR | MC_1 | TASSEL_2;          // ACLK, clear TAR, up mode
    }[/P][P]void UART_init()
    { P3SEL |= 0x10;                            // Use P3.4 for USCI_A0
      UCA0CTL1 |= UCSSEL_2;                     // UCLK = SMCLK
      UCA0BR0 |= 0xA1;                             // 8Mhz/19200 ~ 417
      UCA0BR1 = 0x01;
      UCA0MCTL = UCBRS2 + UCBRS0;               // Modulation UCBRSx = 5
      UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**[/P][P]}[/P][P]void UART_sendbyte(uchar data)
    {
     UCA0TXBUF = data;
     while (!(IFG2 & UCA0TXIFG ));            // USCI_A0 TX buffer ready?
    }[/P][P]// Timer_A0 Interrupt Service Routine    
    #pragma vector=TIMERA0_VECTOR
    __interrupt void ta0_isr(void)
    {
      TACTL = 0;
      LPM3_EXIT;                                // Exit LPM3 on return
    }[/P][P]// ADC12 Interrupt Service Routine
     #pragma vector=ADC12_VECTOR
    __interrupt void ADC12ISR (void)
    {  unsigned int advalue;
      advalue = ADC12MEM0;             // Move results
      UART_sendbyte(advalue>>4);
    }[/P]
    [ 此贴最后由lczhzx在2011-8-8 1:12:55编辑过 ]
    微控网感谢您的参与
    在线情况
    2
    • 头像
    • 级别
    • 门派
    • 职务总版主
    • 声望+9
    • 财富5
    • 积分3065
    • 经验390701
    • 文章6744
    • 注册2006-03-07
    [P]请不在这样将一堆代码贴出来,然后直接叫别人帮你找问题~;这种做法比较不受他人帮忙的。[/P]
    [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
    在线情况
    3
    • 头像
    • 级别
      • 积分3
      • 经验166
      • 文章5
      • 注册2011-08-07
      [P][QUOTE][B]下面引用由[U]DC[/U]发表的内容:[/B]

      请不在这样将一堆代码贴出来,然后直接叫别人帮你找问题~;这种做法比较不受他人帮忙的。[/QUOTE]
      [/P][P] [/P][P]好心的版主,你能不能帮我看看啊?现在很着急啊[/P]
      微控网感谢您的参与
      在线情况
      4
      • 头像
      • 级别
      • 门派
      • 职务总版主
      • 声望+9
      • 财富5
      • 积分3065
      • 经验390701
      • 文章6744
      • 注册2006-03-07
      [P]你注意一下时钟源与低功耗的模式是否有冲突;我不知道你这是不是与这个有关,你认查一下。[/P][P]另外,检查一下中断方面是否都设置正确了。....[/P]
      [COLOR=#0000ff]欢迎发贴分享设计心得、开源DIY...[/COLOR]
      在线情况
      5
      • 头像
      • 级别
        • 积分12
        • 经验377
        • 文章32
        • 注册2010-09-06
        横线那段 是初始化时钟的,必须有!!![P]
        [/P][P][LINE-HEIGHT=21px][BGCOLOR=rgb]  adc12_init();                               // Initialize ADC12
          UART_init();
          ADC12CTL0 |= ENC;                         // Start conversion
          _BIS_SR(LPM0_bits);[/BGCOLOR][/LINE-HEIGHT][/P][P][LINE-HEIGHT=21px][BGCOLOR=rgb]
        [/BGCOLOR][/LINE-HEIGHT][/P][P][LINE-HEIGHT=21px][BGCOLOR=rgb]
        [/BGCOLOR][/LINE-HEIGHT][/P][P][LINE-HEIGHT=21px][BGCOLOR=rgb]这个地方 你只是[/BGCOLOR][/LINE-HEIGHT][LINE-HEIGHT=19px][BGCOLOR=rgb]ADC12CTL0 |= ENC;使能AD转换;
        没有开始一次ad转换,(及关闭)[/BGCOLOR][/LINE-HEIGHT][/P][P][LINE-HEIGHT=19px][BGCOLOR=rgb]我记得 需要这样写吧:[/BGCOLOR][/LINE-HEIGHT][/P][P][LINE-HEIGHT=19px][BGCOLOR=rgb][P]  ADC12CTL0 |= ENC;                         // Enable conversions[/P][P]  ADC12CTL0 |= ADC12SC;                     // Start conversion[/P][P]
        [/P][P]
        [/P][P]
        [/P][P]建议在定时器发送串口数据里边:[/P][P][P]  ADC12CTL0 |= ENC;                         // Enable conversions[/P][P]  ADC12CTL0 |= ADC12SC;                     // Start conversion[/P][P]  ADvalue =  ADC12MEM0;[/P][P]  while((ADC12IFG& ADC12BUSY)==0);[/P][P]  ADC12CTL0 &= ~ENC;[/P][/P][/BGCOLOR][/LINE-HEIGHT][/P]
        微控网感谢您的参与
        Powered by LeadBBS 9.2 .
        Page created in 0.3906 seconds with 5 queries.