Forum: Mikrocontroller und Digitale Elektronik PIC32 Programmierung


von Klatec (Gast)


Lesenswert?

Hallo

Hat jemand Erfahrung mit PIC32 ich verwende den PIC32MX795F512L und habe 
Probleme. Ich habe auf der main.c eine Funktion hinzugefügt und 
plötzlich hat mein System nicht mehr funktioniert. Ich habe einges 
versucht und  festgestellt wenn ich diese Funktion (vErrTabWrite(4,2)) 
garnicht anspringe (siehe Code unten) funktioniert die Sache auch nicht. 
Wenn ich sie lösche oder mit // herausnehme geht wieder alles.

void main(void){
  ...
  ucHallo100=100;
  if(ucHallo100==0){
       vErrTabWrite(4,2);    //Adr 4 Bit 2 FT COM M-CPU
  }

  ...
}
Es kommunizieren zwei Baugruppen (M-CPU und C-CPU und jede hat einen 
PIC32) seriell miteinander und wenn die Funktion dirnnen steht in main, 
dann werden die Telegramme nicht zur gänze empfangen.
Es dürfte die Plosse Anwesenheit des Codes ein Problem sein.
Zur zeit tritt das Problem auf der C-CPU auf, aber ich hatte es auch 
schon auf der M-CPU, da habe ich den Code so umgeschrieben und auf ander 
*.c verschoben bis es funktioniert hat, bei der C-CPU hatte ich auch mit 
dieser Methode keinen Erfolg.
Kann mir bitte jemnd weiter helfen.

Lg.

Johann K.

von Tommy.S (Gast)


Lesenswert?

Hallo Johann,

poste doch bitte mal ein bisschen mehr vom Code... z.B. wäre der Code 
der Funktion vErrTabWrite nützlich, inkl. eventueller Deklarationen im 
.h-File

Gruß,
Tommy.S

von Thomas (Gast)


Lesenswert?

Hi

Klatec schrieb:
> ucHallo100=100;
>   if(ucHallo100==0){

als erstes, hast du ucHallo100 als volatile deklariert?

Sonst poste den inhalt von vErrTabWrite() einmal, das dürfte glaube ich 
helfen :)

lg

von Klatec (Gast)


Lesenswert?

Hallo

Danke für euer Interesse, ich habe noch etwas herausgefunden. Wenn ich
der Funktion vErrTabWrite(4,2) nicht 4 und 2 übergebe, sondern 0 und 0 
dann funktioniert die Sache.

Die Routine vErrTabWrite(4,2) schreibt einfach einige Bits (in diesem 
Fall auf die Adresse 4 das Bit 2) in die Fehlertabelle wenn z.B. die 
Checksumme bei einem Telegramm nicht passt, hat aber für die Funktion 
keine Bedeutung. Die Fehlertabelle kann ich über eine Service 
Schnttstelle auslesen.

