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