acc_dev

Dependencies:   mbed

Committer:
p07gbar
Date:
Tue Apr 13 19:14:00 2010 +0000
Revision:
0:3033fd7e75a4

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
p07gbar 0:3033fd7e75a4 1 #include "mbed.h"
p07gbar 0:3033fd7e75a4 2 #include "SDFileSystem.h"
p07gbar 0:3033fd7e75a4 3
p07gbar 0:3033fd7e75a4 4 SDFileSystem sd(p5, p6, p7, p8, "sd");
p07gbar 0:3033fd7e75a4 5
p07gbar 0:3033fd7e75a4 6 //WWWWROTE is an interrupt driven AD345 logger - 16/3/2010 Tim Owen
p07gbar 0:3033fd7e75a4 7 //This works OK for up to 1Mbyte files to flash -
p07gbar 0:3033fd7e75a4 8 // misses at 1600, ? at 800s/s probably OK at 400s/s ?????
p07gbar 0:3033fd7e75a4 9 //This version writes on a read by read basis, no buffering internally
p07gbar 0:3033fd7e75a4 10 //It stores in MBED flash, records by interrupt- it logs write times
p07gbar 0:3033fd7e75a4 11 // usually its just OK at 1600 ss but the occasional write is too long.
p07gbar 0:3033fd7e75a4 12 // needs a more reliable data store!!!!!!!!
p07gbar 0:3033fd7e75a4 13 //class definitions etc
p07gbar 0:3033fd7e75a4 14 //defines
p07gbar 0:3033fd7e75a4 15 #define MAXFILESIZE 60 // secs
p07gbar 0:3033fd7e75a4 16 #define BUFSIZE 16 // size of 2 ram flipflop buffers
p07gbar 0:3033fd7e75a4 17 #define CHANS 3 // number of stored data values
p07gbar 0:3033fd7e75a4 18 #define READSIZE 16 // reads 16 x 3 int data values
p07gbar 0:3033fd7e75a4 19 #define SS3200 0x0F // AD345 at 3200 s/s &c
p07gbar 0:3033fd7e75a4 20 #define SS1600 0x0E
p07gbar 0:3033fd7e75a4 21 #define SS800 0x0D
p07gbar 0:3033fd7e75a4 22 #define SS400 0x0C
p07gbar 0:3033fd7e75a4 23 #define SS200 0x0B
p07gbar 0:3033fd7e75a4 24 #define SPFIFO 0x51 // 17 samples - interrupt is dodgy if its 16 ???? curious
p07gbar 0:3033fd7e75a4 25 #define SPRATE SS400 // see above
p07gbar 0:3033fd7e75a4 26 #define SPINTE 0x02 //watermark
p07gbar 0:3033fd7e75a4 27 #define SPINTM 0x00 // true low
p07gbar 0:3033fd7e75a4 28 #define SPDATA 0x2B // 16g
p07gbar 0:3033fd7e75a4 29 #define SPPWRR 0x08 // pwr ready - run
p07gbar 0:3033fd7e75a4 30 #define SPPWRS 0x00 // pwr Standby - stop
p07gbar 0:3033fd7e75a4 31
p07gbar 0:3033fd7e75a4 32 Serial pc(USBTX, USBRX); // tx, rx
p07gbar 0:3033fd7e75a4 33 DigitalOut led(LED1); // useful indicator of progress
p07gbar 0:3033fd7e75a4 34 SPI spi(p11, p12, p13); // mosi, miso, sclk
p07gbar 0:3033fd7e75a4 35 DigitalOut cs(p22); //SPI chip select true lo
p07gbar 0:3033fd7e75a4 36 InterruptIn watermark(p21); // goes lo when fifo has >21 values
p07gbar 0:3033fd7e75a4 37 FILE *fp;
p07gbar 0:3033fd7e75a4 38 Timer t; // output write file - bin
p07gbar 0:3033fd7e75a4 39
p07gbar 0:3033fd7e75a4 40
p07gbar 0:3033fd7e75a4 41 //function prototypes
p07gbar 0:3033fd7e75a4 42 int secondise(int in);
p07gbar 0:3033fd7e75a4 43 int AD345_init(int rate); // sets up accelerometer, rate = 100 x2 ...3200 s/s
p07gbar 0:3033fd7e75a4 44 int AD345_check(void); // checks values in essential registers
p07gbar 0:3033fd7e75a4 45 int AD345_standby(void); // sets to standby mode to save power
p07gbar 0:3033fd7e75a4 46 void AD345_watermark_service(void); //services Watermark interrupt
p07gbar 0:3033fd7e75a4 47 int show_bin_file(char* filename); //reads binary file to screen
p07gbar 0:3033fd7e75a4 48 int write_file(void*, int );
p07gbar 0:3033fd7e75a4 49 int secs =0, mins = 0;
p07gbar 0:3033fd7e75a4 50 // global variables
p07gbar 0:3033fd7e75a4 51 int buf[BUFSIZE*CHANS];
p07gbar 0:3033fd7e75a4 52 int buf_write_count; // number of ints in buffer to write.
p07gbar 0:3033fd7e75a4 53 int buf_index=0; // buf index points to next free space.
p07gbar 0:3033fd7e75a4 54 int buf_file=0, elapse =0; // is a file open?
p07gbar 0:3033fd7e75a4 55 int rate,data_size=0,service_count=0; //
p07gbar 0:3033fd7e75a4 56 int file_size =0,write_count=0; // running total of writes
p07gbar 0:3033fd7e75a4 57 int times[400],tindex=0,dumps[400];
p07gbar 0:3033fd7e75a4 58 int bytes_written=0;
p07gbar 0:3033fd7e75a4 59 int SampsCollected = 0;
p07gbar 0:3033fd7e75a4 60 int samptime = 0;int samptimeS = 0;
p07gbar 0:3033fd7e75a4 61 //buffer - there are 2 buffers of BUFSIZE ints each, buf_insw sets which buffer to use for input
p07gbar 0:3033fd7e75a4 62 // and buf_outsw sets buffer to read. buf_in_indx and ..._out_indx are buf pointers
p07gbar 0:3033fd7e75a4 63
p07gbar 0:3033fd7e75a4 64 int secondise(int in)
p07gbar 0:3033fd7e75a4 65 {
p07gbar 0:3033fd7e75a4 66 float S = in/1000;
p07gbar 0:3033fd7e75a4 67 int real = 0;
p07gbar 0:3033fd7e75a4 68 while(real < S - 1)
p07gbar 0:3033fd7e75a4 69 {
p07gbar 0:3033fd7e75a4 70 real = real + 1;
p07gbar 0:3033fd7e75a4 71 }
p07gbar 0:3033fd7e75a4 72 return real;
p07gbar 0:3033fd7e75a4 73 }
p07gbar 0:3033fd7e75a4 74
p07gbar 0:3033fd7e75a4 75 int AD345_init(int rate) {
p07gbar 0:3033fd7e75a4 76 //rate not used yet
p07gbar 0:3033fd7e75a4 77 // Setup the spi for
p07gbar 0:3033fd7e75a4 78 // 8 bit data, high steady state clock,
p07gbar 0:3033fd7e75a4 79 // second edge capture, with a 1000KHz clock rate
p07gbar 0:3033fd7e75a4 80 //watermark trigger via INT1 pin going lo on 21 datavalues
p07gbar 0:3033fd7e75a4 81 spi.format(8,3);
p07gbar 0:3033fd7e75a4 82 spi.frequency(1000000);
p07gbar 0:3033fd7e75a4 83 cs = 0;
p07gbar 0:3033fd7e75a4 84 pc.printf("."); // this doesn't work - only when its copied below
p07gbar 0:3033fd7e75a4 85 spi.write(0x38); // write FIFO
p07gbar 0:3033fd7e75a4 86 spi.write(SPFIFO); // (mode FIFO-watermark )
p07gbar 0:3033fd7e75a4 87 cs = 1;
p07gbar 0:3033fd7e75a4 88 pc.printf(".");
p07gbar 0:3033fd7e75a4 89 cs = 0;
p07gbar 0:3033fd7e75a4 90 spi.write(0x2C); // write RATE
p07gbar 0:3033fd7e75a4 91 spi.write(SPRATE); // (? Hz)
p07gbar 0:3033fd7e75a4 92 cs = 1;
p07gbar 0:3033fd7e75a4 93 pc.printf(".");
p07gbar 0:3033fd7e75a4 94 cs = 0;
p07gbar 0:3033fd7e75a4 95 spi.write(0x2E); // write INT_ENABLE
p07gbar 0:3033fd7e75a4 96 spi.write(SPINTE); // (watermark)
p07gbar 0:3033fd7e75a4 97 cs = 1;
p07gbar 0:3033fd7e75a4 98 pc.printf(".");
p07gbar 0:3033fd7e75a4 99 cs = 0;
p07gbar 0:3033fd7e75a4 100 spi.write(0x2F); // write INT_MAP
p07gbar 0:3033fd7e75a4 101 spi.write(SPINTM); // (to INT1
p07gbar 0:3033fd7e75a4 102 cs = 1;
p07gbar 0:3033fd7e75a4 103 pc.printf(".");
p07gbar 0:3033fd7e75a4 104 cs = 0;
p07gbar 0:3033fd7e75a4 105 spi.write(0x31); // write DATA
p07gbar 0:3033fd7e75a4 106 spi.write(SPDATA); // (16g)
p07gbar 0:3033fd7e75a4 107 cs = 1;
p07gbar 0:3033fd7e75a4 108 cs = 0;
p07gbar 0:3033fd7e75a4 109 pc.printf(".");
p07gbar 0:3033fd7e75a4 110 spi.write(0x38); // write FIFO
p07gbar 0:3033fd7e75a4 111 spi.write(SPFIFO); // (mode FIFO-watermark)
p07gbar 0:3033fd7e75a4 112 cs = 1;
p07gbar 0:3033fd7e75a4 113 pc.printf(".");
p07gbar 0:3033fd7e75a4 114 cs = 0;
p07gbar 0:3033fd7e75a4 115 spi.write(0x2D); // write PWRCTL
p07gbar 0:3033fd7e75a4 116 spi.write(SPPWRR); // (ON)
p07gbar 0:3033fd7e75a4 117 cs = 1;
p07gbar 0:3033fd7e75a4 118 return(1);
p07gbar 0:3033fd7e75a4 119 }
p07gbar 0:3033fd7e75a4 120
p07gbar 0:3033fd7e75a4 121 int AD345_standby(void) {// sets AD345 into standby mode at the end of the run;
p07gbar 0:3033fd7e75a4 122 int pwrc;
p07gbar 0:3033fd7e75a4 123
p07gbar 0:3033fd7e75a4 124 pc.printf(".");
p07gbar 0:3033fd7e75a4 125 cs = 0;
p07gbar 0:3033fd7e75a4 126 spi.write(0x2D); // write PWRCTL
p07gbar 0:3033fd7e75a4 127 spi.write(0x00); // (Standby)
p07gbar 0:3033fd7e75a4 128 cs = 1;
p07gbar 0:3033fd7e75a4 129 pc.printf(".");
p07gbar 0:3033fd7e75a4 130 cs = 0;
p07gbar 0:3033fd7e75a4 131 spi.write(0x2D); // write PWRCTL
p07gbar 0:3033fd7e75a4 132 spi.write(0x00); // (Standby)
p07gbar 0:3033fd7e75a4 133 cs = 1;
p07gbar 0:3033fd7e75a4 134 cs = 0;
p07gbar 0:3033fd7e75a4 135 spi.write(0xAD); // read PWRCTL
p07gbar 0:3033fd7e75a4 136 pwrc = spi.write(0x00); // (?)
p07gbar 0:3033fd7e75a4 137 cs = 1;
p07gbar 0:3033fd7e75a4 138 return(pwrc&0x08); // 0 if its in standby
p07gbar 0:3033fd7e75a4 139 }
p07gbar 0:3033fd7e75a4 140
p07gbar 0:3033fd7e75a4 141 int AD345_check(void) {//check them &prints out register values if wrong
p07gbar 0:3033fd7e75a4 142 char dump,pwrc,fifo,intc,intm,data,rate, loops,error=0;
p07gbar 0:3033fd7e75a4 143 loops = 3;
p07gbar 0:3033fd7e75a4 144 while (loops--) {
p07gbar 0:3033fd7e75a4 145 cs = 0;
p07gbar 0:3033fd7e75a4 146 dump = spi.write(0xAD); // read PWRCTL
p07gbar 0:3033fd7e75a4 147 pwrc = spi.write(0x00); // (ON)
p07gbar 0:3033fd7e75a4 148 cs = 1;
p07gbar 0:3033fd7e75a4 149 pc.printf(".");
p07gbar 0:3033fd7e75a4 150 cs = 0;
p07gbar 0:3033fd7e75a4 151 dump = spi.write(0xB8); // read FIFOCTL
p07gbar 0:3033fd7e75a4 152 fifo = spi.write(0x00); // (FIFO)
p07gbar 0:3033fd7e75a4 153 cs = 1;
p07gbar 0:3033fd7e75a4 154 pc.printf(".");
p07gbar 0:3033fd7e75a4 155 cs = 0;
p07gbar 0:3033fd7e75a4 156 dump = spi.write(0xAE); // read INT_EN
p07gbar 0:3033fd7e75a4 157 intc = spi.write(0x00); //
p07gbar 0:3033fd7e75a4 158 cs = 1;
p07gbar 0:3033fd7e75a4 159 pc.printf(".");
p07gbar 0:3033fd7e75a4 160 cs = 0;
p07gbar 0:3033fd7e75a4 161 dump = spi.write(0xAF); // read INT_MAP
p07gbar 0:3033fd7e75a4 162 intm = spi.write(0x00); // (INTM)
p07gbar 0:3033fd7e75a4 163 cs = 1;
p07gbar 0:3033fd7e75a4 164 pc.printf(".");
p07gbar 0:3033fd7e75a4 165 cs = 0;
p07gbar 0:3033fd7e75a4 166 dump = spi.write(0xB1); // read data
p07gbar 0:3033fd7e75a4 167 data = spi.write(0x00); // (DATA)
p07gbar 0:3033fd7e75a4 168 cs = 1;
p07gbar 0:3033fd7e75a4 169 pc.printf(".");
p07gbar 0:3033fd7e75a4 170 cs = 0;
p07gbar 0:3033fd7e75a4 171 dump = spi.write(0xAC); // read RATE
p07gbar 0:3033fd7e75a4 172 rate = spi.write(0x00); // (400 Hz)
p07gbar 0:3033fd7e75a4 173 cs = 1;
p07gbar 0:3033fd7e75a4 174
p07gbar 0:3033fd7e75a4 175 if ( fifo != SPFIFO) {
p07gbar 0:3033fd7e75a4 176 pc.printf("\n\rError FIFO %c = 0x%02X\n\r",SPFIFO,fifo);
p07gbar 0:3033fd7e75a4 177 error++;
p07gbar 0:3033fd7e75a4 178 }
p07gbar 0:3033fd7e75a4 179 if ( intc != SPINTE) {
p07gbar 0:3033fd7e75a4 180 pc.printf("Error INTC %c = 0x%02X\n\r",SPINTE,intc);
p07gbar 0:3033fd7e75a4 181 error++;
p07gbar 0:3033fd7e75a4 182 }
p07gbar 0:3033fd7e75a4 183 if ( intm != SPINTM) {
p07gbar 0:3033fd7e75a4 184 pc.printf("Error INTM %c = 0x%02X\n\r",SPINTM,intm);
p07gbar 0:3033fd7e75a4 185 error++;
p07gbar 0:3033fd7e75a4 186 }
p07gbar 0:3033fd7e75a4 187 if ( rate != SPRATE) {
p07gbar 0:3033fd7e75a4 188 pc.printf("Error RATE %c = 0x%02X\n\r",SPRATE,rate);
p07gbar 0:3033fd7e75a4 189 error++;
p07gbar 0:3033fd7e75a4 190 }
p07gbar 0:3033fd7e75a4 191 if ( data != SPDATA) {
p07gbar 0:3033fd7e75a4 192 pc.printf("Error DATA %c = 0x%02X\n\r",SPDATA,data);
p07gbar 0:3033fd7e75a4 193 error++;
p07gbar 0:3033fd7e75a4 194 }
p07gbar 0:3033fd7e75a4 195 if ( pwrc != SPPWRR) {
p07gbar 0:3033fd7e75a4 196 pc.printf("Error POWC %c = 0x%02X\n\r",SPPWRR,pwrc);
p07gbar 0:3033fd7e75a4 197 error++;
p07gbar 0:3033fd7e75a4 198 }
p07gbar 0:3033fd7e75a4 199 if (error == 0) {
p07gbar 0:3033fd7e75a4 200 pc.printf("AD345 Setup complete\n\r");
p07gbar 0:3033fd7e75a4 201 return(1);
p07gbar 0:3033fd7e75a4 202 }
p07gbar 0:3033fd7e75a4 203 }
p07gbar 0:3033fd7e75a4 204 return(0);
p07gbar 0:3033fd7e75a4 205 }
p07gbar 0:3033fd7e75a4 206
p07gbar 0:3033fd7e75a4 207 void AD345_watermark_service(void) {
p07gbar 0:3033fd7e75a4 208
p07gbar 0:3033fd7e75a4 209 service_count++;
p07gbar 0:3033fd7e75a4 210 samptime = t.read_ms();
p07gbar 0:3033fd7e75a4 211 samptimeS = t.read();
p07gbar 0:3033fd7e75a4 212 pc.printf("\nTrig T : %i Tms : %i", samptimeS, samptime);
p07gbar 0:3033fd7e75a4 213 int datxlo,datxhi,datylo,datyhi,datzlo,datzhi; //temp variables
p07gbar 0:3033fd7e75a4 214 int datx,daty,datz,ind; //temp variables
p07gbar 0:3033fd7e75a4 215 // check there is enough room in the current buffer before writing to it
p07gbar 0:3033fd7e75a4 216 data_size = 0;
p07gbar 0:3033fd7e75a4 217 buf_index =0;
p07gbar 0:3033fd7e75a4 218 for (ind=0; ind < 16; ind ++) {
p07gbar 0:3033fd7e75a4 219 cs = 0;
p07gbar 0:3033fd7e75a4 220 spi.write(0xF2);
p07gbar 0:3033fd7e75a4 221 datxlo = spi.write(0x80);
p07gbar 0:3033fd7e75a4 222 datxhi = spi.write(0x80);
p07gbar 0:3033fd7e75a4 223 datylo = spi.write(0x80);
p07gbar 0:3033fd7e75a4 224 datyhi = spi.write(0x80);
p07gbar 0:3033fd7e75a4 225 datzlo = spi.write(0x80);
p07gbar 0:3033fd7e75a4 226 datzhi = spi.write(0x80);
p07gbar 0:3033fd7e75a4 227 cs = 1;
p07gbar 0:3033fd7e75a4 228
p07gbar 0:3033fd7e75a4 229
p07gbar 0:3033fd7e75a4 230 datx = datxlo + datxhi*256;
p07gbar 0:3033fd7e75a4 231 if (datx > 32000) datx = -65536+datx;
p07gbar 0:3033fd7e75a4 232 buf[buf_index++] = datx;
p07gbar 0:3033fd7e75a4 233 daty = datylo + datyhi*256;
p07gbar 0:3033fd7e75a4 234 if (daty > 32000) daty = -65536+daty;
p07gbar 0:3033fd7e75a4 235 buf[buf_index++] = daty;
p07gbar 0:3033fd7e75a4 236 datz = datzlo + datzhi*256;
p07gbar 0:3033fd7e75a4 237 if (datz > 32000) datz = -65536+datz;
p07gbar 0:3033fd7e75a4 238 buf[buf_index++]=datz;
p07gbar 0:3033fd7e75a4 239 data_size += 3;
p07gbar 0:3033fd7e75a4 240
p07gbar 0:3033fd7e75a4 241 } // get 16 values
p07gbar 0:3033fd7e75a4 242 // putchar(':');
p07gbar 0:3033fd7e75a4 243 if (service_count > 30000000) { // emergency get out of jail card
p07gbar 0:3033fd7e75a4 244 pc.printf("\n\r gone on too long");
p07gbar 0:3033fd7e75a4 245 fclose(fp);
p07gbar 0:3033fd7e75a4 246 for (tindex=0;tindex < 200;tindex++)
p07gbar 0:3033fd7e75a4 247 //printf("wt=%d - %d //",times[tindex],dumps[tindex]);
p07gbar 0:3033fd7e75a4 248 watermark.fall(NULL);
p07gbar 0:3033fd7e75a4 249 exit(0);
p07gbar 0:3033fd7e75a4 250 }
p07gbar 0:3033fd7e75a4 251 SampsCollected = SampsCollected + 5;
p07gbar 0:3033fd7e75a4 252 //pc.printf("\n\r SAMPS = %i" , SampsCollected);
p07gbar 0:3033fd7e75a4 253 write_file(buf,data_size); //assumes 32 bit ints
p07gbar 0:3033fd7e75a4 254 return;
p07gbar 0:3033fd7e75a4 255 }
p07gbar 0:3033fd7e75a4 256
p07gbar 0:3033fd7e75a4 257 int AD345_data_ready(void) {// this isn't used - its just the non-interrupt version for tests.
p07gbar 0:3033fd7e75a4 258 int pending = 1;
p07gbar 0:3033fd7e75a4 259 int elapse,intc,over_run;
p07gbar 0:3033fd7e75a4 260 led =1;
p07gbar 0:3033fd7e75a4 261 while (pending) {
p07gbar 0:3033fd7e75a4 262 elapse = t.read_us();
p07gbar 0:3033fd7e75a4 263 pending++;
p07gbar 0:3033fd7e75a4 264 cs =0;
p07gbar 0:3033fd7e75a4 265 spi.write(0xB0); // read INT_SOURCE
p07gbar 0:3033fd7e75a4 266 intc = spi.write(0x00); // (INT_SOURCE)
p07gbar 0:3033fd7e75a4 267 cs =1;
p07gbar 0:3033fd7e75a4 268 if (intc&0x01) over_run++;
p07gbar 0:3033fd7e75a4 269 if (intc&0x02) pending = 0;// watermark
p07gbar 0:3033fd7e75a4 270 while (t.read_us() < elapse + 5);
p07gbar 0:3033fd7e75a4 271 }
p07gbar 0:3033fd7e75a4 272 led=0;
p07gbar 0:3033fd7e75a4 273 return(1);
p07gbar 0:3033fd7e75a4 274 }
p07gbar 0:3033fd7e75a4 275
p07gbar 0:3033fd7e75a4 276 int open_file(int junk) {
p07gbar 0:3033fd7e75a4 277 led = 1;
p07gbar 0:3033fd7e75a4 278 fp = fopen("/sd/sdtest.csv", "w");
p07gbar 0:3033fd7e75a4 279
p07gbar 0:3033fd7e75a4 280 if (!fp) {
p07gbar 0:3033fd7e75a4 281 fprintf(stderr, "/sd/sdtest.txt could not be opened!\n");
p07gbar 0:3033fd7e75a4 282 exit(0);
p07gbar 0:3033fd7e75a4 283 } else {
p07gbar 0:3033fd7e75a4 284 buf_file = 1;
p07gbar 0:3033fd7e75a4 285 pc.printf("\n\r/sd/sdtest.txt");
p07gbar 0:3033fd7e75a4 286 }
p07gbar 0:3033fd7e75a4 287 //fprintf(fp, "Hello fun SD Card World!");
p07gbar 0:3033fd7e75a4 288 return(buf_file);
p07gbar 0:3033fd7e75a4 289 }
p07gbar 0:3033fd7e75a4 290
p07gbar 0:3033fd7e75a4 291 int write_file(void *ptr, int size) { // writes file, keeps check of write times and size etc.
p07gbar 0:3033fd7e75a4 292
p07gbar 0:3033fd7e75a4 293 pc.printf("\n\rWrite Called");
p07gbar 0:3033fd7e75a4 294 if (buf_file == 0) open_file(1);
p07gbar 0:3033fd7e75a4 295 led=1;
p07gbar 0:3033fd7e75a4 296 int secondChangeFlag = 100;
p07gbar 0:3033fd7e75a4 297
p07gbar 0:3033fd7e75a4 298 if(samptime - (samptimeS * 1000) < 40)
p07gbar 0:3033fd7e75a4 299 {
p07gbar 0:3033fd7e75a4 300
p07gbar 0:3033fd7e75a4 301 pc.printf("TFlag %i" , samptime - (samptimeS * 1000));
p07gbar 0:3033fd7e75a4 302 int i = 50;
p07gbar 0:3033fd7e75a4 303 while(samptime - (samptimeS * 1000) < i*2.5 && i>0)
p07gbar 0:3033fd7e75a4 304 {
p07gbar 0:3033fd7e75a4 305 secondChangeFlag = i;
p07gbar 0:3033fd7e75a4 306 i = i-1;
p07gbar 0:3033fd7e75a4 307
p07gbar 0:3033fd7e75a4 308 }
p07gbar 0:3033fd7e75a4 309 pc.printf(": %i ", secondChangeFlag);
p07gbar 0:3033fd7e75a4 310 }
p07gbar 0:3033fd7e75a4 311
p07gbar 0:3033fd7e75a4 312 elapse = t.read_ms();
p07gbar 0:3033fd7e75a4 313 int timeS = t.read();
p07gbar 0:3033fd7e75a4 314 int timeStamp = SampsCollected;
p07gbar 0:3033fd7e75a4 315
p07gbar 0:3033fd7e75a4 316 for (int i = 0; i < BUFSIZE/3; i += 1) {
p07gbar 0:3033fd7e75a4 317
p07gbar 0:3033fd7e75a4 318
p07gbar 0:3033fd7e75a4 319 pc.printf("%i,",i);
p07gbar 0:3033fd7e75a4 320
p07gbar 0:3033fd7e75a4 321 if(i == secondChangeFlag)
p07gbar 0:3033fd7e75a4 322 {
p07gbar 0:3033fd7e75a4 323 timeStamp = timeS;
p07gbar 0:3033fd7e75a4 324 SampsCollected = 5-i;
p07gbar 0:3033fd7e75a4 325 }
p07gbar 0:3033fd7e75a4 326 else
p07gbar 0:3033fd7e75a4 327 {
p07gbar 0:3033fd7e75a4 328 timeStamp = SampsCollected + i - 5;
p07gbar 0:3033fd7e75a4 329 }
p07gbar 0:3033fd7e75a4 330 file_size += fprintf(fp, "%i,%i,%i,%i\n", timeStamp, buf[i*3],buf[(i*3)+1],buf[(i*3)+2]);
p07gbar 0:3033fd7e75a4 331 }
p07gbar 0:3033fd7e75a4 332 if (tindex < 399) {
p07gbar 0:3033fd7e75a4 333 times[tindex] = t.read_ms()- elapse;
p07gbar 0:3033fd7e75a4 334 dumps[tindex++] = size;
p07gbar 0:3033fd7e75a4 335 }
p07gbar 0:3033fd7e75a4 336 write_count++;
p07gbar 0:3033fd7e75a4 337 // if(write_count%25 == 0) pc.printf("-%d",write_count);
p07gbar 0:3033fd7e75a4 338 //pc.printf(".");
p07gbar 0:3033fd7e75a4 339 bytes_written += (size*4);
p07gbar 0:3033fd7e75a4 340 pc.printf("done at %i, %i", t.read_ms(), samptime - (samptimeS * 1000));
p07gbar 0:3033fd7e75a4 341 return(1);
p07gbar 0:3033fd7e75a4 342 }
p07gbar 0:3033fd7e75a4 343
p07gbar 0:3033fd7e75a4 344
p07gbar 0:3033fd7e75a4 345 int main() {
p07gbar 0:3033fd7e75a4 346 int num,max=0,tot=0,val=0,vcnt=0,av=0;
p07gbar 0:3033fd7e75a4 347 pc.baud(115200);
p07gbar 0:3033fd7e75a4 348 pc.printf("\n\rWROTE AD345 software - 17/3/2010 Tim Owen");
p07gbar 0:3033fd7e75a4 349 AD345_init(rate);
p07gbar 0:3033fd7e75a4 350 AD345_check();
p07gbar 0:3033fd7e75a4 351 t.start(); // clock starts here
p07gbar 0:3033fd7e75a4 352 AD345_watermark_service(); // empty buffer
p07gbar 0:3033fd7e75a4 353 AD345_watermark_service(); //empty buffer
p07gbar 0:3033fd7e75a4 354 data_size = 0;
p07gbar 0:3033fd7e75a4 355 // place interrupt for watermark flow control
p07gbar 0:3033fd7e75a4 356 watermark.fall(&AD345_watermark_service);
p07gbar 0:3033fd7e75a4 357
p07gbar 0:3033fd7e75a4 358 while (t.read() < MAXFILESIZE) { // sit here in limbo
p07gbar 0:3033fd7e75a4 359 led = 1; // need something to do to fight boredom
p07gbar 0:3033fd7e75a4 360 wait(0.5);
p07gbar 0:3033fd7e75a4 361 led = 0;
p07gbar 0:3033fd7e75a4 362 wait(0.5);
p07gbar 0:3033fd7e75a4 363 }
p07gbar 0:3033fd7e75a4 364 pc.printf("\n\r Ending normally now");
p07gbar 0:3033fd7e75a4 365 watermark.fall(NULL);
p07gbar 0:3033fd7e75a4 366 for (num=0; num < 400;num++) {
p07gbar 0:3033fd7e75a4 367 //// printf("wt=%d - %d //",times[num],dumps[num]);
p07gbar 0:3033fd7e75a4 368 if (times[num] != 0) {
p07gbar 0:3033fd7e75a4 369 tot += times[num];
p07gbar 0:3033fd7e75a4 370 vcnt++;
p07gbar 0:3033fd7e75a4 371 }
p07gbar 0:3033fd7e75a4 372 av = tot/vcnt;
p07gbar 0:3033fd7e75a4 373 if (times[num] > max) max = times[num];
p07gbar 0:3033fd7e75a4 374 if (times[num] > 30) { // appropriate value for 800 s/s ?
p07gbar 0:3033fd7e75a4 375 val++;
p07gbar 0:3033fd7e75a4 376 printf("<%d -%d>",num,times[num]);
p07gbar 0:3033fd7e75a4 377 }
p07gbar 0:3033fd7e75a4 378 }
p07gbar 0:3033fd7e75a4 379
p07gbar 0:3033fd7e75a4 380 fclose(fp);
p07gbar 0:3033fd7e75a4 381 pc.printf("\n\rAD345 calls %d, write av ms = %d, max ms = %d, >15ms = %d", service_count,av,max,val);
p07gbar 0:3033fd7e75a4 382 pc.printf("\n\rBytes in file %d, elapse time %f, s/s %f", bytes_written, t.read(), (float)bytes_written/(4.0*CHANS*t.read()) );
p07gbar 0:3033fd7e75a4 383 led =0;
p07gbar 0:3033fd7e75a4 384 t.stop();
p07gbar 0:3033fd7e75a4 385 AD345_standby();
p07gbar 0:3033fd7e75a4 386 pc.printf("\n\rAD345 in standby mode..");
p07gbar 0:3033fd7e75a4 387 watermark.fall(NULL);
p07gbar 0:3033fd7e75a4 388 pc.printf("\n\rAll done and dusted........");
p07gbar 0:3033fd7e75a4 389 return(0);
p07gbar 0:3033fd7e75a4 390 }