In der *.h habe ich eingetragen
1
extern void vErrTabWrite(unsigned char ErrCode,unsigned char ErrBit);
2
3
4
*******
5
void vErrTabWrite(unsigned char ErrCode,unsigned char ErrBit){
6
/*******************************************************************
7
 erstellt am : 11.10.2014
8
9
 Funktionsname: 
10
 
11
 Beschreibung:  Hier wird die Fehlertabelle mit Fehler beschrieben.
12
   
13
  
14
15
 PARAMETER: 
16
17
 letzte Änderung:  
18
 ******************************************************************/
19
  unsigned char ucData;
20
   switch(ErrCode){
21
     
22
     
23
     case 0: 
24
      switch(ErrBit){
25
         case 6:  //Summenfehlerwort Ausfall, FT006S
26
           vErrSumEdit(6,1);    //Adr 0x00, Bit6 Summenfehlerwort Ausfall
27
           break;     
28
29
         case 7:  //Summenfehlerwort Hochlauf, FT007S
30
           vErrSumEdit(7,1);    //Adr 0x00, Bit7 Summenfehlerwort Hochlauf
31
           ucData=0xFF;
32
           break;  
33
       }      
34
       break; 
35
     //*****************************************************************************
36
37
    case 4:
38
      switch(ErrBit){
39
         case 2:  
40
           vErrTabEdit(4,2,1);    //Adr 04, Bit2 //Ausfall COM M-CPU, FT042S
41
           break;     
42
       }                                              
43
      vErrSumEdit(2,1);    //Adr 0x00, Bit0 Summenfehlerwort Kommunikatonsfehler                         
44
                 
45
               
46
       break;          
47
       
48
              
49
       
50
    //*****************************************************************************  
51
 
52
     case 14:
53
      switch(ErrBit){
54
         case 0:  
55
           vErrTabEdit(14,0,1);    //Adr 0x14, Bit0 //Ausfall SS0, FT140S
56
           break;     
57
58
   
59
                      
60
       }                    
61
      vErrTabEdit(4,1,1);  //Adr 4, Bit1 Summenbit COM Ausfall SS0                      
62
      vErrSumEdit(2,1);    //Adr 0x00, Bit0 Summenfehlerwort Kommunikatonsfehler                         
63
                 
64
               
65
       break;       
66
     //*****************************************************************************  
67
    case 16:
68
      switch(ErrBit){
69
         case 0:  
70
           vErrTabEdit(16,0,1);    //Adr 0x16, Bit0 //Retry Fehler M-CPU, FT160S
71
           break;   
72
           
73
         case 1:  
74
           vErrTabEdit(16,1,1);    //Adr 0x16, Bit1 //COM TimeOut M-CPU, FT161S
75
           break;                
76
77
   
78
                      
79
       }                    
80
      vErrTabEdit(4,2,1);  //Adr 4, Bit0 Summenbit COM Ausfall M-CPU                      
81
      vErrSumEdit(2,1);    //Adr 0x00, Bit0 Summenfehlerwort Kommunikatonsfehler                         
82
                 
83
               
84
       break;       
85
     //*****************************************************************************       
86
     case 20:
87
      switch(ErrBit){
88
         case 0:  
89
           vErrTabEdit(20,0,1);    //Adr 0x20, Bit0 //Eingangspufferüberlauf M-CPU, FT200S
90
           break;     
91
92
         case 1:  
93
           vErrTabEdit(20,1,1);    //Adr 0x20, Bit1 //Eingangspufferüberlauf C-CPU, FT201S
94
           break;  
95
           
96
         case 2:  
97
           vErrTabEdit(20,2,1);    //Adr 0x20, Bit2 //AusgangspufferPrioritätsfehler M-CPU, FT202S
98
           break;             
99
           
100
         case 3:  
101
           vErrTabEdit(20,3,1);    //Adr 0x20, Bit3 //AusgangspufferPrioritätsfehler SS0, FT203S
102
           break;
103
           
104
         case 4:  
105
           vErrTabEdit(20,4,1);    //Adr 0x20, Bit4 //AusgangspufferPrioritätsfehler SS1, FT204S
106
           break;
107
           
108
         case 5:  
109
           vErrTabEdit(20,5,1);    //Adr 0x20, Bit5 //AusgangspufferPrioritätsfehler SS2, FT205S
110
           break;                      
111
                      
112
       }                    
113
      vErrTabEdit(3,0,1);  //Adr 3, Bit0 Summenbit Pufferüberlauf                      
114
      vErrSumEdit(0,1);    //Adr 0x00, Bit0 Summenfehlerwort Internerfehler                         
115
                 
116
               
117
       break;
118
     //*****************************************************************************        
119
       
120
     case 21:
121
      switch(ErrBit){
122
         case 0:  
123
           vErrTabEdit(21,0,1);    //Adr 0x21, Bit0 //Ausgangspufferüberlauf M-CPU Pr0, FT210S
124
           break;     
125
126
         case 1:  
127
           vErrTabEdit(21,1,1);    //Adr 0x21, Bit1 //Ausgangspufferüberlauf M-CPU Pr1, FT211S
128
           break;  
129
         case 2:  
130
           vErrTabEdit(21,2,1);    //Adr 0x21, Bit2 //Ausgangspufferüberlauf M-CPU Pr2, FT212S
131
           break;  
132
           
133
         case 3:  
134
           vErrTabEdit(21,3,1);    //Adr 0x21, Bit3 //Ausgangspufferüberlauf SS0 Pr0, FT213S
135
           break;     
136
137
         case 4:  
138
           vErrTabEdit(21,4,1);    //Adr 0x21, Bit4 //Ausgangspufferüberlauf SS0 Pr1, FT214S
139
           break;  
140
         case 5:  
141
           vErrTabEdit(21,5,1);    //Adr 0x21, Bit5 //Ausgangspufferüberlauf SS0 Pr2, FT215S
142
           break;                        
143
       }    
144
      vErrTabEdit(3,0,1);  //Adr 3, Bit0 Summenbit Pufferüberlauf                      
145
      vErrSumEdit(0,1);    //Adr 0x00, Bit0 Summenfehlerwort Internerfehler          
146
               
147
       break;       
148
       
149
     //*****************************************************************************        
150
       
151
     case 27:
152
      switch(ErrBit){
153
         case 0:  
154
           vErrTabEdit(27,0,1);    //Adr 0x27, Bit0 //Telegrammfehler fix Länge C-CPU Nr, FT270S
155
           break;     
156
157
         case 1:  
158
           vErrTabEdit(27,1,1);    //Adr 0x27, Bit1 //Telegrammfehler fix Länge C-CPU CS, FT271S
159
           break;  
160
         case 2:  
161
           vErrTabEdit(27,2,1);    //Adr 0x27, Bit2 //Telegrammfehler fix Länge C-CPU Stoppzeichen, FT272S
162
           break;  
163
           
164
         case 3:  
165
           vErrTabEdit(27,3,1);    //Adr 0x27, Bit3 //Telegrammfehler fix Länge C-CPU Tel-Code, FT273S
166
           break;     
167
168
                       
169
       }    
170
       vErrTabEdit(6,0,1);  //Adr 4, Bit0 Summenbit Telegrammfehler fix. Länge  
171
      vErrTabEdit(3,1,1);  //Adr 3, Bit1 Summenbit Telegrammfehler                      
172
      vErrSumEdit(0,1);    //Adr 0x00, Bit0 Summenfehlerwort Internerfehler          
173
               
174
       break;        
175
       
176
     //*****************************************************************************        
177
       
178
     case 28:
179
      switch(ErrBit){
180
         case 0:  
181
           vErrTabEdit(28,0,1);    //Adr 0x28, Bit0 //Telegrammfehler var. Länge C-CPU Nr, FT280S
182
           break;     
183
184
         case 1:  
185
           vErrTabEdit(28,1,1);    //Adr 0x28, Bit1 //Telegrammfehler var. Länge C-CPU CS, FT281S
186
           break;  
187
         case 2:  
188
           vErrTabEdit(28,2,1);    //Adr 0x28, Bit2 //Telegrammfehler var. Länge C-CPU Stoppzeichen, FT282S
189
           break;  
190
           
191
         case 3:  
192
           vErrTabEdit(28,3,1);    //Adr 0x28, Bit3 //Telegrammfehler var. Länge C-CPU Tel-Code, FT283S
193
           break;     
194
195
                       
196
       }    
197
       vErrTabEdit(6,1,1);  //Adr 4, Bit1 Summenbit Telegrammfehler var. Länge  
198
      vErrTabEdit(3,1,1);  //Adr 3, Bit1 Summenbit Telegrammfehler                      
199
      vErrSumEdit(0,1);    //Adr 0x00, Bit0 Summenfehlerwort Internerfehler          
200
               
201
       break;                  
202
       
203
     //*****************************************************************************        
204
       
205
     case 29:
206
      switch(ErrBit){
207
         case 0:  
208
           vErrTabEdit(29,0,1);    //Adr 0x29, Bit0 //Telegrammfehler fix. Länge SS0 CS, FT290S
209
           break;     
210
211
         case 1:  
212
           vErrTabEdit(29,1,1);    //Adr 0x29, Bit1 //Telegrammfehler fix. Länge SS0 Stoppzeichen, FT291S
213
           break;  
214
         case 2:  
215
           vErrTabEdit(29,2,1);    //Adr 0x29, Bit2 //Telegrammfehler fix. Länge SS0 Tel-Code, FT292S
216
           break;  
217
                
218
219
                       
220
       }    
221
       vErrTabEdit(6,0,1);  //Adr 4, Bit0 Summenbit Telegrammfehler fix. Länge  
222
      vErrTabEdit(3,1,1);  //Adr 3, Bit1 Summenbit Telegrammfehler                      
223
      vErrSumEdit(0,1);    //Adr 0x00, Bit0 Summenfehlerwort Internerfehler          
224
               
225
       break;          
226
       
227
     //*****************************************************************************        
228
       
229
     case 30:
230
      switch(ErrBit){
231
         case 0:  
232
           vErrTabEdit(30,0,1);    //Adr 0x30, Bit0 //Telegrammfehler var. Länge SS0 CS, FT300S
233
           break;     
234
235
         case 1:  
236
           vErrTabEdit(30,1,1);    //Adr 0x30, Bit1 //Telegrammfehler var. Länge SS0 Stoppzeichen, FT301S
237
           break;  
238
         case 2:  
239
           vErrTabEdit(30,2,1);    //Adr 0x30, Bit2 //Telegrammfehler var. Länge SS0 Tel-Code, FT302S
240
           break;  
241
                
242
         case 3:  
243
           vErrTabEdit(30,3,1);    //Adr 0x30, Bit3 //Telegrammfehler var. Länge SS0 ACK-Code, FT303S
244
           break;  
245
246
                       
247
       }    
248
       vErrTabEdit(6,1,1);  //Adr 4, Bit1 Summenbit Telegrammfehler var. Länge  
249
      vErrTabEdit(3,1,1);  //Adr 3, Bit1 Summenbit Telegrammfehler                      
250
      vErrSumEdit(0,1);    //Adr 0x00, Bit0 Summenfehlerwort Internerfehler          
251
               
252
       break;                 
253
       
254
     //*****************************************************************************        
255
       
256
     case 31:
257
      switch(ErrBit){
258
         case 0:  
259
           vErrTabEdit(31,0,1);    //Adr 0x31, Bit0 //Telegramm ACK-Fehler SS0 GA-Activ, FT310S
260
           break;     
261
262
         case 1:  
263
           vErrTabEdit(31,1,1);    //Adr 0x31, Bit1 //Telegramm ACK-Fehler SS0 GA-Conform, FT311S
264
           break;  
265
         case 2:  
266
           vErrTabEdit(31,2,1);    //Adr 0x31, Bit2 //Telegramm ACK-Fehler SS0 GA-Term, FT312S
267
           break;  
268
                
269
         case 3:  
270
           vErrTabEdit(31,3,1);    //Adr 0x31, Bit3 //Telegramm ACK-Fehler SS0 Nutzdaten, FT313S
271
           break;  
272
         case 4:  
273
           vErrTabEdit(31,4,1);    //Adr 0x31, Bit4 //Telegramm ACK-Fehler SS0 SS-Test-Tel, FT314S
274
           break;                  
275
276
                       
277
       }    
278
       vErrTabEdit(6,2,1);  //Adr 4, Bit2 Summenbit Telegramm ACK Fehler  
279
      vErrTabEdit(3,1,1);  //Adr 3, Bit1 Summenbit Telegrammfehler                      
280
      vErrSumEdit(0,1);    //Adr 0x00, Bit0 Summenfehlerwort Internerfehler          
281
               
282
       break;                                                      
283
   
284
     //*****************************************************************************        
285
       
286
     case 34:
287
      switch(ErrBit){
288
         case 0:  
289
           vErrTabEdit(34,0,1);    //Adr 0x34, Bit0 //Paramterfehler Anzahl der R# zu groß, FT340S
290
           break;     
291
292
         case 1:  
293
           vErrTabEdit(34,1,1);    //Adr 0x34, Bit1 //Paramterfehler keine FR für empfangenes Tel., FT341S
294
           break;                   
295
296
                       
297
       }      
298
      vErrTabEdit(3,2,1);  //Adr 3, Bit1 Summenbit Telegrammfehler                      
299
      vErrSumEdit(0,1);    //Adr 0x00, Bit0 Summenfehlerwort Internerfehler          
300
               
301
       break;                      
302
   }
303
   if(ucData==0xFF){  //nur beim Hochlaufbit Summenfehler Bit 7
304
     ucData=0;
305
     return;
306
   
307
   }  
308
   if(ucAnzsperr==0){  //Ausgabe wird durch Programm gesperrt
309
     ucData =ucErrTab[0];
310
     
311
     if(ucData=!0){  //Fehler vorhanden?
312
       if(ucErr==0){  //Ausgabe nur wenn noch keine Fehler aktiv war
313
        ucErr=0xFF;
314
        PORTClearBits(bCcpuErr);  //Erroranzeige setzen     
315
       }
316
     }   
317
   }
318
 }

