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


von jamest (Gast)


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:
1
void send_std_can_msg(unsigned int std_id, unsigned char std_dlc, unsigned char * buffer)
2
{
3
  st_cmd_t msg;     // message descriptor store in code area
4
5
  msg.pt_data = &buffer[0];
6
  
7
  msg.status = 0;
8
  msg.handle = 0;
9
   
10
11
     msg.ctrl.ide = 0;   //-- CAN 2.0A
12
        msg.dlc = std_dlc;        //-- Max
13
        msg.id.std = std_id;
14
        msg.cmd = CMD_TX_DATA;
15
16
        while(can_cmd(&msg) != CAN_CMD_ACCEPTED);
17
    while(can_get_status(&msg) == CAN_STATUS_NOT_COMPLETED);
18
    
19
  
20
}

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...

von Harald (Gast)


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-can-bibliothek

von Tom (Gast)


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.

von jamest (Gast)


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...

von Jack (Gast)


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.:
1
 st_cmd_t msg;     // message descriptor store in code area
2
 msg.pt_data = &buffer[0]; 
3
// msg.status = 0;
4
 msg.handle = 0;
5
 msg.ctrl.ide = 0;   //-- CAN 2.0A
6
 msg.dlc = std_dlc;        //-- Max
7
 msg.id.std = std_id;
8
 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?

von Jack (Gast)


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

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