Giles Barton-Owen
/
SDCardACEL
acc_dev
main.cpp@0:3033fd7e75a4, 2010-04-13 (annotated)
- Committer:
- p07gbar
- Date:
- Tue Apr 13 19:14:00 2010 +0000
- Revision:
- 0:3033fd7e75a4
Who changed what in which revision?
User | Revision | Line number | New 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 | } |