von Carsten S. (dg3ycs)


Lesenswert?

Hallo ?Johann? (Oder habe ich da was falsch im Kopf?)

Konnte deinen Code und dein Problem nur noch schnell überfliegen, 
"Familienbesuch", Freundin steht schon fertig im Flur...

aber:
Klatec schrieb:
> Danke für euer Interesse, ich habe noch etwas herausgefunden. Wenn ich
> der Funktion vErrTabWrite(4,2) nicht 4 und 2 übergebe, sondern 0 und 0
> dann funktioniert die Sache.

Wenn ich das jetzt richtig gesehen habe gibt es zwischen (0,0) und (4,2) 
zwei Unterschiede:
Zum einen wird bei 0,0 einfach "nichts" gemacht, während bei (4,2) die 
Funktionen "vErrTabEdit()"  sowie "vErrSumEdit()" aufgerufen werden.
Also durchaus Möglich das der Fehlre in einer dieser Unterfunktionen 
liegt.

> Die Routine vErrTabWrite(4,2) schreibt einfach einige Bits (in diesem
> Fall auf die Adresse 4 das Bit 2) in die Fehlertabelle [...]

Wenn es Fehler im Zusammenhang mit dem Schreiben in irgendwelche 
Tabellen oder Arrays gibt liegt natürlich auch immer irgendwie die 
Vermutung nahe das dort irgendwelche Arraygrenzen überschritten werden 
und Daten an die falsche Stelle geschrieben werden wo sie den 
Programmablauf stören.
Dieses Szenario sollte man immer im Hinterkopf haben und ggf. abprüfen.

