Benötige Hilfe beim Identifizieren von Datensignal (Reverse engineering)

OP #7786005
Lesenswert?

Hallo,

Ich bin am "Reverse engineering" von einer kabelgebundenen Fernbedienung (RJ12 Stecker) für einen Spannungswandler. Anzeige erfolgt mittels Leds. Schaltplan und Datensignal habe ich angehängt.

ERLEDIGT:

  • Battery SOC, RJ12 Pin 6, 0.5-0.75V Led 1-5, Beim Laden blinken restliche Leds
  • AC Load, RJ12 Pin 4, 0-1.5V Led 1-5, Ab 1.6V blinken alle (Überlast)
  • Led Power ON
  • Diode D1 ist überflüssig (Einseitig verbunden)

UNKLAHR:

  • Verwendeter 14 Pin Microcontroller hat keine Markierung, möglicherweise AtTiny20 oder Sonix SN8P2711
  • Datensignal für die Anzeige von Inverter OUT, AC IN, Bypass(NVS), Fault, AC Charge Leds.

Das Datensignal (RJ12 Pin 2) scheint sehr simple zu sein aber ich kann das nicht einordnen.

  • Was ist eure Meinung dazu?
  • Warum ist pin 7+8(Datensignal) am MC über 1k Ohm Widerstand verbunden?

Vielen Dank schonmal für eure Hilfe. Grüsse Ben

#7786041
Lesenswert?

Ich kann da kurze (~32ms), mittlere (~63ms) und längere (~82ms) Intervalle mit niedrigem Pegel und nur sehr kurze (~20ms) mit hohem Signalpegel sehen.

Die zeitlichen Verhältnisse im Bezug auf den sehr kurzen hohen Pegel sind ca. 1:1,5, 1:3 und 1:4.

Rein aus dem Bauch raus würde ich die langen Intervalle als Pakettrenner annehmen, da es so aussieht, als wären sie am seltensten.

Wenn da jetzt mehr als die beiden Zustände Idle und Laden signalisiert werden, dann bastel dir doch einen Sigrok Protokolldecoder (Sigrok scheinst du ja bereits zu nutzen), damit du besser loggen kannst, was da übertragen wird.

Möglicherweise besteht trotz der simplen Anwendung eine Nachricht aus mehr als nur einem Byte, von daher würde ich eh nicht nur so einen kleinen Ausschnitt beleuchten.

OP #7786474
Lesenswert?

Danke für eure Antworten.

H. H. schrieb:

Padauk PMS132B-S14?

Ist auch eine Möglichkeit.

Sönke P. schrieb:

bastel dir doch einen Sigrok Protokolldecoder (Sigrok scheinst du ja bereits zu nutzen)

Benutze Sigrock erlicherweise erst seit gestern. https://www.sigrok.org/wiki/Protocol_decoder_HOWTO habe ich gelesen aber deise Bemerkung irritiert mich:

Note: Do not start new protocol decoders by copying code from here. Instead, it's recommended to select an already existing decoder in the source code which is similar to the one you plan to write, and copy that as a starting point.

Welcher Decoder soll das sein? Spontan würde ich https://sigrok.org/wiki/Protocol_decoder:Rc_encode nehmen welcher aber auch unnötig komplex ist. Kennt jemand gute Tutorials/Beispiele im Web? Bisher habe ich nichts gefunden ausser der allgemeinen Benutzung von Protokolldecoder.

Sönke P. schrieb:

Möglicherweise besteht trotz der simplen Anwendung eine Nachricht aus mehr als nur einem Byte, von daher würde ich eh nicht nur so einen kleinen Ausschnitt beleuchten.

Es ist gut möglich das es nur ein byte ist, denn die Leds(Inverter OUT, AC IN, Bypass(NVS), Fault, AC Charge) könnten als bit 1 oder 0 gesetzt sein.

OP #7786681
Lesenswert?

Ich denke ich habe den Rest herausgefunden:

  • bit 1: Fault (Nicht getestet nur eine Ahnung)
  • bit 2: AC Charge oder Bypass (Sehe ich wenn der Akku voll geladen ist)
  • bit 3: Inverter OUT
  • bit 4: AC Charge oder Bypass (Sehe ich wenn der Akku voll geladen ist)
  • bit 5: AC IN

Danke ihr habt mich auf die richtige Spur gebracht und ich habe was gelernt!

phython auszug:

1
def decode_bit(edges):
2
    # 60.8 / 19.5 = 3.1179487179487179487179487179487
3
    # 62.95 / 19.4 = 3.2448453608247422680412371134021
4
    # 62.95 / 17.3 = 3.6387283236994219653179190751445
5
    aMin = 3.0  # min multiplier
6
    aMax = 3.7  # max multiplier
7

8
    # 30.4 / 19.45 = 1.5629820051413881748071979434447
9
    # 32.6 / 19.45 = 1.6760925449871465295629820051414
10
    # 32.6 / 17.3 = 1.8843930635838150289017341040462
11
    bMin = 1.5  # min multiplier
12
    bMax = 1.9  # max multiplier
13

14
    # 82.4 / 19.5 = 4.225641025641025641025641025641
15
    # 82.45 / 17.3 = 4.7658959537572254335260115606936
16
    # 84.6 / 17.3 = 4.8901734104046242774566473988439
17
    cMin = 4.2  # min multiplier
18
    cMax = 4.9  # max multiplier
19

20

21
    if (edges[1] >= edges[0] and (edges[1] >= edges[0] * aMin and edges[1] <= edges[0] * aMax)):
22
        return 'A'
23

24
    elif (edges[1] >= edges[0] and (edges[1] >= edges[0] * bMin and edges[1] <= edges[0] * bMax)):
25
        return 'B'
26

27
    elif (edges[1] >= edges[0] and (edges[1] >= edges[0] * cMin and edges[1] <= edges[0] * cMax)):
28
        return 'C'
29

30
    else:
31
        return 'U'

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