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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.