www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR - AT90CAN128 - CAN-Write schneller, wie?


Autor: Hazel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Matthias R. (mnr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Hazel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.