Forum: Mikrocontroller und Digitale Elektronik Tipps für CAN-Gateway mit den Interrupts gesucht


von Manuel B. (desteini)


Lesenswert?

Hi Leute, brauche mal Tipps von erfahrenen Leuten hier.

Ich bin dabei ein CAN-Gateway mit einem LPC2919 zu entwickeln, soweit 
funktioniert auch alles. Das Problem ist, der Nutzer später soll 
möglichst einfach zusätzliche Nachrichten senden können, diese muss er 
aber vor dem Start des device neu drauf flashen. Dabei soll er zwischen 
Intervall zeiten von 10ms, 20ms...100ms, 200ms...1s wählen können.

In dem Device wird zusätzlich ein Display angesteuert, weswegen dass 
senden in der Hauptschleife rausfällt, da das Display delays erzeugt und 
damit die Can-Nachrichten nicht im passenden Intervall los geschickt 
werden.

Alternative ist dann, dass ich sie per interrupt los schicke, jedoch 
denke ich, dass es zu viele Anweisungend für ein interrupt sind, sodass 
er teilweiße zu lange braucht, und dadurch die nächste Nachricht zu spät 
los sendet.

Hier meine bisherigen Code ausschnitte:
1
void SendMessages(void)
2
{
3
  int limit=0,i=0;
4
  while (Can1Messages[i].ID){i++;}
5
  limit=i;
6
  
7
  for(i=0;i<limit;i++)
8
  {
9
   switch (Can1Messages[i].intervall)
10
   {
11
   case 10:   flag_10ms_act++;
12
              if(flag_10ms_act==1){
13
              TxMsg10_1.CTRL=Can1Messages[i].CTRL;
14
              TxMsg10_1.Data1=Can1Messages[i].Data1;
15
              TxMsg10_1.Data2=Can1Messages[i].Data2;
16
              TxMsg10_1.ID=Can1Messages[i].ID;
17
              //EW_SendData_CAN( 1, &TxMsg );
18
              }
19
              else{
20
              TxMsg10_2.CTRL=Can1Messages[i].CTRL;
21
              TxMsg10_2.Data1=Can1Messages[i].Data1;
22
              TxMsg10_2.Data2=Can1Messages[i].Data2;
23
              TxMsg10_2.ID=Can1Messages[i].ID;}
24
            break;
25
   
26
   case 20:   flag_20ms_act++;
27
              if(flag_20ms_act==1){
28
              TxMsg20_1.CTRL=Can1Messages[i].CTRL;
29
              TxMsg20_1.Data1=Can1Messages[i].Data1;
30
              TxMsg20_1.Data2=Can1Messages[i].Data2;
31
              TxMsg20_1.ID=Can1Messages[i].ID;
32
              //EW_SendData_CAN( 1, &TxMsg );
33
              }
34
              else{
35
              TxMsg20_2.CTRL=Can1Messages[i].CTRL;
36
              TxMsg20_2.Data1=Can1Messages[i].Data1;
37
              TxMsg20_2.Data2=Can1Messages[i].Data2;
38
              TxMsg20_2.ID=Can1Messages[i].ID;}
39
            
40
            break; 
41
            
42
   case 30:   flag_30ms_act++;
43
              if(flag_30ms_act==1){
44
              TxMsg30_1.CTRL=Can1Messages[i].CTRL;
45
              TxMsg30_1.Data1=Can1Messages[i].Data1;
46
              TxMsg30_1.Data2=Can1Messages[i].Data2;
47
              TxMsg30_1.ID=Can1Messages[i].ID;
48
              //EW_SendData_CAN( 1, &TxMsg );
49
              }
Hier werden die im LookUp Table gespeicherten Nachrichten einmalig vor 
der Hauptschleife in die Entsprechenden Nachrichten_intervalle 
gespeichert.
und dann im Interrupt sortiert und ausgeführt:
1
void TIMER1_ISR( void )
2
{
3
  DWORD regVal;
4
  static int i=1,j=2,k=3,u=4,o=5,ii=6,jj=7,kk=8,uu=9;
5
  i--;j--;k--;u--;o--;ii--;jj--;kk--;uu--; 
6
  if(!i)
7
  {
8
    flag_10ms=1;i=1;
9
    if(!flag_10ms_act);
10
    else if(flag_10ms_act==1){EW_SendData_CAN( 1, &TxMsg10_1 );}
11
    else{EW_SendData_CAN( 1, &TxMsg10_1 );
12
         EW_SendData_CAN( 1, &TxMsg10_2 );}
13
  }
14
  if(!j)
15
  {
16
    flag_20ms=1;j=2;
17
    if(!flag_20ms_act);
18
    else if(flag_20ms_act==1){EW_SendData_CAN( 1, &TxMsg20_1 );}
19
    else{EW_SendData_CAN( 1, &TxMsg20_1 );
20
         EW_SendData_CAN( 1, &TxMsg20_2 );}
21
  }
22
  if(!k)
23
  {
24
    flag_30ms=1;k=3;
25
    if(!flag_30ms_act);
26
    else if(flag_30ms_act==1){EW_SendData_CAN( 1, &TxMsg30_1 );}
27
    else{EW_SendData_CAN( 1, &TxMsg30_1 );
28
         EW_SendData_CAN( 1, &TxMsg30_2 );}
29
  }
Problem ist jetzt aber, dass selbst wenn ich nur 2 Nachrichten mit 30ms 
und 50ms verschicke, die letztere oftmals erst nach 100ms gesendet wird, 
meine Vermutung, weil er zulange in dem Interrupt verhart.

Habt ihr andere ideen, wie man es Zeitstabiler machen könnte? Ich habe 
noch einen Timer übrig, bringt es was, den zu initialisieren und ihn 
beispielsweiße für 30ms,60ms,90ms etc zu verwenden? Die 100ms schritte 
laufen schon mit einem anderen Timer...

Wäre für Tipps dankbar,

Grüße Manu

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.