Envio de trama CAN desde la FLash Arduino

Buenas amigos,
Estoy haciendo este simple código con una estructura CAN para que se envié con intervalo de tiempo, funciona bien enviando la trama con el cada 100ms y 50ms según el codigo:

#include <mcp_can.h>
#include <SPI.h>

MCP_CAN CAN0(17); // Pin CS Leonardo
struct can_frame {
  uint32_t can_id;
  uint8_t len;
  uint8_t data[8];
  uint16_t interval;
  unsigned long last_send_time; // Campo para el último tiempo de envío
};

can_frame Trama1[] = {
  {0x625, 4, {0x80, 0x00, 0x00, 0x00}, 100}, // 100ms
  {0x60D, 8, {0x00, 0x12, 0x00, 0xFF, 0x30, 0x5E, 0x2F, 0x00}, 100}, // 100ms
  {0x35D, 8, {0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 50},  // 50 ms
  {0x551, 7, {0x8A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 50},  // 50ms 
  {0x181, 8, {0x00, 0x74, 0x32, 0x10, 0x31, 0x20, 0x3D, 0x02}, 100}, // 100ms
  {0x354, 8, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00}, 100} //100ms
};

void setup() {
  Serial1.begin(57600);

  while (CAN_OK != CAN0.begin(CAN_500KBPS)) {
    Serial1.println("CAN BUS Shield init fail");
    Serial1.println(" Init CAN BUS Shield again");
    delay(100);
  }
  Serial1.println("CAN BUS Shield init ok!");
}

void loop() {
  unsigned long current_time = millis();

  for (size_t i = 0; i < sizeof(Trama1) / sizeof(Trama1[0]); i++) {
    if (current_time - Trama1[i].last_send_time >= Trama1[i].interval) {
      CAN0.sendMsgBuf(Trama1[i].can_id, 0, Trama1[i].len, Trama1[i].data);
      Trama1[i].last_send_time = current_time;
    }
  }
}

El problema que tengo, es que quiero que la trama CAN se guarde en la flash (pues quiero ampliar el código con muchas tramas más ), pero a la hora que el código se ejecuta no me respeta el intervalo de tiempo, envía los arrays cada 2ms y no se que estoy haciendo mal, pongo aqui el código, gracias

#include <mcp_can.h>
#include <SPI.h>
#include <avr/pgmspace.h>

MCP_CAN CAN0(17); // Define un objeto CAN en el pin CS10 (ajusta esto según tu configuración)

struct can_frame {
  uint32_t can_id;
  uint8_t len;
  uint8_t data[8];
  uint16_t interval;
  unsigned long last_send_time; // Campo para el último tiempo de envío
};

const PROGMEM can_frame Trama1[] = {
  {0x625, 4, {0x80, 0x00, 0x00, 0x00}, 100},
  {0x60D, 8, {0x00, 0x12, 0x00, 0xFF, 0x30, 0x5E, 0x2F, 0x00}, 100},
  {0x35D, 8, {0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 100},
  {0x551, 7, {0x8A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 180},
  {0x181, 8, {0x00, 0x74, 0x32, 0x10, 0x31, 0x20, 0x3D, 0x02}, 100},
  {0x354, 8, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00}, 100}
};

void setup() {
  Serial1.begin(57600);

  while (CAN_OK != CAN0.begin(CAN_500KBPS)) {
    Serial1.println("CAN BUS Shield init fail");
    Serial1.println(" Init CAN BUS Shield again");
    delay(100);
  }
  Serial1.println("CAN BUS Shield init ok!");
}

void loop() {
  unsigned long current_time = millis();

  for (size_t i = 0; i < sizeof(Trama1) / sizeof(Trama1[0]); i++) {
    can_frame frame;
    memcpy_P(&frame, &Trama1[i], sizeof(frame)); // Copia los datos desde la memoria flash a la RAM

    if (current_time - frame.last_send_time >= frame.interval) {
      CAN0.sendMsgBuf(frame.can_id, 0, frame.len, frame.data);
      frame.last_send_time = current_time;
    }
  }
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.