搜索
bottom↓
回复: 15

在弄MSP430F149调程序时发现一个奇怪问题,ADC12CTL0 |= ADC12SC.语句执行后,ADC12SC未

[复制链接]

出0入0汤圆

发表于 2011-7-25 13:32:21 | 显示全部楼层 |阅读模式
刚开始调ADC12模块就遇到一个很奇怪的问题,ADC12SC 在单通道单次转换模式下不能置位,但是在单通道多次转换模式下却可以置位。现在我换了两块不一样的最小系统板,都遇到这个问题。。

程序1.(TI的官方演示程序,单通道单次转换)-----》单步时ADC12CTL0 |= ADC12SC不能置位。


#include  <msp430x14x.h>

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  ADC12CTL0 = SHT0_2 + ADC12ON;             // Set sampling time, turn on ADC12
  ADC12CTL1 = SHP;                          // Use sampling timer
  ADC12IE = 0x01;                           // Enable interrupt
  ADC12CTL0 |= ENC;                         // Conversion enabled
  P6SEL |= 0x01;                            // P6.0 ADC option select
  P1DIR |= 0x01;                            // P1.0 output

  for (;;)
  {
    ADC12CTL0 |= ADC12SC;                   // Sampling open
    _BIS_SR(CPUOFF + GIE);                  // LPM0, ADC12_ISR will force exit
  }
}

// ADC12 interrupt service routine
#pragma vector=ADC_VECTOR
__interrupt void ADC12_ISR (void)
{
    if (ADC12MEM0 < 0x7FF)
      P1OUT &= ~0x01;                       // Clear P1.0 LED off
    else
      P1OUT |= 0x01;                        // Set P1.0 LED on
    _BIC_SR_IRQ(CPUOFF);                    // Clear CPUOFF bit from 0(SR)
}


程序二是单通道重复采样模式------->》ADC12CTL0 |= ADC12SC 执行后,ADC12SC可以置位。
#include  <msp430x14x.h>

#define   Num_of_Results   8

static unsigned int results[Num_of_Results];  // Needs to be global in this
                                              // example. Otherwise, the
                                              // compiler removes it because it
                                              // is not used for anything.

void main(void)
{
  WDTCTL = WDTPW+WDTHOLD;                   // Stop watchdog timer
  P6SEL |= 0x01;                            // Enable A/D channel A0
  ADC12CTL0 = ADC12ON+SHT0_8+MSC;           // Turn on ADC12, set sampling time
  ADC12CTL1 = SHP+CONSEQ_2;                 // Use sampling timer, set mode
  ADC12IE = 0x01;                           // Enable ADC12IFG.0
  ADC12CTL0 |= ENC;                         // Enable conversions
  ADC12CTL0 |= ADC12SC;                     // Start conversion
  _BIS_SR(LPM0_bits + GIE);                 // Enter LPM0,Enable interrupts
}


#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
  static unsigned int index = 0;

  results[index] = ADC12MEM0;               // Move results
  index = (index+1)%Num_of_Results;         // Increment results index, modulo
}


求解啊。我之前都用过这几个演示程序,都好的,怎么现在不行了。。。。。

大虾们,高手们,出来帮帮忙吧!!


这个是程序1单步的时候的情况 (原文件名:未命名.jpg)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2011-7-25 13:36:39 | 显示全部楼层
回复【楼主位】aida66  
-----------------------------------------------------------------------


这个是程序2单步时的情况 (原文件名:未命名2.jpg)

出0入0汤圆

 楼主| 发表于 2011-7-25 13:38:49 | 显示全部楼层
还有一个问题就是为什么我单步的时候 ADC12SC一直显示的是1   如下图


(原文件名:未命名3.jpg)

出0入0汤圆

 楼主| 发表于 2011-7-25 13:42:17 | 显示全部楼层
还有我的USB仿真器自己插到电脑上没反应,一定要和开发板连接在一起之后,等板子供电了之后才有反应。。。。。

出0入0汤圆

发表于 2011-7-25 14:23:49 | 显示全部楼层
个人感觉,有时候仿真的时候显示的寄存器值好像会有问题,你可以在中断里面设置断点看看有没有进入中断,
如果进了中断就说明置位成功了但是没显示出来。反之,如果一直没进中断就说明没置位!

出0入0汤圆

发表于 2011-7-25 14:27:38 | 显示全部楼层
ADC12SC是个宏定义,永远为1

出0入0汤圆

 楼主| 发表于 2011-7-25 14:31:36 | 显示全部楼层
回复【4楼】changhui0222  
-----------------------------------------------------------------------

我没开中断我是用查询方式来判断的。。

出0入0汤圆

 楼主| 发表于 2011-7-25 14:33:03 | 显示全部楼层
回复【5楼】lcofjp  C语言砖家
-----------------------------------------------------------------------

对哦,,谢谢你啊            

出0入0汤圆

发表于 2011-7-25 14:35:02 | 显示全部楼层
可能是时间太快,置位后马上复位了,观察不到的
只要能正常的进入中断和转换,这个置不置位就不必计较了。

出0入0汤圆

发表于 2011-7-25 14:42:30 | 显示全部楼层
有些标置是硬件开始工作后就自动清除掉了的,只要外设进入了预期状态,别的就不要钻牛角尖了

出0入0汤圆

发表于 2011-7-25 14:43:51 | 显示全部楼层
有些标置是硬件开始工作后就自动清除掉了的,只要外设进入了预期状态,别的就不要钻牛角尖了

出0入0汤圆

发表于 2011-7-25 15:03:03 | 显示全部楼层
不是什么问题都可以仿真的。

出0入0汤圆

 楼主| 发表于 2011-7-25 15:04:37 | 显示全部楼层
回复【9楼】billowtust  
-----------------------------------------------------------------------

还有就是 在ADC12SC一置位后,ADCMEM0里面就由值了。但是这个值是错误的。。。我直接把采样端接地了

这又是什么原因呢??

出0入0汤圆

 楼主| 发表于 2011-7-25 15:47:56 | 显示全部楼层
回复【10楼】billowtust  
-----------------------------------------------------------------------

这个不是牛角尖。。

如果ADC12SC不置位,我用查询的方法去判断转换是否完成则ADC12IFG始终没有置位。。

出0入0汤圆

 楼主| 发表于 2011-7-25 15:51:40 | 显示全部楼层
程序一直在while语句中出不来了。。


仿真图像。。。 (原文件名:未命名34.jpg)

出0入0汤圆

发表于 2011-9-29 23:35:46 | 显示全部楼层
我今天也碰到楼主的问题了

好像TI给的那个例程只能用通道0,如果按照其他通道来改动的话不能成功,一直停在while那儿

后来我是直接在通道选择里面选择第四通道来测量A4口的电压,即 ADC12MCTL0 = ADC12SREF_0|0x04;

像我那样能行,但是就是想不通
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-19 00:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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