5051|20

348

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

MSP430:ADC用TI的官方例程总是转换一两次之后就停了,求可能原因 [复制链接]

 
本帖最后由 火火山 于 2016-8-17 21:23 编辑

ADC用TI的官方例程总是转换一两次之后就停了,求可能原因

转换程序是放在while循环里面的,求指导


程序如图,无论打断点还是串口打印,循环不过3次

谢谢

最新回复

看来你已经找到原因了最近一段时间没上论坛而已  详情 回复 发表于 2016-8-19 16:02
 
点赞 关注

回复
举报

9795

帖子

24

TA的资源

版主

沙发
 
停在哪了 是休眠后ADC中断没有触发吗

点评

没有休眠,不是停在哪里,而是循环第三次之后就停不到造white循环的断点上面,而是直接全速运行了  详情 回复 发表于 2016-8-17 22:53
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

板凳
 
你是怎么知道的,下载到板子里面。这个官网的例程和你的板子是匹配的?如果是匹配的,debug状态下,单步调试啊。

点评

尝过过单步调试,也过不去  详情 回复 发表于 2016-8-17 22:52
 
 
 

回复

348

帖子

0

TA的资源

一粒金砂(高级)

4
 
huaiqiao 发表于 2016-8-17 22:16
你是怎么知道的,下载到板子里面。这个官网的例程和你的板子是匹配的?如果是匹配的,debug状态下,单步调 ...

尝过过单步调试,也过不去

点评

停在哪里,看寄存器的值。 要根据语句找到相应的寄存器啊,然后看寄存器里面位的值,是不是你想要的值。 430是操作寄存器的呀。  详情 回复 发表于 2016-8-17 22:56
 
 
 

回复

348

帖子

0

TA的资源

一粒金砂(高级)

5
 
littleshrimp 发表于 2016-8-17 22:09
停在哪了 是休眠后ADC中断没有触发吗

没有休眠,不是停在哪里,而是循环第三次之后就停不到造white循环的断点上面,而是直接全速运行了

点评

还有 你用的那个型号的单片机 能把代码全发出来吗  详情 回复 发表于 2016-8-17 23:22
是停了还是全速运行? 看你的代码里明明有休眠 时钟你是怎么配置的  详情 回复 发表于 2016-8-17 23:22
 
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

6
 
火火山 发表于 2016-8-17 22:52
尝过过单步调试,也过不去

停在哪里,看寄存器的值。
要根据语句找到相应的寄存器啊,然后看寄存器里面位的值,是不是你想要的值。
430是操作寄存器的呀。

点评

