Forum: Mikrocontroller und Digitale Elektronik Benötige Hilfe beim Identifizieren von Datensignal (Reverse engineering)


von Ben (diy-ben)



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

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Oberflächlich betrachtet scheint ein Paket aus 9 Pulsen zu bestehen, 
dann kommt eine etwas längere Pause. Innerhalb des Pakets gibt es nur 
zwei verschiedene Längen, die man als 0 und 1 interpretieren könnte.

von H. H. (hhinz)


Lesenswert?

Ben schrieb:
> - Verwendeter 14 Pin Microcontroller hat keine Markierung,
> möglicherweise AtTiny20 oder Sonix SN8P2711

Padauk PMS132B-S14?

: Bearbeitet durch User
von Sönke P. (s03nk3)


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.

von Ben (diy-ben)


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.

von Ben (diy-ben)



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'

: Bearbeitet durch User
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
Noch kein Account? Hier anmelden.