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