Patricio Silva / Mbed 2 deprecated c3auto

Dependencies:   mbed

Committer:
elpatosilva
Date:
Wed Oct 23 14:07:50 2019 +0000
Revision:
0:57215055833e
first commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elpatosilva 0:57215055833e 1 #include "mbed.h"
elpatosilva 0:57215055833e 2
elpatosilva 0:57215055833e 3 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
elpatosilva 0:57215055833e 4 // Conf IO
elpatosilva 0:57215055833e 5 DigitalOut led1(LED1); // HeartBeat
elpatosilva 0:57215055833e 6
elpatosilva 0:57215055833e 7 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
elpatosilva 0:57215055833e 8 // Timers
elpatosilva 0:57215055833e 9 Ticker timer100ms;
elpatosilva 0:57215055833e 10
elpatosilva 0:57215055833e 11 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
elpatosilva 0:57215055833e 12 // Comunicación Serial
elpatosilva 0:57215055833e 13
elpatosilva 0:57215055833e 14 #define RXBUFFERSIZE 256
elpatosilva 0:57215055833e 15 #define TXBUFFERSIZE 256
elpatosilva 0:57215055833e 16 #define RXCMDTIME 50000
elpatosilva 0:57215055833e 17 #define TXCMDTIME 50000
elpatosilva 0:57215055833e 18 // Header
elpatosilva 0:57215055833e 19 const uint8_t header[7] = {0x55, 0x4E, 0x45, 0x52, 0x00, 0x00, 0x3A};
elpatosilva 0:57215055833e 20
elpatosilva 0:57215055833e 21 Serial pc(USBTX, USBRX); // tx, rx
elpatosilva 0:57215055833e 22
elpatosilva 0:57215055833e 23 //////////////////////////////////////////
elpatosilva 0:57215055833e 24 // Tipos de dato
elpatosilva 0:57215055833e 25 //////////////////////////////////////////
elpatosilva 0:57215055833e 26
elpatosilva 0:57215055833e 27 /*
elpatosilva 0:57215055833e 28 * Indices de lectura y escritura del buffer circular
elpatosilva 0:57215055833e 29 * checksum y marcas de tiempo para el envio por puerto serie
elpatosilva 0:57215055833e 30 * empty indica si la cola esta vacia o llena cuando indexR=indexW
elpatosilva 0:57215055833e 31 */
elpatosilva 0:57215055833e 32 typedef struct{
elpatosilva 0:57215055833e 33 uint8_t indexR;
elpatosilva 0:57215055833e 34 uint8_t indexW;
elpatosilva 0:57215055833e 35 uint8_t buf[RXBUFFERSIZE];
elpatosilva 0:57215055833e 36 uint8_t chksum;
elpatosilva 0:57215055833e 37 bool empty;
elpatosilva 0:57215055833e 38 uint64_t cmdTime;
elpatosilva 0:57215055833e 39 uint8_t chksumHeader;
elpatosilva 0:57215055833e 40 } _txbuffer;
elpatosilva 0:57215055833e 41
elpatosilva 0:57215055833e 42 /*
elpatosilva 0:57215055833e 43 * Indices de lectura y escritura del buffer circular
elpatosilva 0:57215055833e 44 * marcas de tiempo, indice de comando y tamaño del comando
elpatosilva 0:57215055833e 45 */
elpatosilva 0:57215055833e 46 typedef struct{
elpatosilva 0:57215055833e 47 uint8_t indexR;
elpatosilva 0:57215055833e 48 uint8_t indexW;
elpatosilva 0:57215055833e 49 uint8_t buf[RXBUFFERSIZE];
elpatosilva 0:57215055833e 50 uint64_t cmdTime;
elpatosilva 0:57215055833e 51 uint8_t cmdIndex;
elpatosilva 0:57215055833e 52 uint8_t stage;
elpatosilva 0:57215055833e 53 bool cmd;
elpatosilva 0:57215055833e 54 uint8_t chksum;
elpatosilva 0:57215055833e 55 uint16_t payloadSize;
elpatosilva 0:57215055833e 56 } _rxbuffer;
elpatosilva 0:57215055833e 57
elpatosilva 0:57215055833e 58
elpatosilva 0:57215055833e 59 ///////////////////////////////
elpatosilva 0:57215055833e 60 // Variables
elpatosilva 0:57215055833e 61 ////////////////////////////////
elpatosilva 0:57215055833e 62
elpatosilva 0:57215055833e 63 // defino los buffer
elpatosilva 0:57215055833e 64 _txbuffer TX;
elpatosilva 0:57215055833e 65 _rxbuffer RX;
elpatosilva 0:57215055833e 66
elpatosilva 0:57215055833e 67
elpatosilva 0:57215055833e 68 ///////////////////////////////
elpatosilva 0:57215055833e 69 // Prototipos Serial
elpatosilva 0:57215055833e 70 ///////////////////////////////
elpatosilva 0:57215055833e 71
elpatosilva 0:57215055833e 72 void serialSetup(uint16_t);
elpatosilva 0:57215055833e 73
elpatosilva 0:57215055833e 74
elpatosilva 0:57215055833e 75 /* Escribe en el puerto serie los datos del buffer
elpatosilva 0:57215055833e 76 * en cualquier escribo solo de a 1 byte por llamada
elpatosilva 0:57215055833e 77 */
elpatosilva 0:57215055833e 78 void serialSubmit();
elpatosilva 0:57215055833e 79
elpatosilva 0:57215055833e 80
elpatosilva 0:57215055833e 81 /* Carga al buffer lo recibido por puerto serie
elpatosilva 0:57215055833e 82 */
elpatosilva 0:57215055833e 83 void serialReceive();
elpatosilva 0:57215055833e 84
elpatosilva 0:57215055833e 85
elpatosilva 0:57215055833e 86 /* Busca si hay un frame en el buffer que esté correcto y verifica el checksum
elpatosilva 0:57215055833e 87 * Si hay un header mueve el indice RX.cmdIndex a la posicion donde comienza el comando
elpatosilva 0:57215055833e 88 * y setea a true el flag RX.cmd. Mueve RX.indexR a esa posición para liberar el espacio
elpatosilva 0:57215055833e 89 * ocupado por el header. No procesa un nuevo comando hasta que no se ha procesado el anterior
elpatosilva 0:57215055833e 90 * notificandolo con clearCmd()
elpatosilva 0:57215055833e 91 */
elpatosilva 0:57215055833e 92 void getFrame();
elpatosilva 0:57215055833e 93
elpatosilva 0:57215055833e 94
elpatosilva 0:57215055833e 95 /*
elpatosilva 0:57215055833e 96 * Escribe en el buffer de salida un frame con un tamaño de comando+payload+checksum = s
elpatosilva 0:57215055833e 97 * retorna true cuando termina de escribir, falso si no hay suficiente espacio (y restablece los indices)
elpatosilva 0:57215055833e 98 */
elpatosilva 0:57215055833e 99 bool serialEnqueueHeader(uint16_t);
elpatosilva 0:57215055833e 100
elpatosilva 0:57215055833e 101
elpatosilva 0:57215055833e 102 /* Escribe el byte en el buffer de salida, retorna falso si no hay lugar suficiente para hacerlo
elpatosilva 0:57215055833e 103 */
elpatosilva 0:57215055833e 104 bool serialEnqueueData(uint8_t);
elpatosilva 0:57215055833e 105
elpatosilva 0:57215055833e 106
elpatosilva 0:57215055833e 107 /* Encola el checksum
elpatosilva 0:57215055833e 108 */
elpatosilva 0:57215055833e 109 bool serialEnqueueChksum();
elpatosilva 0:57215055833e 110
elpatosilva 0:57215055833e 111 /* Borra el comando actual para que se pueda recibir el siguiente
elpatosilva 0:57215055833e 112 */
elpatosilva 0:57215055833e 113 void cleanCmd();
elpatosilva 0:57215055833e 114
elpatosilva 0:57215055833e 115
elpatosilva 0:57215055833e 116 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
elpatosilva 0:57215055833e 117 // Prototipos de Utilidades
elpatosilva 0:57215055833e 118 void heartBeat();
elpatosilva 0:57215055833e 119
elpatosilva 0:57215055833e 120
elpatosilva 0:57215055833e 121 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
elpatosilva 0:57215055833e 122 // Funciones
elpatosilva 0:57215055833e 123
elpatosilva 0:57215055833e 124
elpatosilva 0:57215055833e 125 /*
elpatosilva 0:57215055833e 126 * Señal de activo, dos parpadeos de 100ms cada dos segundos
elpatosilva 0:57215055833e 127 */
elpatosilva 0:57215055833e 128 void heartBeat(){
elpatosilva 0:57215055833e 129 static int count = 0;
elpatosilva 0:57215055833e 130 switch (count++){
elpatosilva 0:57215055833e 131 case 0:
elpatosilva 0:57215055833e 132 case 2:
elpatosilva 0:57215055833e 133 led1 = 0;
elpatosilva 0:57215055833e 134 break;
elpatosilva 0:57215055833e 135 case 1:
elpatosilva 0:57215055833e 136 case 3:
elpatosilva 0:57215055833e 137 led1 = 1;
elpatosilva 0:57215055833e 138 break;
elpatosilva 0:57215055833e 139 case 20:
elpatosilva 0:57215055833e 140 count = 0;
elpatosilva 0:57215055833e 141 break;
elpatosilva 0:57215055833e 142 }
elpatosilva 0:57215055833e 143 }
elpatosilva 0:57215055833e 144
elpatosilva 0:57215055833e 145
elpatosilva 0:57215055833e 146
elpatosilva 0:57215055833e 147 void serialSetup(uint16_t br){
elpatosilva 0:57215055833e 148 RX.indexR=0;
elpatosilva 0:57215055833e 149 RX.indexW=0;
elpatosilva 0:57215055833e 150 RX.stage=0;
elpatosilva 0:57215055833e 151 RX.cmd=false;
elpatosilva 0:57215055833e 152 TX.indexR=0;
elpatosilva 0:57215055833e 153 TX.indexW=0;
elpatosilva 0:57215055833e 154 TX.empty=true;
elpatosilva 0:57215055833e 155 // Calculo el checksum del header
elpatosilva 0:57215055833e 156 TX.chksumHeader = header[0];
elpatosilva 0:57215055833e 157 for (uint8_t i = 1 ; i < 4 ; i++){
elpatosilva 0:57215055833e 158 TX.chksumHeader ^= header[i];
elpatosilva 0:57215055833e 159 }
elpatosilva 0:57215055833e 160 pc.baud(19200);
elpatosilva 0:57215055833e 161 pc.attach(&serialReceive);
elpatosilva 0:57215055833e 162 }
elpatosilva 0:57215055833e 163
elpatosilva 0:57215055833e 164
elpatosilva 0:57215055833e 165
elpatosilva 0:57215055833e 166 ////////////////////////////////////////////////////////////////////////
elpatosilva 0:57215055833e 167 // Funciones para el manejo del protocolo
elpatosilva 0:57215055833e 168 ////////////////////////////////////////////////////////////////////////
elpatosilva 0:57215055833e 169
elpatosilva 0:57215055833e 170 // Carga al buffer lo recibido por puerto serie
elpatosilva 0:57215055833e 171 void serialReceive(){
elpatosilva 0:57215055833e 172 while (pc.readable() && (uint8_t)(RX.indexW+1) != RX.indexR){
elpatosilva 0:57215055833e 173 RX.buf[RX.indexW++] = pc.getc();;
elpatosilva 0:57215055833e 174 }
elpatosilva 0:57215055833e 175 }
elpatosilva 0:57215055833e 176
elpatosilva 0:57215055833e 177
elpatosilva 0:57215055833e 178
elpatosilva 0:57215055833e 179 /* Escribe en el puerto serie los datos del buffer
elpatosilva 0:57215055833e 180 * en cualquier escribo solo de a 1 byte por llamada
elpatosilva 0:57215055833e 181 */
elpatosilva 0:57215055833e 182 void serialSubmit(){
elpatosilva 0:57215055833e 183 if(TX.indexR!=TX.indexW){
elpatosilva 0:57215055833e 184 pc.putc(TX.buf[TX.indexR++]);
elpatosilva 0:57215055833e 185 }
elpatosilva 0:57215055833e 186 TX.empty = (TX.indexR==TX.indexW);
elpatosilva 0:57215055833e 187 }
elpatosilva 0:57215055833e 188
elpatosilva 0:57215055833e 189
elpatosilva 0:57215055833e 190
elpatosilva 0:57215055833e 191 /* Busca si hay un frame en el buffer que esté correcto y verifica el checksum
elpatosilva 0:57215055833e 192 * Si hay un header mueve el indice RX.cmdIndex a la posicion donde comienza el comando
elpatosilva 0:57215055833e 193 * y setea a true el flag RX.cmd. Mueve RX.indexR a esa posición para liberar el espacio
elpatosilva 0:57215055833e 194 * ocupado por el header
elpatosilva 0:57215055833e 195 */
elpatosilva 0:57215055833e 196 void getFrame(){
elpatosilva 0:57215055833e 197 uint8_t index;
elpatosilva 0:57215055833e 198
elpatosilva 0:57215055833e 199 // No logré completar el comando dentro de la ventana de tiempo, considero vacio el buffer de entrada
elpatosilva 0:57215055833e 200 if(RX.stage > 0 && RX.cmdTime+RXCMDTIME < us_ticker_read()){
elpatosilva 0:57215055833e 201 RX.indexR = RX.indexW;
elpatosilva 0:57215055833e 202 RX.stage = 0;
elpatosilva 0:57215055833e 203 return;
elpatosilva 0:57215055833e 204 }
elpatosilva 0:57215055833e 205
elpatosilva 0:57215055833e 206 // mientras hay bytes disponibles en el buffer, proceso desde donde quedé
elpatosilva 0:57215055833e 207 index = RX.indexR+RX.stage;
elpatosilva 0:57215055833e 208 while (index != RX.indexW){
elpatosilva 0:57215055833e 209 switch (RX.stage){
elpatosilva 0:57215055833e 210 case 0:
elpatosilva 0:57215055833e 211 RX.cmdTime = us_ticker_read();
elpatosilva 0:57215055833e 212 case 1:
elpatosilva 0:57215055833e 213 case 2:
elpatosilva 0:57215055833e 214 case 3:{
elpatosilva 0:57215055833e 215 if(RX.buf[index] == header[RX.stage]){
elpatosilva 0:57215055833e 216 RX.stage++;
elpatosilva 0:57215055833e 217 index++;
elpatosilva 0:57215055833e 218 }else{ // No coincide con un header, descarto hasta acá y empiezo de nuevo en el proximo ciclo
elpatosilva 0:57215055833e 219 RX.indexR +=RX.stage;
elpatosilva 0:57215055833e 220 RX.stage=0;
elpatosilva 0:57215055833e 221 return;
elpatosilva 0:57215055833e 222 }
elpatosilva 0:57215055833e 223 break;
elpatosilva 0:57215055833e 224 }
elpatosilva 0:57215055833e 225 case 4:{
elpatosilva 0:57215055833e 226 RX.payloadSize = RX.buf[index];
elpatosilva 0:57215055833e 227 RX.stage++;
elpatosilva 0:57215055833e 228 index++;
elpatosilva 0:57215055833e 229 break;
elpatosilva 0:57215055833e 230 }
elpatosilva 0:57215055833e 231 case 5:{
elpatosilva 0:57215055833e 232 RX.payloadSize += RX.buf[index]*256;
elpatosilva 0:57215055833e 233 RX.stage++;
elpatosilva 0:57215055833e 234 index++;
elpatosilva 0:57215055833e 235 break;
elpatosilva 0:57215055833e 236 }
elpatosilva 0:57215055833e 237 case 6:{
elpatosilva 0:57215055833e 238 if (RX.buf[index] == header[RX.stage]){ // Llego al separador ":", marco la posicion sigiente como cmdIndex
elpatosilva 0:57215055833e 239 RX.stage++;
elpatosilva 0:57215055833e 240 index++;
elpatosilva 0:57215055833e 241 }else{
elpatosilva 0:57215055833e 242 RX.indexR += 3; // Continuo desde la direccion de tamaño del payload
elpatosilva 0:57215055833e 243 RX.stage = 0;
elpatosilva 0:57215055833e 244 return;
elpatosilva 0:57215055833e 245 }
elpatosilva 0:57215055833e 246 break;
elpatosilva 0:57215055833e 247 }
elpatosilva 0:57215055833e 248 case 7:{
elpatosilva 0:57215055833e 249 // empiezo a incrementar index hasta alcanzar el fin de trama (RX.indexR+RX.payloadSize+7)
elpatosilva 0:57215055833e 250 // No avanzo si aún hay un comando por ejecutar
elpatosilva 0:57215055833e 251 if(!RX.cmd && index == (uint8_t)(RX.indexR+RX.payloadSize+6)){ // alcance la posicion del checksum
elpatosilva 0:57215055833e 252 // Calculo checksum y comparo
elpatosilva 0:57215055833e 253 RX.chksum = RX.buf[RX.indexR];
elpatosilva 0:57215055833e 254 for (uint16_t i = 1 ; i < RX.payloadSize+6 ; i++){
elpatosilva 0:57215055833e 255 RX.chksum ^= RX.buf[(uint8_t)(RX.indexR+i)];
elpatosilva 0:57215055833e 256 }
elpatosilva 0:57215055833e 257 if(RX.buf[(uint8_t)(RX.indexR+RX.payloadSize+6)] == RX.chksum){
elpatosilva 0:57215055833e 258 RX.cmd = true;
elpatosilva 0:57215055833e 259 RX.cmdIndex = RX.indexR+7;
elpatosilva 0:57215055833e 260 RX.indexR = RX.cmdIndex;
elpatosilva 0:57215055833e 261 TX.cmdTime = us_ticker_read(); // marca de tiempo para responder el comando
elpatosilva 0:57215055833e 262 RX.stage = 0;
elpatosilva 0:57215055833e 263 return;
elpatosilva 0:57215055833e 264 }else{
elpatosilva 0:57215055833e 265 RX.indexR += 3; // checksum incorrecto, continuo procesando desde la direccion de tamaño del payload
elpatosilva 0:57215055833e 266 RX.stage = 0;
elpatosilva 0:57215055833e 267 }
elpatosilva 0:57215055833e 268 return;
elpatosilva 0:57215055833e 269 }else{
elpatosilva 0:57215055833e 270 index++;
elpatosilva 0:57215055833e 271 }
elpatosilva 0:57215055833e 272 break;
elpatosilva 0:57215055833e 273 }
elpatosilva 0:57215055833e 274 default:{
elpatosilva 0:57215055833e 275 RX.stage = 0;
elpatosilva 0:57215055833e 276 return;
elpatosilva 0:57215055833e 277 }
elpatosilva 0:57215055833e 278 }
elpatosilva 0:57215055833e 279 }
elpatosilva 0:57215055833e 280 }
elpatosilva 0:57215055833e 281
elpatosilva 0:57215055833e 282
elpatosilva 0:57215055833e 283
elpatosilva 0:57215055833e 284 /*
elpatosilva 0:57215055833e 285 * Escribe en el buffer de salida un frame con un tamaño de comando+payload+checksum = s
elpatosilva 0:57215055833e 286 * retorna true cuando termina de escribir, falso si no hay suficiente espacio (y restablece los indices)
elpatosilva 0:57215055833e 287 */
elpatosilva 0:57215055833e 288 bool serialEnqueueHeader(uint16_t s){
elpatosilva 0:57215055833e 289 uint8_t index = TX.indexW;
elpatosilva 0:57215055833e 290 // Inicializo chechsum
elpatosilva 0:57215055833e 291 TX.chksum = TX.chksumHeader;
elpatosilva 0:57215055833e 292
elpatosilva 0:57215055833e 293 // escribo la cabecera
elpatosilva 0:57215055833e 294 for (uint8_t i = 0 ; i < 4 ; i++){
elpatosilva 0:57215055833e 295 if(TX.indexR != TX.indexW || TX.empty){
elpatosilva 0:57215055833e 296 TX.buf[TX.indexW++] = header[i];
elpatosilva 0:57215055833e 297 }else{
elpatosilva 0:57215055833e 298 TX.indexW = index;
elpatosilva 0:57215055833e 299 return false;
elpatosilva 0:57215055833e 300 }
elpatosilva 0:57215055833e 301 }
elpatosilva 0:57215055833e 302 // Escribo el tamaño
elpatosilva 0:57215055833e 303 if(TX.indexR != TX.indexW || TX.empty){
elpatosilva 0:57215055833e 304 TX.buf[TX.indexW++] = (uint8_t)s;
elpatosilva 0:57215055833e 305 TX.chksum ^= (uint8_t)s;
elpatosilva 0:57215055833e 306 }else{
elpatosilva 0:57215055833e 307 TX.indexW = index;
elpatosilva 0:57215055833e 308 return false;
elpatosilva 0:57215055833e 309 }
elpatosilva 0:57215055833e 310 if(TX.indexR != TX.indexW || TX.empty){
elpatosilva 0:57215055833e 311 TX.buf[TX.indexW++] = (uint8_t)(s/256);
elpatosilva 0:57215055833e 312 TX.chksum ^= (uint8_t)(s/256);
elpatosilva 0:57215055833e 313 }else{
elpatosilva 0:57215055833e 314 TX.indexW = index;
elpatosilva 0:57215055833e 315 return false;
elpatosilva 0:57215055833e 316 }
elpatosilva 0:57215055833e 317 // escribo el separador
elpatosilva 0:57215055833e 318 if(TX.indexR != TX.indexW || TX.empty){
elpatosilva 0:57215055833e 319 TX.buf[TX.indexW++] = header[6];
elpatosilva 0:57215055833e 320 TX.chksum ^= header[6];
elpatosilva 0:57215055833e 321 }else{
elpatosilva 0:57215055833e 322 TX.indexW = index;
elpatosilva 0:57215055833e 323 return false;
elpatosilva 0:57215055833e 324 }
elpatosilva 0:57215055833e 325 return true;
elpatosilva 0:57215055833e 326 }
elpatosilva 0:57215055833e 327
elpatosilva 0:57215055833e 328 // Escribe el byte en el buffer de salida, retorna falso si no hay lugar suficiente para hacerlo
elpatosilva 0:57215055833e 329 bool serialEnqueueData(uint8_t d){
elpatosilva 0:57215055833e 330 if(TX.indexR != TX.indexW || TX.empty){
elpatosilva 0:57215055833e 331 TX.buf[TX.indexW++] = d;
elpatosilva 0:57215055833e 332 TX.chksum ^= d;
elpatosilva 0:57215055833e 333 return true;
elpatosilva 0:57215055833e 334 }else{
elpatosilva 0:57215055833e 335 TX.indexW--;
elpatosilva 0:57215055833e 336 return false;
elpatosilva 0:57215055833e 337 }
elpatosilva 0:57215055833e 338 }
elpatosilva 0:57215055833e 339
elpatosilva 0:57215055833e 340 // Encola el checksum
elpatosilva 0:57215055833e 341 bool serialEnqueueChksum(){
elpatosilva 0:57215055833e 342 return serialEnqueueData(TX.chksum);
elpatosilva 0:57215055833e 343 }
elpatosilva 0:57215055833e 344
elpatosilva 0:57215055833e 345
elpatosilva 0:57215055833e 346 /*
elpatosilva 0:57215055833e 347 * Borra el comando actual para que getFrame pueda recibir el siguiente
elpatosilva 0:57215055833e 348 * Necesario por cada overflow de us_ticker_read()
elpatosilva 0:57215055833e 349 */
elpatosilva 0:57215055833e 350 void cleanCmd(){
elpatosilva 0:57215055833e 351 RX.cmd = false;
elpatosilva 0:57215055833e 352 RX.cmdTime = 0;
elpatosilva 0:57215055833e 353 RX.indexR = RX.cmdIndex+RX.payloadSize;
elpatosilva 0:57215055833e 354 TX.cmdTime = 0;
elpatosilva 0:57215055833e 355 }
elpatosilva 0:57215055833e 356
elpatosilva 0:57215055833e 357
elpatosilva 0:57215055833e 358 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
elpatosilva 0:57215055833e 359 // MAIN
elpatosilva 0:57215055833e 360
elpatosilva 0:57215055833e 361
elpatosilva 0:57215055833e 362 int main(){
elpatosilva 0:57215055833e 363 uint32_t maxUsTicker = us_ticker_read();
elpatosilva 0:57215055833e 364 timer100ms.attach(&heartBeat, 0.1);
elpatosilva 0:57215055833e 365 serialSetup(19200);
elpatosilva 0:57215055833e 366 while(1){
elpatosilva 0:57215055833e 367 // Overflow de us_ticker_read(), reseteo todo lo que utiliza este dato
elpatosilva 0:57215055833e 368 if(maxUsTicker > us_ticker_read()){
elpatosilva 0:57215055833e 369 maxUsTicker = us_ticker_read();
elpatosilva 0:57215055833e 370 cleanCmd();
elpatosilva 0:57215055833e 371 }
elpatosilva 0:57215055833e 372 }
elpatosilva 0:57215055833e 373 }
elpatosilva 0:57215055833e 374