你好,我单步调试后,发现程序停在了这个地方,如图所示,从ADC的中断出来后,程序就一直停在箭头所指的地方,等待唤醒。[attachimg]254443[/attachimg] 我的问题是:为什么会一直停在是 __bis_SR_register(LPM0_  详情 回复 发表于 2016-8-18 16:17
嗯呢呢,谢谢哦,经常看见你的哈  详情 回复 发表于 2016-8-18 08:51
 
 
 

回复

9795

帖子

24

TA的资源

版主

7
 
火火山 发表于 2016-8-17 22:53
没有休眠,不是停在哪里,而是循环第三次之后就停不到造white循环的断点上面,而是直接全速运行了

是停了还是全速运行?
看你的代码里明明有休眠
时钟你是怎么配置的

点评

你好,时钟使用的是ADC内部的那个MODCLK时钟 你好,我单步调试后,发现程序停在了这个地方,如图所示,从ADC的中断出来后,程序就一直停在箭头所指的地方,等待唤醒。 [attachimg]254444[/attachimg] 我的问  详情 回复 发表于 2016-8-18 16:19
不对呀,while循环中有唤醒的语句啊,会醒来才对  详情 回复 发表于 2016-8-18 08:43
休眠,那我大概知道哪里有问题了,中断之后就进入了休眠,不过要试验一下,板子被另一个同事用着,要等一会  详情 回复 发表于 2016-8-18 08:16
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

9795

帖子

24

TA的资源

版主

8
 
火火山 发表于 2016-8-17 22:53
没有休眠,不是停在哪里,而是循环第三次之后就停不到造white循环的断点上面,而是直接全速运行了

还有 你用的那个型号的单片机
能把代码全发出来吗
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

348

帖子

0

TA的资源

一粒金砂(高级)

9
 
littleshrimp 发表于 2016-8-17 23:22
是停了还是全速运行?
看你的代码里明明有休眠
时钟你是怎么配置的

休眠,那我大概知道哪里有问题了,中断之后就进入了休眠,不过要试验一下,板子被另一个同事用着,要等一会
  1.     case 12:                                // Vector 12:  ADC12BMEM0 Interrupt


  2.         if(ADC12_B_getResults(ADC12_B_BASE, ADC12_B_MEMORY_0) >= 0x7ff)
  3.         {
  4.             //Set P1.0 LED on
  5.             /*

  6.              * Select Port 1
  7.              * Set Pin 0 to output high.
  8.              */
  9.             GPIO_setOutputHighOnPin(
  10.                 GPIO_PORT_P1,
  11.                 GPIO_PIN0
  12.                 );
  13.         }
  14.         else
  15.         {
  16.             //Set P1.0 LED off
  17.             /*

  18.              * Select Port 1
  19.              * Set Pin 0 to output high.
  20.              */
  21.             GPIO_setOutputLowOnPin(
  22.                 GPIO_PORT_P1,
  23.                 GPIO_PIN0
  24.                 );
  25.         }
  26. //        __bic_SR_register_on_exit(LPM0_bits);   // Exit active CPU
复制代码
 
 
 

回复

348

帖子

0

TA的资源

一粒金砂(高级)

10
 
本帖最后由 火火山 于 2016-8-19 15:59 编辑
littleshrimp 发表于 2016-8-17 23:22
是停了还是全速运行?
看你的代码里明明有休眠
时钟你是怎么配置的

不对呀,while循环中有唤醒的语句啊,会醒来才对

  1. #include <msp430.h>
  2. #include "driverlib.h"


  3. void main(void)
  4. {
  5.     // stop watchdog
  6.     WDT_A_hold(WDT_A_BASE);

  7.     PMM_unlockLPM5();
  8.     // 设置内部DCO频率为1MHz
  9.     CS_setDCOFreq(CS_DCORSEL_0,CS_DCOFSEL_0);
  10.     // 设置SMCLK时钟源来自DCO
  11.     CS_initClockSignal(CS_SMCLK,CS_DCOCLK_SELECT,CS_CLOCK_DIVIDER_1);


  12.     GPIO_setAsOutputPin(
  13.             GPIO_PORT_P1,
  14.             GPIO_PIN0
  15.             );

  16.         //Set P1.0 as Output Low.
  17.         /*

  18.          * Select Port 1
  19.          * Set Pin 0 to output Low.
  20.          */
  21.         GPIO_setOutputLowOnPin(
  22.             GPIO_PORT_P1,
  23.             GPIO_PIN0
  24.             );
  25.         //Set P1.1 as Ternary Module Function Output.
  26.         /*

  27.          * Select Port 1
  28.          * Set Pin 1 to output Ternary Module Function, (A1, C1, VREF+, VeREF+).
  29.          */


  30.         GPIO_setAsPeripheralModuleFunctionOutputPin(
  31.             GPIO_PORT_P1,
  32.             GPIO_PIN1,
  33.             GPIO_TERNARY_MODULE_FUNCTION
  34.             );


  35.         //Initialize the ADC12B Module
  36.         /*
  37.          * Base address of ADC12B Module
  38.          * Use internal ADC12B bit as sample/hold signal to start conversion
  39.          * USE MODOSC 5MHZ Digital Oscillator as clock source
  40.          * Use default clock divider/pre-divider of 1
  41.          * Not use internal channel
  42.          */
  43.         ADC12_B_initParam initParam = {0};
  44.         initParam.sampleHoldSignalSourceSelect = ADC12_B_SAMPLEHOLDSOURCE_SC;
  45.         initParam.clockSourceSelect = ADC12_B_CLOCKSOURCE_ADC12OSC;
  46.         initParam.clockSourceDivider = ADC12_B_CLOCKDIVIDER_1;
  47.         initParam.clockSourcePredivider = ADC12_B_CLOCKPREDIVIDER__1;
  48.         initParam.internalChannelMap = ADC12_B_NOINTCH;
  49.         ADC12_B_init(ADC12_B_BASE, &initParam);

  50.         //Enable the ADC12B module
  51.         ADC12_B_enable(ADC12_B_BASE);

  52.         /*
  53.          * Base address of ADC12B Module
  54.          * For memory buffers 0-7 sample/hold for 64 clock cycles
  55.          * For memory buffers 8-15 sample/hold for 4 clock cycles (default)
  56.          * Disable Multiple Sampling
  57.          */
  58.         ADC12_B_setupSamplingTimer(ADC12_B_BASE,
  59.                                    ADC12_B_CYCLEHOLD_16_CYCLES,
  60.                                    ADC12_B_CYCLEHOLD_4_CYCLES,
  61.                                    ADC12_B_MULTIPLESAMPLESDISABLE);

  62.         //Configure Memory Buffer
  63.         /*
  64.          * Base address of the ADC12B Module
  65.          * Configure memory buffer 0
  66.          * Map input A1 to memory buffer 0
  67.          * Vref+ = AVcc
  68.          * Vref- = AVss
  69.          * Memory buffer 0 is not the end of a sequence
  70.          */
  71.         ADC12_B_configureMemoryParam configureMemoryParam = {0};
  72.         configureMemoryParam.memoryBufferControlIndex = ADC12_B_MEMORY_0;
  73.         configureMemoryParam.inputSourceSelect = ADC12_B_INPUT_A1;
  74.         configureMemoryParam.refVoltageSourceSelect =
  75.             ADC12_B_VREFPOS_AVCC_VREFNEG_VSS;
  76.         configureMemoryParam.endOfSequence = ADC12_B_NOTENDOFSEQUENCE;
  77.         configureMemoryParam.windowComparatorSelect =
  78.             ADC12_B_WINDOW_COMPARATOR_DISABLE;
  79.         configureMemoryParam.differentialModeSelect =
  80.             ADC12_B_DIFFERENTIAL_MODE_DISABLE;
  81.         ADC12_B_configureMemory(ADC12_B_BASE, &configureMemoryParam);

  82.         ADC12_B_clearInterrupt(ADC12_B_BASE,
  83.                                0,
  84.                                ADC12_B_IFG0
  85.                                );

  86.         //Enable memory buffer 0 interrupt
  87.         ADC12_B_enableInterrupt(ADC12_B_BASE,
  88.                                 ADC12_B_IE0,
  89.                                 0,
  90.                                 0);

  91.         while(1)
  92.         {
  93.             __delay_cycles(5000);

  94.             //Enable/Start sampling and conversion
  95.             /*
  96.              * Base address of ADC12B Module
  97.              * Start the conversion into memory buffer 0
  98.              * Use the single-channel, single-conversion mode
  99.              */
  100.             ADC12_B_startConversion(ADC12_B_BASE,
  101.                                     ADC12_B_MEMORY_0,
  102.                                     ADC12_B_SINGLECHANNEL);

  103.             __bis_SR_register(LPM0_bits + GIE);     // LPM0, ADC12_B_ISR will force exit
  104.             __no_operation();                       // For debugger
  105.         }



  106. }


  107. #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
  108. #pragma vector=ADC12_VECTOR
  109. __interrupt
  110. #elif defined(__GNUC__)
  111. __attribute__((interrupt(ADC12_VECTOR)))
  112. #endif
  113. void ADC12_ISR(void)
  114. {
  115.     switch(__even_in_range(ADC12IV,12))
  116.     {
  117.     case  0: break;                         // Vector  0:  No interrupt
  118.     case  2: break;                         // Vector  2:  ADC12BMEMx Overflow
  119.     case  4: break;                         // Vector  4:  Conversion time overflow
  120.     case  6: break;                         // Vector  6:  ADC12BHI
  121.     case  8: break;                         // Vector  8:  ADC12BLO
  122.     case 10: break;                         // Vector 10:  ADC12BIN
  123.     case 12:                                // Vector 12:  ADC12BMEM0 Interrupt


  124.         if(ADC12_B_getResults(ADC12_B_BASE, ADC12_B_MEMORY_0) >= 0x7ff)
  125.         {
  126.             //Set P1.0 LED on
  127.             /*

  128.              * Select Port 1
  129.              * Set Pin 0 to output high.
  130.              */
  131.             GPIO_setOutputHighOnPin(
  132.                 GPIO_PORT_P1,
  133.                 GPIO_PIN0
  134.                 );
  135.         }
  136.         else
  137.         {
  138.             //Set P1.0 LED off
  139.             /*

  140.              * Select Port 1
  141.              * Set Pin 0 to output high.
  142.              */
  143.             GPIO_setOutputLowOnPin(
  144.                 GPIO_PORT_P1,
  145.                 GPIO_PIN0
  146.                 );
  147.         }
  148.         __bic_SR_register_on_exit(LPM0_bits);   // Exit active CPU
  149.         break;                              // Clear CPUOFF bit from 0(SR)
  150.     case 14: break;                         // Vector 14:  ADC12BMEM1
  151.     case 16: break;                         // Vector 16:  ADC12BMEM2
  152.     case 18: break;                         // Vector 18:  ADC12BMEM3
  153.     case 20: break;                         // Vector 20:  ADC12BMEM4
  154.     case 22: break;                         // Vector 22:  ADC12BMEM5
  155.     case 24: break;                         // Vector 24:  ADC12BMEM6
  156.     case 26: break;                         // Vector 26:  ADC12BMEM7
  157.     case 28: break;                         // Vector 28:  ADC12BMEM8
  158.     case 30: break;                         // Vector 30:  ADC12BMEM9
  159.     case 32: break;                         // Vector 32:  ADC12BMEM10
  160.     case 34: break;                         // Vector 34:  ADC12BMEM11
  161.     case 36: break;                         // Vector 36:  ADC12BMEM12
  162.     case 38: break;                         // Vector 38:  ADC12BMEM13
  163.     case 40: break;                         // Vector 40:  ADC12BMEM14
  164.     case 42: break;                         // Vector 42:  ADC12BMEM15
  165.     case 44: break;                         // Vector 44:  ADC12BMEM16
  166.     case 46: break;                         // Vector 46:  ADC12BMEM17
  167.     case 48: break;                         // Vector 48:  ADC12BMEM18
  168.     case 50: break;                         // Vector 50:  ADC12BMEM19
  169.     case 52: break;                         // Vector 52:  ADC12BMEM20
  170.     case 54: break;                         // Vector 54:  ADC12BMEM21
  171.     case 56: break;                         // Vector 56:  ADC12BMEM22
  172.     case 58: break;                         // Vector 58:  ADC12BMEM23
  173.     case 60: break;                         // Vector 60:  ADC12BMEM24
  174.     case 62: break;                         // Vector 62:  ADC12BMEM25
  175.     case 64: break;                         // Vector 64:  ADC12BMEM26
  176.     case 66: break;                         // Vector 66:  ADC12BMEM27
  177.     case 68: break;                         // Vector 68:  ADC12BMEM28
  178.     case 70: break;                         // Vector 70:  ADC12BMEM29
  179.     case 72: break;                         // Vector 72:  ADC12BMEM30
  180.     case 74: break;                         // Vector 74:  ADC12BMEM31
  181.     case 76: break;                         // Vector 76:  ADC12BRDY
  182.     default: break;
  183.     }
  184. }

复制代码
 
 
 

回复

348

帖子

0

TA的资源

一粒金砂(高级)

11
 
huaiqiao 发表于 2016-8-17 22:56
停在哪里,看寄存器的值。
要根据语句找到相应的寄存器啊,然后看寄存器里面位的值,是不是你想要的值。 ...

嗯呢呢,谢谢哦,经常看见你的哈
 
 
 

回复

348

帖子

0

TA的资源

一粒金砂(高级)

12
 
huaiqiao 发表于 2016-8-17 22:56
停在哪里,看寄存器的值。
要根据语句找到相应的寄存器啊,然后看寄存器里面位的值,是不是你想要的值。 ...

你好,我单步调试后,发现程序停在了这个地方,如图所示,从ADC的中断出来后,程序就一直停在箭头所指的地方,等待唤醒。

我的问题是:为什么会一直停在是 __bis_SR_register(LPM0_bits + GIE); 这个地方,而不会进入while循环?

代码已经在原帖的回帖中贴出。

麻烦指导一下,谢谢。

点评

1、首先我觉得你不熟悉的话,就一句一句去添加注释,把每条语句吃透。。。。别拿个官网的例程在那里一步步的debug直到恶心,这样没什么用,非但解决不了问题还浪费时间; 2、我记得手册中有对LMP的几种模式做对比。  详情 回复 发表于 2016-8-18 23:14
 
 
 

回复

348

帖子

0

TA的资源

一粒金砂(高级)

13
 
littleshrimp 发表于 2016-8-17 23:22
是停了还是全速运行?
看你的代码里明明有休眠
时钟你是怎么配置的

你好,时钟使用的是ADC内部的那个MODCLK时钟

你好,我单步调试后,发现程序停在了这个地方,如图所示,从ADC的中断出来后,程序就一直停在箭头所指的地方,等待唤醒。


我的问题是:为什么会一直停在是 __bis_SR_register(LPM0_bits + GIE); 这个地方,而不会进入while循环?

代码已经在原帖的回帖中贴出。

麻烦指导一下,谢谢。

点评

whilewhileл ADCже мкп ж LED LEDж ж  详情 回复 发表于 2016-8-18 17:24
 
 
 

回复

9795

帖子

24

TA的资源

版主

14
 
本帖最后由 littleshrimp 于 2016-8-18 17:27 编辑






现在的断点已经在while里你while里只有休眠没有唤醒
唤醒是在ADC中断里执行的


没有继续执行很有可能是休眠没被唤醒

你可以通过测量单片机的电流判断
或者分别在休眠前熄灭LED
唤醒后点亮LED来判断
或者向串口和示波器输出数据判断

有时
我遇到过没有配置低速时钟造成休眠后无法唤醒的情况
你可以试试

点评

谢谢版主大人  详情 回复 发表于 2016-8-19 08:16
 
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

15
 
火火山 发表于 2016-8-18 16:17
你好,我单步调试后,发现程序停在了这个地方,如图所示,从ADC的中断出来后,程序就一直停在箭头所指的 ...

1、首先我觉得你不熟悉的话,就一句一句去添加注释,把每条语句吃透。。。。别拿个官网的例程在那里一步步的debug直到恶心,这样没什么用,非但解决不了问题还浪费时间;
2、我记得手册中有对LMP的几种模式做对比。那个对比里面写了在该模式下,时钟等等的一些关闭、打开的情况(多看手册哦 ,抱着例程啃是不出效果的哦。)
3、你的ADC12的中断里 __bic_SR_register_on_exit(LPM0_bits)
这条语句被屏蔽了,说明就没有退出LPM0模式。
另外,好久不用430了。。。

点评

我是一边看例程,然后根据例程看手册,这样理解会深刻一些。 谢谢你哦  详情 回复 发表于 2016-8-19 08:18
 
 
 

回复

348

帖子

0

TA的资源

一粒金砂(高级)

16
 
littleshrimp 发表于 2016-8-18 17:24
现在的断点已经在while里你while里只有休眠没有唤醒
唤醒是在ADC中断里执行的


没有继续执 ...

谢谢版主大人

 
 
 

回复

348

帖子

0

TA的资源

一粒金砂(高级)

17
 
huaiqiao 发表于 2016-8-18 23:14
1、首先我觉得你不熟悉的话,就一句一句去添加注释,把每条语句吃透。。。。别拿个官网的例程在那里一步 ...

我是一边看例程,然后根据例程看手册,这样理解会深刻一些。

谢谢你哦
 
 
 

回复

2549

帖子

0

TA的资源

五彩晶圆(初级)

18
 
难道不正常么

点评

不进入低功耗模式,就很正常啦 哟~~~抓到你啦,原来你在这里呀  详情 回复 发表于 2016-8-19 16:00
 
 
 

回复

348

帖子

0

TA的资源

一粒金砂(高级)

19
 

不进入低功耗模式,就很正常啦

哟~~~抓到你啦,原来你在这里呀

点评

看来你已经找到原因了最近一段时间没上论坛而已  详情 回复 发表于 2016-8-19 16:02
 
 
 

回复

2549

帖子

0

TA的资源

五彩晶圆(初级)

20
 
火火山 发表于 2016-8-19 16:00
不进入低功耗模式,就很正常啦

哟~~~抓到你啦,原来你在这里呀

看来你已经找到原因了最近一段时间没上论坛而已

点评

群主大大告诉我拉~~  详情 回复 发表于 2016-8-19 16:11
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表