Hallo,
Habe heut mal ein kniffliges Problem:
Ich hänge mit einem max485 und 48Mhz PIC an einem Profibus DP.
soweit so gut.
alles funktioniert erstaunlich gut, auch das berechnen der TX Prüfsumme
(sonst würde ja der Master auch meckern...)
was NICHT funktionier ist die Auswertung der eingehenden Prüfsumme.
Und das obwohl auf dem LA alles arithmetisch stimmt.
ich berechne die Prüfsumme so:
RFCS =
DA+SA+FC+DATA[1]+DATA[2]+DATA[3]+DATA[4]+DATA[5]+DATA[6]+DATA[7]+DATA[8]
+DATA[9]+DATA[10]+DATA[11]+DATA[12]
die Nutzdaten wahlweise auch bei variabler Länge in einer Schleife
addiert,
funkt aber auch nicht.
also nochmal wenn ich die Werte aus dem LA abschreibe und
zusammenaddiere,
dann stimmt es mit der PS überein.
Aber wenn das Programm es machen soll, dann geht gar nichts mehr,
weil ich dann einen Sprung zum Ende mache.
gibt es da noch einen Trick? oder sowas?
klar, die Schaltung läuft auch ohne Prüfsumme beim Empfangen,
ich möchte es aber halbwegs professionell machen.
Grüße Sven
hallo,
doch noch Einer munter ;)
wie soll ich das machen beim C-Compiler?
Ich habe alle mit char definiert,
dannn müsste es doch automatisch mit 8 bit rechnen, auch unsigned char
brachte keine Verbesserung...
Sven R. schrieb:> auch unsigned char brachte keine Verbesserung
Interessant. Welcher Compiler?
Welchen Datentyp hat deine Variable für die Prüfsumme?
Die Prüfsumme wird über die vorzeichenlose Addition aller
Telegrammelemente berechnet, wobei bei der Addition ein
Wertbereichsüberlauf ignoriert wird.
Hier ist die Frage, was der Compiler bei "unsigned char" und einem
Overflow anstellt. C89[1] sagt dazu nämlich nur, dass die Verwendung der
char-Datentypen zu anderen Zwecken als dem Speichern von Zeichen
implementationsabhängig ist.
Wenn dein Compiler uint8_t kennt, nimm mal den Typ für die
Summenvariable. Sonst nimm unsigned int und schneide zum Schluss mit
(summe & 0xFF) die höherwertigen Bits ab.
Grüße
Stefan
[1] K&R 2. Ausgabe
Danke,
das ist der mikroC Compiler
ich schau dann mal ob er die uint Kommandos kennt...
aber müsste es dann nicht auch bei der TX Prüfsumme Probleme geben,
welche ich genauso berechne?
Sven R. schrieb:> aber müsste es dann nicht auch bei der TX Prüfsumme Probleme geben,> welche ich genauso berechne?
Da gibt es mehrere Möglichkeiten, warum es doch funktionieren könnte.
Welche das ist, weiß ich nicht, meine Glaskugel ist leider gerade
verliehen.
Aber zeig doch mal den entsprechenden Code, dann sehen wir weiter.
Grüße
Stefan
Sven R. schrieb:> sicher etwas unübersichtlich
Bitte unterschätze niemals die Wichtigkeit eines gut lesbaren
Quelltextes. Im "Gestrüpp" übersieht man leichter Fehler.
Ok, jetzt zum inhaltlichen:
Es fehlen alle Variablendefinitionen. Die sind aber für die Frage, was
falsch läuft, eminent wichtig.
Ein paar grundsätzliche Gedanken zur Prüfsummenberechnung: So gut wie
alle Prüfsummen, CRC etc. werden über alle Elemente der Nachricht
berechnet.
Nach der Profibus-Spec Abschnitt 4.7.4 wird die FCS über alle Elemente
zwischen SD und FCS/ED berechnet.
Deshalb empfiehlt es sich, das auch so zu machen. Du hast anscheinend
die empfangene Nachricht im Array RByte[]. Dann berechne sie auch direkt
über die Elemente des Arrays. Wenn ich die Organisation dieses Puffers
richtig verstanden habe, also von RByte[1] (Byte nach SD) bis RByte[Leng
- 2] (Byte vor der empfangenen FCS). Damit sollte das eigentlich passen:
Hallo Stefan,
bei mir steht das aber so geschrieben :
"Beim Format ohne Daten (SD1) muss die Prüfsumme durch die arithmetische
Summe von DA, SA, und FC
ohne Start- (SD) und End-delimiter (ED) und ohne Berücksichtigung der
Überträge gebildet werden. Bei den
Formaten fester Länge mit Daten (SD3) und variabler Länge (SD2) muss die
Prüfsumme noch zusätzlich die
Nutzdaten (PDU) mit einbeziehen."
also ab DA-FC?
Gruß
Sven R. schrieb:> die arithmetische Summe ohne Berücksichtigung der Überträge> ohne Start- (SD) und End-delimiter (ED)> Format ohne Daten (SD1)> DA, SA, und FC
DA ist das erste Zeichen nach SD1, FC das letzte Zeichen vor der FCS.
> Bei den Formaten fester Länge mit Daten (SD3) und variabler> Länge (SD2) muss die Prüfsumme noch zusätzlich die> Nutzdaten (PDU) mit einbeziehen
Also der Block von DA (einschl.) bis zum letzten Byte der Nutzdaten (das
letzte Zeichen vor der FCS)...
Die Formulierung der Norm ist nicht besonders toll, aber eindeutig.
Du rechnest immer vom ersten Byte der Nachricht nach dem Start Delimiter
(bei allen Nachrichtentypen mit FCS ist das DA) bis zum letzten Byte vor
der FCS (FC bei SD1 bzw. das letzte Byte der PDU bei SD2 und SD3).
Danach hast du die "Soll-FCS" und kannst sie beim Senden anhängen bzw.
beim Empfang vergleichen.
Grüße
Stefan
hallo
ich habs jetzt so geschrieben
und da gehts:
for(j=5;j<Leng-2;j++){
RFCS = RFCS + RByte[j];
}
if (RByte[j]!=RFCS) goto END;
war wohl vorher irgendwie ein Byte daneben, oder so?
keine Ahnung mit dem unit8 hats nichts zu tun den nimmt der Comp nicht
an.
vielen Dank für die Hilfe!
Grüße Sven