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.
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
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
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 | }
|
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
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.
>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.
Hallo Holger Aber wie kann ich den Fehler finden, beim Übersetzen gibt es keinen Fehler. lg. Johann K.
>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.
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.
>Es werden nicht alle Byte eines Telegramms empfangen
Oder sie werden gar nicht gesendet. Finde es raus.
Sie werden gesendet, das habe ich natürlich als erstes geschaut. Ich Protokolliere am Bus mit, ist garnicht so einfach mit 20MBPS.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.