Forum: Mikrocontroller und Digitale Elektronik Frage zu CAN Library von Thomas Fuchs


von Thomas (Gast)


Lesenswert?

Hallo,

seit Tagen spiele ich mit der Bibliothek zu CAN von Thomas Fuchs für 
AT90CAN128. Nun stehe ich vor einer weiteren Herausforderung. Denn ich 
bekomme es nicht hin, MObs zu filtern.

Ich verstehe das beschreiben der Masken und IDTs in beiden Funktionen 
zusammen nicht!?!

hier kurz die Initialisierung:

// initializes CAN interface
// Funktion zum Initialisieren
bool initCAN( uint8_t bitrate )
{
  CAN_DDR |= _BV(CAN_TX);
  CAN_DDR &= ~_BV(CAN_RX);

  //  security check
  if (bitrate >= 8) return false;

  //  number of the MOb
  uint8_t mob;

  CANGCON |= (1<<SWRES);    // reset the CAN controller

  CANGCON = 0x00;        // reset the general control register (CONFIG 
mode)

  // reset the interrupt registers
  CANSIT2 = 0x00;
  CANSIT1 = 0x00;
  CANGIT  = 0x00;
  CANGIE  = 0x00;
  CANEN1  = 0x00;
  CANEN2  = 0x00;
  CANIE1  = 0x00;
  CANIE2  = 0x00;

  // set auto inc to Data Buffer Index (DBI)
  CANPAGE &= ~(1<<AINC);

  // set all MObs to 0
  for (mob = 0; mob < NR_MOBS; mob++)
  {
    CANPAGE  = (mob << 4);
  CANIDT1 = 0x00;  //  reset ID-Tag
  CANIDT2 = 0x00;
  CANIDT3 = 0x00;
  CANIDT4 = 0x00;

  CANIDM1 = 0x00;  //  reset ID-Mask
  CANIDM2 = 0x00;
  CANIDM3 = 0x00;
  CANIDM4 = 0x00;

    CANSTMOB = 0x00;  //  reset MOb status
    CANCDMOB = 0x00;  //  disable MOb
  }

  // set CAN Bit Timing,(see datasheet page 260)
  CANBT1 = pgm_read_byte(&_at90can_cnf[bitrate][0]);
  CANBT2 = pgm_read_byte(&_at90can_cnf[bitrate][1]);
  CANBT3 = pgm_read_byte(&_at90can_cnf[bitrate][2]);

  // set config to MObs 1 and 2
  // MOb 1 soll empfangen
  // MOb 2 soll senden
  for (mob = 1; mob < 3; mob++)
  {
    CANPAGE  = (mob << 4);
  CANSTMOB = 0x00;  //  reset MOb status
  switch (mob)
  {
      case 1:
      CANCDMOB = 0x80;  //  RX
      CANIDT1  = 0x00;  //  set ID-Tag
      CANIDT2  = 0x00;

      CANIDM1  = 0x00;  //  set ID-Mask, receive all
      CANIDM2  = 0x00;
        break;

    case 2:
      CANIDT1  = 0x00;  //  set ID-Tag
      CANIDT2  = 0x00;
        break;

    default:
      return false;
  }
  }

  //  Enable all required interrupts
  CANGIE  = 0xB0;  // ENIT, ENRX, ENTX
  CANIE2  = 0x06;  // MOb 1, MOb 2 aktivieren

  //  switch CAN on
  CANGCON |= (1<<ENASTB);

  //  wait for EnableFlag
  while (!(CANGSTA & (1<<ENFG)));

  return true;
}




und hier in der configRX() werden die Masken und IDTs erneut 
beschrieben.



// config the receive mob
void configRX()
{
  uint8_t mob;

  // receive in this MOb
  mob = 1;

  CANPAGE = (mob<<4);  // rotate 4 bits left

  // define the IDTags to get only one ID (Filter)
  CANIDT4 = 0;
  CANIDT3 = 0;
  CANIDT2 = 0;
  CANIDT1 = 0;

  // define the IDMasks to activate the Tags (Maske)
  // 1 means filter, 0 means uncared

  CANIDM1  = 0x00;  //filter off, don't care
  CANIDM2  = 0x00;

  //  activate receiving messages with 11 bit id´s
  CANCDMOB = (1<<CONMOB1);
}


Mein Problem ist, dass ich nicht weiß wie ich beide Funktionen abändern 
muss damit ich einzelne MObs mit Filtern belegen kann. Ich habe schon 
versucht nur jeweils eine Funktion abzuändern und auch beide Funktionen 
gleichzeitig. Alles ohne Erfolg.

Ich hoffe ihr könnt mir erklären, was ich hier nicht ganz zu begreifen 
scheine.

Grüße

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.