Hast du denn Schon einmal ausprobiert was passiert wenn du die Funktion 
mit dem Wert vErrTabWrite(0,6) aufrufst?
Denn dann sollte ja nur die Funktion "vErrSumEdit()" aufgerufen werden, 
nicht aber "vErrTabEdit(). Funktioniert dies, dann liegt die Vermutung 
nahe das dein Problem in vErrTabEdit() liegt, funktioniert das auch 
nicht ist vErrSumEdit() der wahrscheinlichste Kandidat!

Gruß
Carsten

von Klatec (Gast)


Lesenswert?

Hallo

Die Routine wird ja garnicht ausgeführt weil die Variable (ucHallo100) 
immer auf 100 bleibt, also wird nicht in die Funktion gesprungen. Aber 
der Unterschied ist wenn ich nicht (4,2) sondern (0,0) übergebe das die 
weitere korrekt Funktion des Systems gegeben ist. Es gibt auch keinen 
Pufferüberlauf oder Array Verletzung weil wie schon angeführt nicht in 
die Routine gesprungen wird.

Kann es sein das durch die Übergabeparameter irgendwelche Register 
beschreiben die auch gleichzeitig eben für den Datenempfang benötigt 
werden.
Ich habe mir auch die Disassembly Listing angesehen, aber die sagt mir 
nix.


