Gast
#643774
Hallo! Ich arbeite gerade an einem Projekt mit einem AT90CAN128 Controller. Der Controller soll neben anderen Aufgaben auch CAN-Nachrichten ausgeben. Der CAN läuft mit 1Mbit/s. Ich habe mir eine Funktion geschrieben, die CAN-Nachrichten ausgibt. Hier die C-Funktion: extern void can_tx (CAN_message msg) { U8 tmp_sreg, save_canpage, i, mob_number; tmp_sreg = SREG; // store statusregister Disable_interrupt(); // disable global interrupts save_canpage = CANPAGE; // store current CANPAGE mob_number = can_get_mob_free(); // take first free mob if (mob_number == NOMOB) { // error: no free mob available return; } Can_set_mob(mob_number); // select mob CANCDMOB = (msg.length & 0x0F)<<DLC0; // set data length // write 11 Bit identifier CANIDT4 = 0x00; CANIDT3 = 0x00; CANIDT2 = (U8) (msg.id<<5); CANIDT1 = (U8) (msg.id>>3); for (i=0; i<msg.length; i++) CANMSG = msg.data [i]; // put data in mailbox set_bit(CANCDMOB,CONMOB0); // enable transmission while (!(CANSTMOB & (1<<TXOK)));// wait until sending message complete clear_bit(CANSTMOB,TXOK); // reset flag clear_bit(CANCDMOB,CONMOB0); // reset mob status bit0 clear_bit(CANCDMOB,CONMOB1); // reset mob status bit1 CANPAGE = save_canpage; // restore CANPAGE SREG = tmp_sreg; // restore statusregister (with IR-Flag) } Mein Problem ist es nun, dass diese Funktion zuviel Zeit in Anspruch nimmt. Die hauptsächliche Zeit wird in dem Warten, bis das Senden der Nachricht abgeschlossen ist, verbraten. (Codezeile: while (!(CANSTMOB & (1<<TXOK))); ) Kann man das nicht anders gestalten, damit in dieser Wartezeit weitere sinnvolle Operationen ausgeführt werden?? Aber man muss ja auch warten, damit man die Flags zurücksetzen kann. Hmmm, irgendwelche Ideen?? Danke für eure Hilfe.