AT90CAN & arduino port messagge filtering

Ciao A tutti, spero che questa sia la sezione corretta in cui postare il quesito che mi sta attanagliando in questi giorni, premetto che non sono proprio cintuare nera di C ma grazie alla community e ai tanti esempi mi sto dilettando in alcuni progettini che mi servono per lavoro.
Uno di questi progetti e’ una prototype board olimex con un AT90CAN che deve leggere dal CAN di una vettura da competizione 2 parametri giri motore e velocità per controllare una macchina a stati e un paio di display.
Nella vettura purtroppo vi sono numerossissimi segnali CAN che tendono a riempire le mailboxes dell’at90can con id che nn mi interessano questo purtroppo e’ un problema per me perche’ capita spesso che i due id che mi interessano passino sulla linea can ma a causa delle mailbox piene nn viene letto.
Ho provato a vuotare le mailbox periodicamente ma purtroppo non basta.
So che e’ possibile impostare dei filtri sull’AT90CAN cosi’ come si fa sull’MCP2515 ma nn ho trovato esempi in rete e ne dal datasheet ne dalle librerie sono riuscto a cavare un ragno dal buco.
Il port di arduino che uso e’ quello realizzato lincomatic GitHub - lincomatic/AT90CAN: AT90CAN Support for Arduino

Funzione di init

void CANinit()
{
  
  // Clock prescaler Reset SCL:don't need this unless CLKDIV8 is set in the low fuse
  // CLKPR = 0x80;  CLKPR = 0x00;

  //- Pull-up on TxCAN & RxCAN one by one to use bit-addressing
  CAN_PORT_DIR &= ~(1<<CAN_INPUT_PIN );
  CAN_PORT_DIR &= ~(1<<CAN_OUTPUT_PIN);
  CAN_PORT_OUT |=  (1<<CAN_INPUT_PIN );
  CAN_PORT_OUT |=  (1<<CAN_OUTPUT_PIN);
  
  //- Wait until activity on RxCAN
  while ((CAN_PORT_IN & (1<<CAN_INPUT_PIN)) != 0)
  {
     disp_alto.display(no);
     disp_basso.display(can);
   }
  
  disp_alto.clearDisplay();
  disp_basso.clearDisplay();
  //- Reset CAN peripheral
  Can_reset();
  CAN.set_baudrate(CAN_AUTOBAUD);
  CAN.init(0);
  CAN.cmd
  //- Set CAN Timer Prescaler
  // SCL: dont think we need this CANTCON = CANBT1;                   // Why not !
}

Parte del codice che legge il CAN

  st_cmd_t msg;
  uint8_t buffer[8];
  uint8_t i,tmp;

  msg.pt_data = &buffer[0];
  memset(buffer,sizeof(buffer),0);


  msg.cmd = CMD_RX;  

  while(CAN.cmd(&msg) != CAN_CMD_ACCEPTED);

  while(1) {
               tmp = CAN.get_status(&msg);
               if (tmp != CAN_STATUS_NOT_COMPLETED) break; // Out of while
           }
    if (tmp == CAN_STATUS_ERROR)
    {
        disp_alto.display(can);
        disp_basso.display(err);
        delay(500);
    }    

    st_cmd_t messaggio;
    messaggio.id.std=0x0123;
    uint8_t invio[8]={0xAA, 0xFF, 0xCC, 0xAA, 0x12, 0xAA, 0xFF, 0xCC};
    messaggio.pt_data = invio;
    messaggio.dlc = 8;
    messaggio.cmd = CMD_TX_DATA;
    while(CAN.cmd(&messaggio) != CAN_CMD_ACCEPTED);
    while(1) {
               tmp = CAN.get_status(&messaggio);
               if (tmp != CAN_STATUS_NOT_COMPLETED) break; // Out of while
           }
  

  if (msg.id.std == 0x0146)
   {
     luce = !luce;
     t0=t1;
     t1 = millis();     
     int byte6=buffer[6]>>3;
     int byte5=buffer[5];
     byte5=byte5<<5;     
     int raw_speed=byte6+byte5;
     float speed_scale=raw_speed;
     speed_scale=speed_scale*0.0625;       
  
     disp_alto.display(speed_scale);     
     CAN.can_clear_all_mob();
    }
   else if (msg.id.std == 0x0361)
    {
     int byte3=buffer[3];
     int byte2=buffer[2]<<8;
     nmot = byte3+byte2;
     disp_basso.display(nmot);
     CAN.can_clear_all_mob();
    } 
     else
    {
      CAN.can_clear_all_mob(); 
    }   
   
   switch (STATO)
     {
      case BOX:
      disp_alto.display(tempo_pit);
      disp_basso.display(lunghezza_pit);
      break;
     }
}

Grazie per l’aiuto.

up

L’argomento è molto specifico ed inoltre il micro non è tra quelli supportati da Arduino, quindi ritengo che siano pochi quelli con le competenze necessarie per poterti aiutare. Io non sono tra quelli. :confused: