MAF 8031AH-2 12P - Wie macht der die Prüfziffer

Gast #1505533
Lesenswert?

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!
Persönliche Seite #1506581
Lesenswert?

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.
Gast #1508544
Lesenswert?

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?
Gast #1510184
Lesenswert?

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.
Gast #1510257
Lesenswert?

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
Gast #1510399
Lesenswert?

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.
Gast #1510499
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren