#include #define GET_DATA 10 #define SET_DATA 11 #define DATA_0_SIZE 4 // int32 #define DATA_1_SIZE 8 // tableau de 2 float #define DATA_2_SIZE 32 // tableau de 16 int16 uint8_t data_0[DATA_0_SIZE]; uint8_t data_1[DATA_1_SIZE]; uint8_t data_2[DATA_2_SIZE]; bool data_0_ready = false; bool data_1_ready = false; bool data_2_ready = true; bool data_0_request = false; bool data_1_request = false; bool data_2_request = false; int32_t n0; // data_0 float x[2]; // data_1 uint16_t tab[16]; // data_2 #define DATA_SAMPLING_PERIOD 1000000 void timer4_init(uint32_t period){ // période en microsecondes uint16_t diviseur[6] = {0,1,8,64,256,1024}; TCCR4A = 0; TCCR4B = 0; TCCR4B |= (1 << WGM42); // mode CTC avec OCR1A pour le maximum uint32_t top = (F_CPU/1000000*period); int clock = 1; while ((top>0xFFFF)&&(clock<5)) { clock++; top = (F_CPU/1000000*period/diviseur[clock]); } OCR4A = top; // période TIMSK4 = (1 << OCIE4A); // interruption lorsque TCNT4=OCR4A TCCR4B |= clock; } ISR(TIMER4_COMPA_vect) { // mise à jour périodique des données 0 et 1 n0 += 1; x[0] *= 1.1; x[1] *= 1.2; // copie dans les tampons memcpy(data_0,&n0,DATA_0_SIZE); memcpy(data_1,x,DATA_1_SIZE); // les données sont prêtes pour transmission au PC data_0_ready = true; data_1_ready = true; } void get_data() { char n; while (Serial.available()<1) {}; n = Serial.read(); if (n==0) data_0_request = true; else if (n==1) data_1_request = true; else if (n==2) data_2_request = true; } void send_data() { if ((data_0_ready)&&(data_0_request)) { data_0_ready = false; data_0_request = false; Serial.write(data_0,DATA_0_SIZE); } if ((data_1_ready)&&(data_1_request)) { data_1_ready = false; data_1_request = false; Serial.write(data_1,DATA_1_SIZE); } if ((data_2_ready)&&(data_2_request)) { data_2_ready = false; data_2_request = false; Serial.write(data_2,DATA_2_SIZE); } } void set_data() { char n; while (Serial.available()<1) {}; n = Serial.read(); if (n==0) { while (Serial.available()0) { com = Serial.read(); if (com==GET_DATA) get_data(); else if (com==SET_DATA) set_data(); } } void setup() { // initialisation des données n0 = 0; x[0] = 1.0; x[1] = 2.0; for (int i=0; i<16; i++) tab[i] = 0; cli(); timer4_init(DATA_SAMPLING_PERIOD); sei(); char c; Serial.begin(115200); while(!Serial); Serial.flush(); Serial.write(0); } void loop() { read_serial(); send_data(); }