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;
}
}
}