3585|4

17

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

怎么在AD转换中断里写SD卡? [复制链接]

我用的是TA的触发信号,然后想在AD转换的中断里把转换的数据写进SD卡的文件里,但是总是只能写一次的数据,不能接着上次写的数据写。文件系统用的FAT16格式的。贴一段代码,大家看看是哪里出问题了。

 

 

 

 

#include <msp430x14x.h>
#include "mmc.h"
#include "fAT16.h"
#include <stdio.h>
#include <string.h>

unsigned long cardSize = 0;
unsigned char status = 1;
unsigned int timeout = 0;
int i = 0;
int z=0;
char buffer[512]="";
char str[16];
int k=0;
unsigned int AC[200]={0};    //存放交流结果
uint8 Name[11];
#define   Num_of_Results   64
int results[Num_of_Results] = {0};

void ADC_Init(void);

void main(void)
{
  WDTCTL = WDTPW | WDTHOLD;                 // Disable the Watchdog.
   while (status != 0)                       // if return in not NULL an error did occur and the 

                                        // MMC/SD-card will be initialized again
  {
    status = initMMC();
    timeout++;
    if (timeout == 50)                      // Try 50 times till error
    {
      printf ("No MMC/SD-card found!! %x\n", status);
      break;
    }
  }
  while ((mmc_ping() != MMC_SUCCESS));      // Wait till card is inserted
  // Read the Card Size from the CSD Register
  cardSize =  MMC_ReadCardSize();
  ReadBPB();
  uint8 Name[11]="TEST0000TXT";
  CreateFile(Name);
  P4DIR=0x03;
  ADC_Init();                               // Initialize ADC12
  ADC12CTL0 |= ENC;                         // Start conversion
  while(1);
}


void ADC_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 = 32;                            // Delay to allow Ref to settle
  TACCTL0 |= CCIE;                          // Compare-mode interrupt.
  TACTL = TASSEL_1 | 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 = 32;                               // Init TACCR0 w/ sample prd=CCR0+1
  TACCR1 = 16;                               // Trig for ADC12 sample & convert
  TACCTL1 = OUTMOD_3;                       // Set/reset
  TACTL = TACLR | MC_1 | TASSEL_1;          // ACLK, clear TAR, up mode
}

// Timer_A0 Interrupt Service Routine
#pragma vector=TIMERA0_VECTOR
__interrupt void ta0_isr(void)
{
 
  TACTL = 0;
  LPM0_EXIT;                                // Exit LPM0 on return
}


// ADC12 Interrupt Service Routine
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
   if(z%2==0)

  P4OUT=0x01;
  results[z++]=ADC12MEM0;
}
  else

  P4OUT=0x02;
  results[z++]=ADC12MEM0;

  if (z == 64)
  {
    z = 0;
    for(int j=0;j<64;j++)
       {
       sprintf(str,"%04x    ",results[j]);
        strcat(buffer,str);
       }
      
        OperateFile(1,"TEST0000TXT",k*512,512,buffer);
         k++;
   
  }
}
}

 

 

 

 

最新回复

       好  详情 回复 发表于 2015-7-27 20:33
 
点赞 关注

回复
举报

2002

帖子

24

TA的资源

五彩晶圆(高级)

沙发
 
关键应该在这个函数OperateFile(1,"TEST0000TXT",k*512,512,buffer); 
里面确保:
你判断是否存在文件,不存在用创建方式打开(一般不会,因为你上面已经创建了); 
如果存在,用读写方式打开,并移动指针到文件末尾,再写入

另外,建议把数据保存部分放到中断外面。
[ 本帖最后由 shower.xu 于 2012-6-8 22:52 编辑 ]
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 shower.xu 的帖子

搬到外面去岂不是不能实现连续存储了。我要的就是要它不停地存啊。
 
 
 

回复

2002

帖子

24

TA的资源

五彩晶圆(高级)

4
 
首先我不太清楚你是怎么读写SD卡的,所以不好说。
其次你可以这样:
设置一个全局标志,当AD采样满512字节时置1。
主函数里检测到标志为1就写入,清标志,等待。
如果中断影响写入的话先禁止中断,不一定
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

5
 
       好
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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