void main(void){
  ...
  ucHallo100=100;
  if(ucHallo100==0){
       vErrTabWrite(4,2);    //Adr 4 Bit 2 FT COM M-CPU
  }

  ...
}

Lg.

Johann K.

von holger (Gast)


Lesenswert?

>Die Routine wird ja garnicht ausgeführt

Dann war der Fehler auch ohne diese Routine schon vorhanden.
Er hat sich nur nicht ausgewirkt. Durch das hinzufügen der
Routine haben sich dann Speicheradressen verschoben und jetzt
wirkt sich der bereits vorhandene Fehler aus.

von Klatec (Gast)


Lesenswert?

Hallo Holger

Aber wie kann ich den Fehler finden, beim Übersetzen gibt es keinen 
Fehler.

lg.
Johann K.

von holger (Gast)


Lesenswert?

>Aber wie kann ich den Fehler finden, beim Übersetzen gibt es keinen
>Fehler.

Als erstes keinen Code mehr hinzufügen, verschieben oder entfernen.
Sonst ist das Problem mit einmal weg und wieder verdeckt.
Dann eine genaue Fehleranalyse was schief geht und wie
es sich auswirkt. Den Fehlerzustand so lange wie möglich
aufrecht erhalten, Debugger an und los gehts.
Am besten erst mal alle Arrays auf mögliche Überläufer abchecken.

