mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT90can128 - UART Interrupt + CAN


Autor: jamest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe einen AT90can128 und will ein rs232 signal auf can bus 
ausgeben...
Nun habe ich Peter Fleurys Uart library verwendet um die uart per 
interrupt einzulesen...
Nun habe ich folgendes Problem: Der Interrupt zerhackt die CAN Messages, 
immer dann wenn während dem CAN Senden gerade ein Zeichen eintrift...

So sieht die CAN Sende Funktion aus:
void send_std_can_msg(unsigned int std_id, unsigned char std_dlc, unsigned char * buffer)
{
  st_cmd_t msg;     // message descriptor store in code area

  msg.pt_data = &buffer[0];
  
  msg.status = 0;
  msg.handle = 0;
   

     msg.ctrl.ide = 0;   //-- CAN 2.0A
        msg.dlc = std_dlc;        //-- Max
        msg.id.std = std_id;
        msg.cmd = CMD_TX_DATA;

        while(can_cmd(&msg) != CAN_CMD_ACCEPTED);
    while(can_get_status(&msg) == CAN_STATUS_NOT_COMPLETED);
    
  
}

Muss ich das Schreiben der CAN-Register atomar machen? Wenn ich beim 
ganzen CAN Sende prozess die interrupts deaktiviere, dann verpass ich 
doch die eintreffenden Zeichen per UART...

Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau Dir mal den Code in der folgenden Lib an oder benutze sie gleich 
komplett, die funktioniert out-of-the-box hervorragend:

http://www.kreatives-chaos.com/artikel/universelle...

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreibt die ISR in den Buffer, der als unsigned char * buffer an 
send_std_can_msg gegeben wird?  Das kann nicht funktionieren, weil ISR 
und CAN-Senden-Fkt. auf dem gleichen Speicherbereich arbeiten.

Autor: jamest (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom schrieb:
> Schreibt die ISR in den Buffer, der als unsigned char * buffer an
> send_std_can_msg gegeben wird?

Nein, das hab ich voneinander entkoppelt...

Autor: Jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
was würde denn passieren, wenn du den Status undefiniert hast. In der 
can_lib.c wird den Status vom (cmd->status==MOB_PENDING) abgefragt, ein 
undefinierter status wie z.B.:

 st_cmd_t msg;     // message descriptor store in code area
 msg.pt_data = &buffer[0]; 
// msg.status = 0;
 msg.handle = 0;
 msg.ctrl.ide = 0;   //-- CAN 2.0A
 msg.dlc = std_dlc;        //-- Max
 msg.id.std = std_id;
 msg.cmd = CMD_TX_DATA;

macht die Abfrage in der Luft, trotzdem habe ich ohne (msg.status = 0;) 
Daten auf dem CAN senden können. Erklärung?

Autor: Jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo wieder,
Problem gelöst, man muss manchmal frische Luft atmen gehen "geht 
wieder".

Der Status wird von dem Macro MOB_PENDING definiert ;-) und die if 
abfrage ist nur bei CMD_ABORT kritisch

mfg

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.