Ich weiß nicht, ob die Frage hier richtig ist, aber ich habe ein Gerät mit einem alten Mikrocontroller, MAF 8031AH-2 12P. Das teil steuert ein weiteres Gerät mit dem selben µC. Die Befehle, die gesendet werden, sind ja am Ende mit einer Prüfziffer versehen. Ich weiß nicht, ob die Controller das automatisch machen oder per Software so reinprogrammiert ist. Ich denke, da kennen sich hier genug aus. Hier ein paar Beispiele von Datensendungen: 74 00 49 45 5A 49 4C 4F 50 20 20 50 4F 54 53 20 0D = Prüfziffer: 72 74 01 49 45 5A 49 4C 4F 50 20 20 50 4F 54 53 20 0D = Prüfziffer: 73 74 01 20 4E 45 47 4C 4F 46 20 45 54 54 49 42 20 0D = Prüfziffer: 60 74 11 20 20 20 20 20 20 20 20 4C 4C 41 46 4E 55 0D = Prüfziffer: 0B 74 01 20 20 20 20 20 20 20 3E 3D 3D 3D 3D 3D 3D 0D = Prüfziffer: 19 Ich müsste wissen, wie das berechnet wird. Wenn es ein Standard ist, sollte es doch recht einfach sein. Folgendes konnte ich schon herausfinden: 1 mehr an der 2. Position erhöht die Prüfzahl um 1, an der 3. und 4. Position erniedrigt sich die Prüfzahl. Bevor ich dort weiter kompliziert herumforsche, wollte ich hier mal die Experten fragen. Danke!
Der 8031 ist ein 8051 mit externem ROM. Neben der CPU muß also ein Programmspeicher sein. Den mal auslesen und disassemblieren könnte Dich der Lösung des Problems näher bringen.
Hallo, das externe ROM ist mir bekannt. Auslesen ist kein Problem, womit disassembliere ich das?
Mit einem Disassembler, der den MCS-51-Befehlssatz versteht. Den verwendet der 8031 nämlich. > Die Befehle, die gesendet werden, sind ja am Ende mit > einer Prüfziffer versehen. > Ich weiß nicht, ob die Controller das automatisch machen tun sie nicht > oder per Software so reinprogrammiert ist. So wird es sein. Den Algorithmus hast Du nicht anhand der von Dir geposteten Beispiele herausfinden können? Wenn nein, dann wirst Du wohl die Software analysieren müssen, was aber mehr als nur einen Disassembler erfordert, nämlich Deinerseits Verständnis dessen, was die verwendeten Maschinenbefehle bedeuten und bewirken.
Hmmmmm ... so ein Mist ;-) Leider kenne ich mich damit nicht sonderlich aus, habs schon probiert, aber das ist wie wenn jemand ein Haus bauen soll und nicht weiß, das es Steine zum Mauern gibt.
Ich bin schon weitergekommen. Vor der Prüfziffer sind ja immer 17 Werte, ich habe jeden Wert nacheinander +1 addiert und geschaut, wie sich die Prüfziffer weiterhin verändert. Stelle Bedeutung Prüfziffer-Veränderung 1 74 (t Befehlanfang) Wert +1 = PZ +1 2 Anzeige-Ort Wert +1 = PZ +1 3 Wort 1, Zeichen 1 Wert +1 = PZ –3 4 Wort 1, Zeichen 2 Wert +1 = PZ +3 5 Wort 1, Zeichen 3 Wert +1 = PZ –3 6 Wort 1, Zeichen 4 Wert +1 = PZ +3 7 Wort 1, Zeichen 5 Wert +1 = PZ –3 8 Wort 1, Zeichen 6 Wert +1 = PZ +3 9 Wort 1, Zeichen 7 Wert +1 = PZ –3 10 Wort 2, Zeichen 1 Wert +1 = PZ +3 11 Wort 2, Zeichen 2 Wert +1 = PZ –3 12 Wort 2, Zeichen 3 Wert +1 = PZ +3 13 Wort 2, Zeichen 4 Wert +1 = PZ –3 14 Wort 2, Zeichen 5 Wert +1 = PZ +3 15 Wort 2, Zeichen 6 Wert +1 = PZ –3 16 Wort 2, Zeichen 7 Wert +1 = PZ +3 17 0D (Befehlende) Wert +1 = PZ –3 18 Prüfziffer Wert +1 bedeutet immer, das ich mit einer Eins addiert habe. Aber wie stelle ich dafür jetzt eine Formel auf?
Könnte ne CRC sein, schau mal auf die Maxim seite, die haben da einige beschrieben für den 1-Wire Bus. Falls ne CRC nicht gleich paßt, die kann auch invertiert, gespiegelt, mit 0x00(00) oder 0xFF(FF) startend sein. Peter
Ach du meine Güte, da steigt ja kein Mensch durch.
Leute, ich habe eine Antwort vom Entwickler des Gerätes erhalten und hatte vorab angefragt, wie die Prüfziffer berechnet wird. Folgende Antwort: Sofern ich mich richtig erinnere sind die Inhalte der Einzelbytes über EXOR verknüpft worden. Im Anschluss wurde geprüft ob EVEN oder ODD Parity vorlag. Bei ODD Parity wurde das Byte invertiert und auf EVEN Parity ergänzt. Hilft uns das schon weiter? Mir sagt das ganze relativ wenig, aber es hört sich simpel an. Bitte um Hilfe.
Hi, die oberen Beispiele geben immer das korekte Ergebniss wenn alle Bytes XOR verknüpft werden und mit 7F gestartet wird. In Purebasic sieht das so aus:
1 | Restore Daten1 |
2 | |
3 | For y = 1 To 5 |
4 | CS.b = $7F |
5 | For z = 1 To 17 |
6 | Read.b Wert.b |
7 | CS = CS ! Wert |
8 | Next z |
9 | Debug Hex(CS) |
10 | Next y |
11 | |
12 | End
|
13 | |
14 | DataSection
|
15 | Daten1: |
16 | Data.b $74, $00, $49, $45, $5A, $49, $4C, $4F, $50, $20, $20, $50, $4F, $54, $53, $20, $0D |
17 | Daten2: |
18 | Data.b $74, $01, $49, $45, $5A, $49, $4C, $4F, $50, $20, $20, $50, $4F, $54, $53, $20, $0D |
19 | Daten3: |
20 | Data.b $74, $01, $20, $4E, $45, $47, $4C, $4F, $46, $20, $45, $54, $54, $49, $42, $20, $0D |
21 | Daten4: |
22 | Data.b $74, $11, $20, $20, $20, $20, $20, $20, $20, $20, $4C, $4C, $41, $46, $4E, $55, $0D |
23 | Daten5: |
24 | Data.b $74, $01, $20, $20, $20, $20, $20, $20, $20, $3E, $3D, $3D, $3D, $3D, $3D, $3D, $0D |
25 | EndDataSection
|
Gruß Rene
Danke soweit, haben Sie das ganze mal so getestet, ob mit diesem Code die richtige Prüfziffer herauskommt? Ich würde eine Prozedur für Visual Basic 6 benötigen. Aber ggf. berede ich das im entsprechenden Forum.
Habs grad selbst getestet unter PureBasic (Testversion schnell runtergeladen) und es funktioniert ja tatsächlich. Ich bedanke mich herzlich, aber einen Code für VB6.0 hast du nicht zufällig?
Wow, ich bin ja besser als ich dachte. Habs schon fertig in VB.
1 | püfziffer = 127 |
2 | prüfziffer = prüfziffer - 116 Xor 17 Xor 65 Xor 75 Xor 80 Xor 73 Xor 90 Xor 84 Xor 79 Xor 32 Xor 78 Xor 65 Xor 70 Xor 69 Xor 83 Xor 83 Xor 13 |
3 | Label1.Caption = prüfziffer |
DANKE an RENE
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.