This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

我想用ADC采样电压然后存到片内Flash里面,但是不知道是因为我的被采信号输入有问题还是程序中断有问题,目前程序经过仿真无法走到中断函数内,但是经过初始化的数组却能存入Flash中,大神请帮看看,指出问题。谢谢大家。主函数如下:



//tsadc

#include <msp430X14X.h>
#include "BoardConfig.h"
#include "tsflash.h"
#include <stdio.h>
#include <string.h>

void InitSys();
#define FLASHA_ADR 0x1080 //FLASH 的A 段起始地址
//#define FLASHD_ADR 0x2500 //FLASH 中某一段中的地址

#define N_DATA 5
unsigned char DataB[N_DATA]={0,4,4,4,4};
//unsigned char *DataB;
#define Num_of_Results 32

static uint results[Num_of_Results];
void Trans_val(uint Hex_Val);
/*****************************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
BoardConfig(0xb8);
P6SEL |=0x01;
ADC12CTL0 = SHT0_8 + REF2_5V + ADC12ON + MSC;//Config ADC12
ADC12CTL1 = SHP + CONSEQ_2;
ADC12IE = 0x01;
ADC12CTL0 |=ENC;
ADC12CTL0 |=ADC12SC;
_EINT();
_BIS_SR(LPM0_bits + GIE); // Enter LPM0, Enable interrupts
// LPM0;
}

#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
static uint index=0;
results[index++]=ADC12MEM0;
if (index==Num_of_Results)
{
uchar i;
unsigned long sum =0;
unsigned long summ =0;
index =0;
for(i=0;i<Num_of_Results;i++)
{
sum +=results[i];
}
sum>>=5; //除以32 右移5位 2^5
//Trans_val(sum);
summ=99;
sflash(sum);
// DataB[1]=2;
}
}
//void Trans_val(uint Hex_Val)
//{
// long caltmp;
// char Curr_Volt;
/// char b[10];
///// caltmp = Hex_Val;
//caltmp=(caltmp<<4)+9*Hex_Val; //扩大25倍 左移4位+9倍
///caltmp=(caltmp>>3)+(caltmp<<1);
//Curr_Volt =caltmp>>12;
//

//}
int sflash(int s)
{
unsigned char q0;
unsigned int iq2;
//sprintf(DataB,"%d",s);
unsigned char *pq0=DataB;
unsigned char RDataB[N_DATA]={0,0,0,0,0};
//sprintf(DataB,"%d",s);
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
InitSys(); //初始化
FlashErase(FLASHA_ADR); //段擦除
iq2=FLASHA_ADR;
for(q0=0;q0<5;q0++)
{
FlashWB(iq2,*pq0); //写字节数据
iq2++; //写入字节地址+1
pq0++; //源字节指针+1
}
pq0=(unsigned char *)FLASHA_ADR;
for(q0=0;q0<5;q0++)
{
RDataB[q0]=*pq0;
pq0++;
}

_NOP(); //空操作,便于测试
LPM3; //进入低功耗模式3
}
/**********************************************************************
系统初始化
***********************************************************************/
void InitSys()
{
unsigned int iq0;
//使用XT2 振荡器
BCSCTL1 &= ~XT2OFF; //打开XT2 振荡器
do
{
IFG1 &= ~OFIFG; //清除振荡器失效标志
for (iq0=0xFF; iq0>0; iq0--); //延时,等待XT2 起振
}
while ((IFG1 & OFIFG)!=0); //判断XT2 是否起振
BCSCTL2=SELM_2+SELS; //选择MCLK、SMCLK 为XT2
_EINT();
}

  • 经过初始化的数组却能存入Flash中,说明flash写操作没有问题。

    问题在adc配置部分

    这种需要多个模块协同工作的,也建议分模块进行调试,调试没问题再 放一块联合调试。

    下面有个例程,你参考一下

    //******************************************************************************
    //  MSP-FET430P140 Demo - ADC12, Repeated Single Channel Conversions
    //
    //  Description: This example shows how to perform repeated conversions on a
    //  single channel using "repeat-single-channel" mode.  AVcc is used for the
    //  reference and repeated conversions are performed on Channel A0. Each
    //  conversion result is moved to an 8-element array called results[].  Test by
    //  applying a voltage to channel A0, then running. To view the conversion results
    //  open a watch window and view 'results.'
    //  This can run even in LPM4 mode as ADC has its own clock
    //
    //               MSP430F149
    //             ---------------
    //            |               |
    //     Vin -->|P6.0/A0        |
    //            |               |
    //
    //
    //  M. Mitchell
    //  Texas Instruments Inc.
    //  Feb 2005
    //  Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.21A
    //******************************************************************************
    
    #include <msp430.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.
    
    int 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_register(LPM0_bits + GIE);       // Enter LPM0,Enable interrupts
    }
    
    
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=ADC12_VECTOR
    __interrupt void ADC12ISR (void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
      static unsigned int index = 0;
    
      results[index] = ADC12MEM0;               // Move results
      index = (index+1)%Num_of_Results;         // Increment results index, modulo
    }

     

  • 同意楼上的看法,应该是您的ADC配置问题。您现在用的是MSP430F14X?

    那您可以在  下载 MSP430x13x, MSP430F14x, MSP430F15x, MSP430F16x Code Examples  (ZIP 976 KB ) 

    有相关的ADC例程

    fet140_adc12_01.c ADC12, Sample A0, Set P1.0 if A0 > 0.5*AVcc
    fet140_adc12_02.c ADC12, Using the Internal Reference
    fet140_adc12_03.c ADC12, Sample A10 Temp, Set P1.0 if Temp ++ ~2C
    fet140_adc12_04.c ADC12, Extend Sampling Period with SHT Bits
    fet140_adc12_05.c ADC12, Using an External Reference
    fet140_adc12_06.c ADC12, Repeated Sequence of Conversions
    fet140_adc12_07.c ADC12, Repeated Single Channel Conversions
    fet140_adc12_08.c ADC12, Using 10 External Channels for Conversion
    fet140_adc12_09.c ADC12, Sequence of Conversions (non-repeated)
    fet140_adc12_10.c ADC12, Sample A10 Temp and Convert to oC and oF
    fet140_adc12_11.c ADC12, Single Channel Rpt Mode, TA1 as Sample Trigger

  • 好的 我单独调试一下
  • 好的 谢谢 我来单独调试一下
  • 不明白是我接线不对吗? 还是怎么回事,在使用例程的时候,中断也不会进入,用查看窗口 查看结果也没有变化。adc信号是通过板上的电位器发生的。我在怀疑是不是我仿真的过程有问题?还是什么情况?
  • 你用的什么板子?看看电路原理图。还有,你是怎么观察进没进中断的?
  • 设置断点 调试啊,主要是没结果 板子就是开发板啊。。。。实在是自己太菜

  • 先用TI 的基本例程,测试以下一个通道的ADC基本功能是否工作。或者换一下你配置的采样通道试试。
  • 快速看了以下你的代码,以下代码有点疑问:
    ADC12CTL0 = SHT0_8 + REF2_5V + ADC12ON + MSC;
    你用了MultiSample模式(MSC),这个是一次出发连续采样所以序列中的通道,ADC中断处理函数可能会处理不过来,出现后面的ADC中断被屏蔽掉的现象。

    另外,还是建议你按照例程先测试,排除你的板子的问题。
  • adc模块的问题我已经解决了,已经可以进入中断了,但是对要存的数组进行重新幅值还是有问题。

    是不是 定义成了常量数组而无法改变他的初始值呢?

    那如果定义为变量的话是不是就能解决问题?

  • 现在 存储赋值的问题也解决了 来了新的问题 就是 想要存到flash中的数据和我在view memony中看到的不一样,数很大,所以我怀疑是存数原则的问题,来问问大神们有没有经历过这种啊?
  • 是的。常量按道理不能修改的,要修改就定义成变量。
    flash的问题建议你贴一下现在观察到的现象截图,还有修改后的代码。