>plötzlich hat mein System nicht mehr funktioniert

Das ist jedenfalls keine genaue Fehlerbeschreibung.

von Klatec (Gast)


Lesenswert?

Hallo Holger

Betroffen sind die Kommunikation zwischen der M-CPU und der C-CPU.
Es wird von der M-CPU eine Verbindung aufgebaut und da werden 
verschiedene Telegramme gesendet.

M-CPU    ----->       C-CPU

Baugruppenaufruf      Quittung
Parameter             Quittung
Verbindung Ok         Quittung   ist COM Ok


Die Parameter werden in ca. 90 Telegramme mit je ca. 270 Byte übertragen 
und bei den Parameter kommt es irgendwann zu einenm Empfangsfehler. Es 
werden nicht alle Byte eines Telegramms empfangen und somit kommt es zum 
Abbruch weil die Quittung für die M-CPU ausbleibt.


Das System läuft sonst stabil und hatte keine Fehler. Es schaufelt in 15 
Minuten ca. 45000 Telegrammen von den Eingabebaugruppen zur Zentrale und 
Befehle von der Zentrale zu den Ausgabebaugruppen, ohne Probleme.
Nun wollte ich mit der Einbindung der Fehlertabelle beginnen und jetzt 
stellt es mich auf.

von holger (Gast)


Lesenswert?

>Es werden nicht alle Byte eines Telegramms empfangen

Oder sie werden gar nicht gesendet. Finde es raus.

von Klatec (Gast)


Lesenswert?

Sie werden gesendet, das habe ich natürlich als erstes geschaut. Ich 
Protokolliere am Bus mit, ist garnicht so einfach mit 20MBPS.

von holger (Gast)


Lesenswert?

Vieleicht ist ja auch einfach nur dein RAM voll.

von Klatec (Gast)


Lesenswert?

Hallo

Nein mein Ram ist max. 2/3 belegt.

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.