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.
Dann lass doch den Mikrocontroller in der Zeit, wo momentan steht while (!(CANSTMOB & (1<<TXOK)));// wait until sending message complete was anderes machen. Oder andersrum, frag das nicht mit while ab, sondern mit if, wenn es frei ist, dann kannst weiter verarbeiten, wenn nicht, machst andere Sachen weiter. Aber wird nicht auch nen Interrupt ausgelöst wenn der fertig ist mit senden? Gruss, Sebastian
Ich würde die Abfrage oben in die Funktion einbauen. Dann wartet die Funktion nur, wenn wirklich was gesendet werden soll. Im Moment wartet sie auf das Sendeende, was aber eigentlich nicht interessiert.
Das mit dem Interrupt muss ich noch checken. Die Abfrage oben einbauen geht nicht. Die Abfrage ist deshalb drin, weil erst nach Sendeende die Bits zuückgesetzt werden können und müssen. Ich muss also nach dem Senden warten, bis ich zurücksetzen kann.
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.