|
|
View previous topic :: View next topic |
Author |
Message |
alimary158
Joined: 26 Jan 2012 Posts: 16
|
circular buffer and adc |
Posted: Sun Jan 29, 2012 2:49 am |
|
|
Good morning,
I have wrote this code to read adc values from a sensor and using a circular buffer i want to write them on sd! I have managed to make the code working but it seems I'm missing something since when i make this code run i manage to write on sd just for the length of the buffer and nothing more.
Instead i would like to keep on acquiring variables till there is power off
so what am i doing wrong?
Code: |
int16 data=85;
#define RxADCQsize 64
volatile int16 RxBaseADC[RxADCQsize];
// Rx Ring Buffer control
volatile BYTE RxHeadADC;
BYTE RxTailADC;
#INT_timer2
void timer2_isr()
{
//data=read_adc(); //This function will read the digital value from the ADC
RxBaseADC[RxHeadADC++]=data;
// test if ring buffer wrap is required
if (RxHeadADC >= RxADCQsize)
RxHeadADC = 0;
}
void main (){
FIL fsrc; // file structures
FRESULT result; // FatFs function common result code
WORD btw, bw; // File R/W count
FRESULT FS_Status;
char pressure[16];
int16 value;
disable_interrupts(GLOBAL);
restart_wdt();
// Pic Inizialization
init_pic();
// setup_adc_ports(sAN1);
//setup_adc(ADC_CLOCK_INTERNAL);
//set_adc_channel(1);
setup_timer_2 (T2_DIV_BY_16,255,6);
RxHeadADC=0;
RxTailADC=0;
clear_interrupt(INT_RDA);
enable_interrupts(INT_RDA);
enable_interrupts(int_timer2);
enable_interrupts(GLOBAL);
do
{
FS_Status = f_mountdrv();
}
while (FS_Status);
//Il file creato si chiamera pressure.txt
strcpy(pressure,"adc.txt");
//F_OPEN(): if the file already exist the datas will be appened. if the file doesnt exsist it is created
result=f_open(&fsrc,&pressure,FA_OPEN_ALWAYS | FA_WRITE);
result=f_lseek(&fsrc,fsrc.fsize);
//write a string delimiter to each append data log
strcpy(pressure,"hello");
btw=strlen(pressure);
result=f_write(&fsrc,pressure,btw,&bw);
int i=0;
for(i=0;i<70;i++){
disable_interrupts(int_timer2);
//while
if(RxHeadADC != RxTailADC)
{
enable_interrupts(int_timer2);
// here we have data waiting to be written
sprintf(pressure,"Valore=%lu\r\n",RxBaseADC[RxTailADC++]);
// test if ring buffer wrap is required
if (RxTailADC >= RxADCQsize)
RxTailADC=0;
result=f_write(&fsrc,pressure,strlen(pressure),&bw);
}
else
enable_interrupts(int_timer2);
}
f_close(&fsrc);
}
|
In particular in this code i would like to use the adc in the interrupt timer2 and read the values there and put them in the buffer. I know i should have a infinite loop somewhere and i tried now to make a loop with a for() to check if i can actually lets say write 70 samples on the file. But it seems I am not able and I'm just outputting 30 samples.
Anyone can help? Thanks |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9246 Location: Greensville,Ontario
|
|
Posted: Sun Jan 29, 2012 11:35 am |
|
|
This is not a complete program, unknown PIC type, compiler version,etc.
Odds are real good you're trying to use a 5volt PIC with an SD card...never going to work unless you have logic level convertor chips in the circuit( will need to see your schematic).
Have NO idea what 'driver' is being used for the SD card access...
You say you want to use interrupts ,yet you disable them in main()...
I suggest you delete everything and start over..
Create a simple program that loops for say 255 times to store data to the sdcard. If you save it in CSV format, any PC will be able to read the data and you can confirm that it is correct.This program might take 15-20 lines of code. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon Jan 30, 2012 9:43 pm |
|
|
Quote: | btw=strlen(pressure);
result=f_write(&fsrc,pressure,btw,&bw);
int i=0;
for(i=0;i<70;i++){
disable_interrupts(int_timer2);
|
Declaration of variables in the middle of code is not allowed in CCS.
Put all variable declarations at the beginning of each function. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|