Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 #include "mbed.h" 00002 #include "rtos.h" 00003 #include "SDBlockDevice.h" 00004 #include "FATFileSystem.h" 00005 #include "utility.h" 00006 00007 00008 /* 00009 FLAG SCRITTURA SU SD CARD IN CORSO 00010 */ 00011 bool volatile start_writing; 00012 /* 00013 PULSANTE 00014 */ 00015 bool volatile button_int_f;/* Flag pulsante pigiato */ 00016 InterruptIn user_button(USER_KEY_PIN); 00017 /* 00018 OGGETTO FILE 00019 */ 00020 FILE *fp = NULL; 00021 uint32_t file_index;//Indice che conteggia in maniera progressiva i record sul file 00022 /* 00023 SD Card 00024 */ 00025 SDBlockDevice sd(SDCARD_MOSI, SDCARD_MISO, SDCARD_SCK, SDCARD_CS, 8000000); 00026 FATFileSystem fs("fs"); 00027 /* 00028 Bus SPI 00029 */ 00030 SPI spiHandler(SPI_MOSI, SPI_MISO, SPI_SCK); 00031 DigitalOut spiADXL355cs(ADXL355_CS);// Pin di CS ADXL355 00032 /* 00033 ADXL355 00034 */ 00035 adxl355_handler adxl355_config =//Handler accelerometro 00036 { 00037 .measure_range = adxl355_2g, 00038 .out_data_rate = adxl355_250hz, 00039 .drdy_pin = ADXL355_DRDY, 00040 .int1_pin = NULL, 00041 .int2_pin = NULL, 00042 .int_config = {} 00043 }; 00044 InterruptIn adxl355_int((PinName)adxl355_config.drdy_pin);// Interrupt su pin accelerometro 00045 uint32_t adxl355_int_timestamp;//Timestamp registrato nella routine di interrupt 00046 uint8_t adxl355_int_index;//Numero di interrupt consecutivi 00047 uint16_t adxl355_newData_error = 0;//Errore metodo 00048 //uint8_t adxl355_newData_sample = 0;//Conteggio dei sample acquisiti 00049 uint32_t adxl355_newData_timestamp;//Timestamp rilevato al 5° sample 00050 /* Dati locali temporanei ADXL355 */ 00051 //uint32_t adxl355_rawX_tmp = 0; 00052 //uint32_t adxl355_rawY_tmp = 0; 00053 //uint32_t adxl355_rawZ_tmp = 0; 00054 //uint32_t adxl355_rawT_tmp = 0; 00055 /* 00056 DEBUG PIN 00057 */ 00058 DigitalOut BLUpin(DBG_PIN_2); 00059 DigitalOut YELLOWpin(DBG_PIN_4); 00060 DigitalOut GREENpin(DBG_PIN); 00061 DigitalOut VIOLApin(DBG_PIN_3); 00062 DigitalOut led_pin(STATUS_LED_PIN); 00063 /* 00064 DEFINIZIONE CODA DATI 00065 */ 00066 MemoryPool<record_t, RECORD_NUMBER*RECORD_SIZE> mpool; 00067 Queue<record_t, RECORD_NUMBER*RECORD_SIZE> queue; 00068 /* 00069 SCRITTURA SU SD CARD 00070 */ 00071 void writeOnSDcard(void) 00072 { 00073 while(1) 00074 { 00075 Thread::wait(10); 00076 osEvent evt = queue.get(); 00077 if((evt.status == osEventMessage) && (start_writing == true)) 00078 { 00079 record_t *message = (record_t*)evt.value.p; 00080 BLUpin = 1; 00081 fprintf(fp, "%06d;%04x;%08d;%05x;%05x;%05x;%03x;%06x;%06x;%06x;%06x;%06x;%06x \r\n", 00082 message->index, //# 00083 message->error, //Error 00084 message->timestamp, //Timestamp 00085 message->adxl355_rawX, //ACC_DIG_3A_X 00086 message->adxl355_rawY, //ACC_DIG_3A_Y 00087 message->adxl355_rawZ, //ACC_DIG_3A_Z 00088 message->adxl355_rawT, //ACC_DIG_3A_TEMP 00089 message->adxl354_rawX, //ACC_AN_3A_X 00090 message->adxl354_rawY, //ACC_AN_3A_Y 00091 message->adxl354_rawZ, //ACC_AN_3A_Z 00092 message->adxl354_rawT, //ACC_AN_3A_TEMP 00093 message->colibrys_rawVal, //ACC_AN_1A_VAL 00094 message->colibrys_rawTEMPval //ACC_AN_1A_TEMP 00095 ); 00096 BLUpin = 0; 00097 mpool.free(message); 00098 }else{} 00099 00100 if((button_int_f == true)&&(start_writing == true)) 00101 { 00102 fprintf(fp,"DATA END \r\n"); 00103 fclose(fp); // DO THIS AT THE END!!! 00104 sd.deinit(); 00105 fs.unmount(); 00106 start_writing = false; 00107 00108 Thread::wait(100); 00109 if(adxl355_start_acquisition(adxl355_none) == 0) 00110 { 00111 led_pin = 0; 00112 YELLOWpin = 1; 00113 }else{} 00114 00115 }else{} 00116 } 00117 } 00118 /* 00119 THREAD SCRITTURA SU SD CARD 00120 */ 00121 Thread writeSDthread(writeOnSDcard); 00122 /* 00123 NUOVI DATI ADXL355 00124 */ 00125 void adxl355_newData(void) 00126 { 00127 while (true) 00128 { // Signal flags that are reported as event are automatically cleared. 00129 Thread::signal_wait(ADXL355_SIGNAL); 00130 GREENpin = 1; 00131 if(adxl355_get_data(&adxl355_config) != 0) 00132 { 00133 adxl355_newData_error |= 0xFF00; 00134 }else{} 00135 00136 file_index++; 00137 adxl355_newData_timestamp = HAL_GetTick(); 00138 adxl355_newData_error |= (uint16_t)(adxl355_newData_timestamp - adxl355_int_timestamp); 00139 00140 record_t *message = mpool.alloc(); 00141 message->index = file_index; 00142 message->error = adxl355_newData_error; 00143 message->timestamp = adxl355_newData_timestamp; 00144 00145 message->adxl355_rawX = adxl355_raw_x_acc(&adxl355_config); 00146 message->adxl355_rawY = adxl355_raw_y_acc(&adxl355_config); 00147 message->adxl355_rawZ = adxl355_raw_z_acc(&adxl355_config); 00148 message->adxl355_rawT = adxl355_raw_temp(&adxl355_config); 00149 00150 message->adxl354_rawX = 3; 00151 message->adxl354_rawY = 3; 00152 message->adxl354_rawZ = 3; 00153 message->adxl354_rawT = 3; 00154 00155 message->colibrys_rawVal = 4; 00156 message->colibrys_rawTEMPval = 4; 00157 00158 queue.put(message); 00159 00160 adxl355_newData_error = 0; 00161 00162 GREENpin = 0; 00163 } 00164 } 00165 /* 00166 THREAD NUOVI DATI ADXL355 00167 */ 00168 Thread adxl355Thread(adxl355_newData); 00169 /* 00170 FUNZIONE DI GESTIONE DELL'INTERRUPT ADXL355 00171 */ 00172 void adxl355_int_handler(void) 00173 { 00174 VIOLApin = 1; 00175 adxl355_int_index++; 00176 if(adxl355_int_index == 5) 00177 { 00178 adxl355_int_timestamp = HAL_GetTick(); 00179 adxl355_int_index = 0; 00180 adxl355Thread.signal_set(ADXL355_SIGNAL); 00181 }else{}; 00182 // adxl355Thread.signal_set(ADXL355_SIGNAL); 00183 VIOLApin = 0; 00184 } 00185 /* 00186 FUNZIONE DI GESTIONE INTERRUPT PULSANTE 00187 */ 00188 void pressed(void) 00189 { 00190 button_int_f = true; 00191 } 00192 00193 00194 00195 00196 int main() 00197 { 00198 uint16_t u16error; 00199 00200 start_writing = false; 00201 button_int_f = false; 00202 file_index = 0; 00203 adxl355_int_timestamp = 0; 00204 adxl355_int_index = 0; 00205 00206 led_pin = 0; 00207 00208 BLUpin = 0; 00209 GREENpin = 0; 00210 VIOLApin = 0; 00211 00212 /* Impulso che segnala l'avvio del codice */ 00213 YELLOWpin = 0; 00214 YELLOWpin = 1; 00215 YELLOWpin = 0; 00216 00217 /* Setting SPI */ 00218 spiHandler.frequency(SPI_FREQUENCY_HZ); 00219 spiHandler.format(8, 0);//POL = 0; PHA = 0 00220 00221 /* Setting interrupt su pin accelerometro */ 00222 adxl355_int.rise(&adxl355_int_handler); 00223 /* Setting interrupt pulsante */ 00224 user_button.fall(&pressed); 00225 00226 /* Init ADXL355 */ 00227 u16error = adxl355_init(&adxl355_config); 00228 if(u16error != 0) 00229 { 00230 //VIOLApin = !VIOLApin; 00231 }else{} 00232 /* Init SD CARD reader */ 00233 sd.init(); 00234 fs.mount(&sd); 00235 fp = fopen("/fs/mydata.csv", "w"); 00236 if(fp == NULL) 00237 { 00238 start_writing = false; 00239 led_pin = 0; 00240 } 00241 else 00242 { 00243 start_writing = true; 00244 fprintf(fp,"#;ERROR;TIMESTAMP;ACC_DIG_3A_X;ACC_DIG_3A_Y;ACC_DIG_3A_Z;ACC_DIG_3A_TEMP;ACC_AN_3A_X;ACC_AN_3A_Y;ACC_AN_3A_Z;ACC_AN_3A_TEMP;ACC_AN_1A_VAL;ACC_AN_1A_TEMP\r\n"); 00245 u16error = adxl355_start_acquisition(adxl355_both); 00246 if(u16error != 0) 00247 { 00248 led_pin = 0; 00249 fclose(fp); 00250 sd.deinit(); 00251 fs.unmount(); 00252 start_writing = false; 00253 }else 00254 { 00255 led_pin = 1; 00256 } 00257 } 00258 00259 while(1) 00260 { 00261 Thread::wait(1000); 00262 } 00263 00264 }
Generated on Thu Jul 14 2022 17:03:54 by
1.7.2