在弄MSP430F149调程序时发现一个奇怪问题,ADC12CTL0 |= ADC12SC.语句执行后,ADC12SC未
刚开始调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;// 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 = ADC12MEM0; // Move results
index = (index+1)%Num_of_Results; // Increment results index, modulo
}
求解啊。我之前都用过这几个演示程序,都好的,怎么现在不行了。。。。。
大虾们,高手们,出来帮帮忙吧!!
http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_660884RPBZAI.jpg
这个是程序1单步的时候的情况 (原文件名:未命名.jpg) 回复【楼主位】aida66
-----------------------------------------------------------------------
http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_660885K87J1E.jpg
这个是程序2单步时的情况 (原文件名:未命名2.jpg) 还有一个问题就是为什么我单步的时候 ADC12SC一直显示的是1 如下图
http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_660886XMNZBD.jpg
(原文件名:未命名3.jpg) 还有我的USB仿真器自己插到电脑上没反应,一定要和开发板连接在一起之后,等板子供电了之后才有反应。。。。。 个人感觉,有时候仿真的时候显示的寄存器值好像会有问题,你可以在中断里面设置断点看看有没有进入中断,
如果进了中断就说明置位成功了但是没显示出来。反之,如果一直没进中断就说明没置位! ADC12SC是个宏定义,永远为1 回复【4楼】changhui0222
-----------------------------------------------------------------------
我没开中断我是用查询方式来判断的。。 回复【5楼】lcofjpC语言砖家
-----------------------------------------------------------------------
对哦,,谢谢你啊 ./emotion/em018.gif 可能是时间太快,置位后马上复位了,观察不到的
只要能正常的进入中断和转换,这个置不置位就不必计较了。 有些标置是硬件开始工作后就自动清除掉了的,只要外设进入了预期状态,别的就不要钻牛角尖了 有些标置是硬件开始工作后就自动清除掉了的,只要外设进入了预期状态,别的就不要钻牛角尖了 不是什么问题都可以仿真的。 回复【9楼】billowtust
-----------------------------------------------------------------------
还有就是 在ADC12SC一置位后,ADCMEM0里面就由值了。但是这个值是错误的。。。我直接把采样端接地了
这又是什么原因呢?? 回复【10楼】billowtust
-----------------------------------------------------------------------
这个不是牛角尖。。
如果ADC12SC不置位,我用查询的方法去判断转换是否完成则ADC12IFG始终没有置位。。 程序一直在while语句中出不来了。。
http://cache.amobbs.com/bbs_upload782111/files_43/ourdev_660930GJQL8T.jpg
仿真图像。。。 (原文件名:未命名34.jpg) 我今天也碰到楼主的问题了
好像TI给的那个例程只能用通道0,如果按照其他通道来改动的话不能成功,一直停在while那儿
后来我是直接在通道选择里面选择第四通道来测量A4口的电压,即 ADC12MCTL0 = ADC12SREF_0|0x04;
像我那样能行,但是就是想不通
页:
[1]