Hallo zusammen,
ich habe derzeit etwas Freizeit und habe mich deswegen entschlossen ein
bisschen mit meinem neu erworbenen Open Logic Sniffer zu beschäftigen.
Zuerst war mir nicht ganz recht klar was ich den messen könnte um mich
in die Software bzw. das Gerät an sich einzuarbeiten. Dann kam mir die
Idee, dass ich die Kommunikation zwischen dem Display und dem uC meiner
Personenwaage im Bad belauschen könnte. Also habe ich die Waage (Soehnle
Silver Sense) aufgeschraubt und ein bisschen von innen studiert. Zu
finden war der Mess-Chip, vier Wiege-Zellen (druckabhängige Widerstände)
sowie das Hinterteil des Displays. Die Platine mit dem Mess-Chip ist nur
auf die Kontakte des Displays aufgelegt, sodass es sehr einfach war die
Signale abzugreifen. Damit ich die Waage nicht auf den Tisch stellen
muss bzw. das Laptop auf den Boden für die Messungen habe ich ein paar
Leitungen aus der Waage herausgeführt und an eine Sockelleiste gelötet
damit ich Messungen bequem am Schreibtisch durchführen kann.
Hier ist ein Bild der Platine, ich habe an die Kontakte die Namen der
Kanäle der Mess-Software geschrieben.
https://dl.dropboxusercontent.com/u/6454333/mikrocontoller.net/scale%20hacking/board_channels.jpg
Das Display besteht aus vier 7-Segment Anzeigen sowie einem Doppelpunkt
zwischen der ersten und zweiten Zahl, einem Punkt zwischen der dritten
und vierten Zahl. Des Weiteren sind an der rechten Seite noch 3 Anzeigen
die zeigen welches Masssystem eingestellt ist.
1
_ _ _ _ st
2
|_|· |_||_| |_| lb
3
|_|· |_||_|.|_| kg
Die Waage schaltet sich automatisch ein sobald man sich daraufstellt
(bzw. ~20 kg gemessen werden). Wenn die Waage für eine Zeit lang
unbelastet ist (0 kg) so schaltet sie sich wieder automatisch aus. Für
meine Messungen habe ich die Display-Kontakte an meinen Open Logic
Sniffer angeschlossen.
Durchführung der Messung:
- Waage ist aus.
- Messung der Sniffers beginnt sobald eine High-Signal auf dem Kanal 0
anliegt (Waage ist ein), anschließend wird noch 600ms gewartet (Display
wird eingeschaltet) bis die Daten aufgezeichnet werden.
- Nun habe ich mich kurz auf die Waage gestellt, damit diese
eingeschaltet wird.
- Messung wird durchgeführt.
- Anschließend wird die nächste Messung erst durchgeführt wenn die Waage
wieder aus geschaltet ist.
Als Mess-Software setze ich LogicSniffer ein
(http://www.lxtreme.nl/ols/). Gemessen wird mit einer Sample-Rate von 20
kHz.
Hier ist nun die erste Messung:
0-50ms ( start der Kommunikation mit dem Display bei 4,95ms)
https://dl.dropboxusercontent.com/u/6454333/mikrocontoller.net/scale%20hacking/001/001_0-50.png
3-16ms
https://dl.dropboxusercontent.com/u/6454333/mikrocontoller.net/scale%20hacking/001/001_3-16.png
50-100ms
https://dl.dropboxusercontent.com/u/6454333/mikrocontoller.net/scale%20hacking/001/001_50-100.png
0-600ms
https://dl.dropboxusercontent.com/u/6454333/mikrocontoller.net/scale%20hacking/001/001_0-600.png
Datei der Messung für LogicSniffer:
https://dl.dropboxusercontent.com/u/6454333/mikrocontoller.net/scale%20hacking/001/001.ols
Ich habe den Kanälen unterschiedliche Farben gegeben. Ich gehe davon aus
dass auf 2-3 Daten übertragen werden und die anderen Kanäle eine Art
Taktsignal liefern. 4, 5, 6 scheinen alle dasselbe Signal zu übertragen,
zudem ist hier die Periode immer gleich. Die restlichen Signale ändern
immer mal wieder die Dauer der High/Low Signals. Ich würde gerne wissen
was der uC mit dem Display spricht und vor allem wie sich dieses
Kommunikationsprotokoll zusammensetzt.
Ich würde mich sehr freuen wenn ihr mir ein paar Tipps geben könntet wie
ich hier eine Systematik entdecken könnte. Gerne bin führe ich noch
weitere Messungen durch.
Vielen dank und viele Grüße
konze
Bei so vielen Anschlüssen (und so viel Aktivität) für so ein kleines
(wenig Segmente) Display ist es sehr wahrscheinlich, daß es sich nicht
um Kommunikation handelt, sondern daß das Display direkt angesteuert
wird, d.h. die Treiber für die Segment- und Backplaneleitungen sitzen
direkt im µC. Zumindest die Backplaneanschlüsse werden mit mehr als zwei
unterschiedlichen Pegeln angesteuert; da unterschlägt der LA also
wichtige Information.
Ein Blick auf die Bilder: die meisten Signale wiederholen sich alle
sechs "Takte" (je ca. 4,2ms); das sieht also nach drei Backplanes aus.
Channel 2 und 3 könnten Backplanes sein: die sind jeweils einen Takt L,
dann einen Takt H (die aktive Phase der Backplane), dann haben sie vier
Takte lang einen Pegel dazwischen (die aktiven Phasen der anderen beiden
Backplanes). Aus dem Zwischenpegel macht der LA H mit unregelmäßigen
kurzen L-Störimpulsen drin.
Channel 4, 5 und 6 sind typische Beispiele für Segmentleitungen, die nur
ausgeschaltete Segmente bedienen: sie gehen immer mit dem Pegel der
gerade aktiven Backplane mit, so daß dazwischen keine Differenzspannung
entsteht.
Channel 9 im Bild 50-100ms steuert ein ausgeschaltete Segment (das zur
Backplane Channel 3 gehört) und wahrscheinlich zwei eingeschaltete: man
sieht, daß Channel 9 in der aktiven Phase von Channel 2 genau den
umgekehrten Pegel annimmt, und wahrscheinlich ist es bei der dritten
Backplane genauso.
Wenn die Segmente wirklich alle einzeln steuerbar sind, komme ich auf 33
Stück (4x7 für die Ziffern + 3 Maßeinheiten + Punkt + Doppelpunkt); bei
3 Backplanes werden also 11 Segmentleitungen benötigt; das Display
sollte also 14 Anschlüsse haben. Auf dem Foto sehe ich noch einen
Testpunkt auf gleicher Höhe wie Channel 9, der wahrscheinlich auch zum
Display gehört. Ein weiterer könnte sich unter der Schraube hinter
Channel 0/1 verbergen. Kann aber auch sein, daß die ganz linke
Displaystelle mit weniger echten Segmenten auskommt, weil sie nicht alle
Ziffern darstellen können muß (0+1: zwei Segmente, 0+1+2: fünf
Segmente).
Die fehlende Backplaneleitung kommt wahrscheinlich zwischen Channel 2
und 3 aus dem Chip und verschwindet ohne Testpunkt in einer
Durchkontaktierung; möglicherweise gehört der Testpunkt unterhalb von C1
dazu.
Hallo;
zum Thema direkte Ansteuerung der Segmente über uC:
Zum einen kann man, sofern das Datenblatt zum Display vorliegt, dies
bestimmt auch durch direktes Ansteuern über "normale" IO Ports
bewerkstelligen.
Zum anderen gibt es µC welche speziell zur Segmentansteuerung von LCD
Displays über die entsprechende Peripherie verfügen.
Als Beispiel seien hier die Arm Cortex M3 /M4 Derivate von EnergyMicro
genannt.
http://cdn.energymicro.com/dl/an/pdf/an0057_efm32_segment_lcd.pdf
Gruß
Hallo Konstantin,
zunächst würde ich mit einem Scope die Logiksignale kontrollieren, um
die Triggerschwellen für Deinen LA korrekt einzustellen. Anschliessend
legst Du ein Gewicht auf die Waage, z.B. 12.34 KG. Aus dem Anzeigewert
kannst Du nun das Pattern der 7-Segmente ermitteln. Da es sich mit an
Sicherheit grenzender Wahrscheinlichkeit um ein gemultiplexte Anzeige
handelt, muss Du nun nach der Patternfolge 1..2..3..4 in Deinen Signale
suchen. Das ist Gehirntraining pur, da Du nicht weisst, ob Du ein Common
Anode oder Common Kathode Display hast.
Viel Glück
Thomas
Hi
> Das ist Gehirntraining pur, da Du nicht weisst, ob Du ein Common>Anode oder Common Kathode Display hast.
Common Anode oder Common Kathode bei LC-Diplays?
MfG Spess
Hallo,
ich hatte vor einiger Zeit die gleiche Idee wie Konstantin und habe mich
an der Dekodierung der Displaysignale versucht. Dieser Thread hat mir
dabei einen guten Ansatzpunkt gegeben - daher möchte ich euch meine
Ergebnisse nicht vorenthalten.
Das Display der Waage wird in der Tat mithilfe von drei
Bitplane-Signalen und zwölf Segmentleitungen angesteuert. Somit können
bis zu 3*12=36 verschiedene Segmente angesteuert werden. Außer den von
Konstantin dargestellten Segmenten gibt es noch zwei weitere:
1
_ _ _ _ st
2
| |_| · |_| |_| |_| lb
3
| |_| · |_| |_| . |_| kg
4
5
H F E D C B A G
6
7
1 1 1 1 1
8
1 672 1 672 672 672 2
9
2 5 3 2 5 3 5 3 1 5 3 3
10
4 4 4 4
Ich habe die Segmente entsprechend ihrer Position benannt - Die
Segmentgruppen von A-G - die einzelnen Segmente einer Gruppe werden
durchnummeriert. So ergibt sich z. B. für das mittlere Segment der
Nachkommastelle die Bezeichnung A7, für das Komma die Bezeichnung B1.
Wie bereits beschrieben wechseln die drei Bitplane-Leitungen zwischen
0V, 1.5V und 3V. Die drei Bitplanes ermöglichen das zeitliche
Multiplexing der Segmentansteuerung, indem sie nacheinander zunächst für
je 4.2 ms 0V, dann 3V annehmen und danach für 4x4.2ms bei 1.5V
verharren. Ein Segment leutet, wenn zwischen Bitplane-Leitung und
Segmentleitung eine Spannung von mehr als ~2V anliegt.
Soll ein ausgewähltes Segment leuchten, verhält sich die Segmentleitung
invers zum zugehörigen Bitplane Signal. Es nimmt im entsprechenden
Zeitfenster zunächst 0V, dann 3V an. Soll das Segment nicht leuchten,
folgt die Segmentleitung der Bitplane-Spannung, nimmt also zunächst 3V,
dann 0V an. In den übrigen 4x4.2 ms werden die beiden anderen Bitplanes
durch die Segmentleitung bedient.
Ich habe mir also eine kleine Schaltung gebastelt, die mithilfe von drei
Komparatoren die Bitplane-Signale in digitale Signale umwandelt, die
aktiv sind, sobald deren Spannung 2V überschreitet. Diese drei Signale
sowie die 12 Segmentleitungen werte ich mithilfe eines ATMEGA328 aus und
sende das Ergebnis mit einem 433 Mhz Funkmodul (RFM12B) an meine
Hausautomatisierung, wo sie in einer Datenbank abgelegt werden.
(Irgend-)Ein Segment leuchtet, wenn gilt:
BPx & !Py == 1 (mit BPx = Bitplane, x= 1..3, Py = Segmentleitung, y=
1..12)
Mithilfe von Testgewichten und einer Wahrheitstabelle lassen sich die
Segmentleitung/Bitplane Kombinationen zu den einzelnen Segmenten
zuordnen.
Die folgenden Kombinationen haben sich für meine Waage ergeben:
1
P BP0 BP1 BP2
2
1 F3 F2 F4
3
2 D6 E1
4
3 D7 D1 D5
5
4 D3 D2 D4
6
5 C7 C1 C5
7
6 C3 C2 C4
8
7 A6 G2 G3
9
8 A7 A1 A5
10
9 F7 F1 F5
11
10 F6 H1/2 H1/2
12
11 C6 G1 B1
13
12 A3 A2 A4
Misst man also an der Bitplane-Leitung BP0 3V und and der Segmentleitung
P8 0V so leuchtet das mittlere Segment der Nachkommastelle.
Die Pinnamen habe ich wie folgt festgelegt.
1
-------------------------------
2
| X O | o = Displaypin
3
| | O = Loch
4
| | X = Schraube
5
| |
6
| |
7
| O |
8
| o Mess- o | BP1
9
| o brücke1 o X | BP0
10
| _ o | BP2
11
| o / \ o | P10
12
| o | | o | P9
13
| | | o | P1
14
| o Mess- \ _ / o | P2
15
| o brücke1 P11 o | P3
16
| o o | P4
17
| o | P5
18
| o Taster _ o | P6
19
| o / \ o | P7
20
| | | X o | P8
21
| | | o | P12
22
|___ \ _ / |
23
| |
24
___| Versorgung |
25
| GND + |
26
| X o o |
27
-------------------------------
Wer jetzt fröhlich eine neue Waage kaufen möchte, um daran rumzubasteln
- ich musste leider feststellen, dass die Elektronik in den neueren
Waagen verändert wurde.
Die Ansteuerung erfolgt nun über vier Bitplanes und Segmentleitungen mit
vier Spannungsleveln (0V, 1V, 2V, 3V), welche nun nur noch je 2.1 ms
anliegen. Außerdem wurde die Versorgungsspannung von ~6V auf ~3V
reduziert (statt 4xAAA nur noch 2xAAA Batterien). Prinzipiell kann die
Dekodierung jedoch nach obigem Muster erfolgen. Da jedoch auch die
Segmentleitungen vier verschiedene Spannungslevel aufweisen, können
diese nicht ohne weiteres mithilfe der Digitaleingänge des
Mikrocontrollers ausgewertet werden. Auch die geringere Eingangsspannung
erschwert die Bauteilauswahl. Die meisten Komparatoren haben eine
maximale Common-Mode Offsetspannung von Vcc-1.5V. Das bedeutet, dass die
Spannung am Eingang 3V-1.5V = 1.5V nicht übersteigen darf. Trotz dieser
Schwierigkeiten konnte ich die Signale abtasten und decodieren. Jedoch
fehlen noch einige Signale, die ich bislang nicht auf der Platine
lokalisieren konnte.
Ich hoffe, ich konnte bastelfreudigen Waagenmanipulatoren weiterhelfen.
Gruß,
Markus
Konstantin L. schrieb:> Hier ist ein Bild der Platine, ich habe an die Kontakte die Namen der> Kanäle der Mess-Software geschrieben.> https://dl.dropboxusercontent.com/u/6454333/mikrocontoller.net/scale%20hacking/board_channels.jpg
Schei. Dropbox:
Error (404)
We can't find the page you're looking for.
Damit ist der ursprüngliche Thread ziemlich kastriert.
@Konstantin L. (konze)
Es wäre ausgesprochen hilfreich, wenn du die Bilder noch mal hier ins
Forum hochladen würdest.
Markus A. schrieb:> Waage4.bmp
Versuchs mal als PNG -> Bildformate> Die meisten Komparatoren haben eine> maximale Common-Mode Offsetspannung von Vcc-1.5V. Das bedeutet, dass die> Spannung am Eingang 3V-1.5V = 1.5V nicht übersteigen darf. Trotz dieser> Schwierigkeiten konnte ich die Signale abtasten und decodieren.
Mit einem TS864, MCP6549, TLV1704, TLV3404MAX9094/MAX9095(VDD-0.7V) als
Komparator steht man evtl. besser da, auch wenn die Datenblätter sich zu
dem Thema Common Mode Range unterschiedlich klar ausdrücken.
> Ich hoffe, ich konnte bastelfreudigen Waagenmanipulatoren weiterhelfen.
Auf jeden Fall, danke für die ausführliche Darstellung
Forist schrieb:> Es wäre ausgesprochen hilfreich, wenn du die Bilder noch mal hier ins> Forum hochladen würdest.
Nö, es wäre nicht wirklich hilfreich.
Denn er hatte einen Logic Analyser verwendet, aber im Oszi von Markus
sieht man schön das die Bitplane Signale NICHT digital sind, sondern (in
diesem Falle) 3 Pegel haben. Das kann ein LA gar nicht korrekt
wiedergeben.
Jim M. schrieb:> Nö, es wäre nicht wirklich hilfreich.
Stimmt auch wieder. Das Platinenphoto alleine würde auch nicht viel
weiter helfen und der alte Teil vom Thread kann eigentlich nach /dev/nul
Hallo zusammen,
ja, dass die Links nicht mehr funktionieren, war zunächst hinderlich.
Wie schon angemerkt, sind spätestens durch meine Scope- und
Platinenbilder wieder alle benötigten Informationen vorhanden.
Der TLV1704 sieht auf den ersten Blick ganz brauchbar aus. Ich habe das
Problem mit einer Erweiterung der unten dargestellen Statemachine
gelöst. So habe ich mich auf die 0V-Phase der Bitplane Signale
synchronisiert und die Segmentleitungen während der 3V-Phase der
Bitplanes abgetastet. In diesem Zeitraum sind die Segmentleitungen
nämlich entweder 0V (Segment aktiv) oder 2V (Segment inakiv) und bewegen
sich somit im Rahmen der gültien Eingangsspannung der digitalen IOs.
Die internen ADCs des ATMEGA konnte ich leider nicht nutzen, da der
Multiplexer zu lange benötigt, zwischen den Kanälen zu wechseln.
Außerdem besteht bei einem sequentiellen Sampling die Gefahr, dass sich
die Signale in der Zwischenzeit geändert haben.
Habe das Bild noch einmal als png hochgeladen - gar nicht gesehen, das
es ein bmp war.
Falls es hilft - hier ein Auszug aus der Auswertung der gemessenen
Signale und die Umrechnung in ein Gewicht.
Gruß,
Markus
1
//sampling
2
bPortB=PINB;
3
bPortC=PINC;
4
bPortD=PIND;
5
6
(bPortC&(1<<BP0))?int_BP0=1:int_BP0=0;
7
(bPortC&(1<<BP1))?int_BP1=1:int_BP1=0;
8
(bPortC&(1<<BP2))?int_BP2=1:int_BP2=0;
9
10
11
12
13
//Statemachine - order: BP2 - BP1 - BP0
14
//init:
15
if(!int_BP0&int_BP1&!int_BP2&(state==99)){
16
state=00;
17
}
18
19
if(!int_BP0&!int_BP1&int_BP2&(state==00)){
20
_delay_ms(2);
21
sample_PortB_BP2=PINB;
22
sample_PortC_BP2=PINC;
23
sample_PortD_BP2=PIND;
24
state=01;
25
}
26
27
if(!int_BP0&int_BP1&!int_BP2&(state==01)){
28
_delay_ms(2);
29
sample_PortB_BP1=PINB;
30
sample_PortC_BP1=PINC;
31
sample_PortD_BP1=PIND;
32
state=02;
33
}
34
35
if(int_BP0&!int_BP1&!int_BP2&(state==02)){
36
_delay_ms(2);
37
sample_PortB_BP0=PINB;
38
sample_PortC_BP0=PINC;
39
sample_PortD_BP0=PIND;
40
state=03;
41
}
42
43
if(state==03){
44
45
// inverse read of digital IOs - LCD is activated if physical BP-Line high and physical P-Segment-Line low - or vice versa
46
// if variables int_Pn and BPm are both HIGH, respective segment is active.
47
48
// Conversion of BP0 asserted Pins to active Segments
49
(sample_PortC_BP0&(1<<P1))?Seg_F3=0:Seg_F3=1;
50
(sample_PortD_BP0&(1<<P2))?Seg_D6=0:Seg_D6=1;
51
(sample_PortD_BP0&(1<<P3))?Seg_D7=0:Seg_D7=1;
52
(sample_PortD_BP0&(1<<P4))?Seg_D3=0:Seg_D3=1;
53
(sample_PortD_BP0&(1<<P5))?Seg_C7=0:Seg_C7=1;
54
(sample_PortD_BP0&(1<<P6))?Seg_C3=0:Seg_C3=1;
55
(sample_PortB_BP0&(1<<P7))?Seg_A6=0:Seg_A6=1;
56
(sample_PortB_BP0&(1<<P8))?Seg_A7=0:Seg_A7=1;
57
Seg_F7=0;// P9 not needed for 0-199 kg conversion
58
Seg_F6=0;// P10 not needed for 0-199 kg conversion
59
(sample_PortC_BP0&(1<<P11))?Seg_C6=0:Seg_C6=1;
60
(sample_PortC_BP0&(1<<P12))?Seg_A3=0:Seg_A3=1;
61
62
// Conversion of BP1 asserted Pins to active Segments
63
(sample_PortC_BP1&(1<<P1))?Seg_F2=0:Seg_F2=1;
64
(sample_PortD_BP1&(1<<P3))?Seg_D1=0:Seg_D1=1;
65
(sample_PortD_BP1&(1<<P4))?Seg_D2=0:Seg_D2=1;
66
(sample_PortD_BP1&(1<<P5))?Seg_C1=0:Seg_C1=1;
67
(sample_PortD_BP1&(1<<P6))?Seg_C2=0:Seg_C2=1;
68
(sample_PortB_BP1&(1<<P7))?Seg_G2=0:Seg_G2=1;
69
(sample_PortB_BP1&(1<<P8))?Seg_A1=0:Seg_A1=1;
70
Seg_F1=0;// P9 not needed for 0-199 kg conversion
71
Seg_H1=0;// P10 not needed for 0-199 kg conversion
72
(sample_PortC_BP1&(1<<P11))?Seg_G1=0:Seg_G1=1;
73
(sample_PortC_BP1&(1<<P12))?Seg_A2=0:Seg_A2=1;
74
75
// Conversion of BP2 asserted Pins to active Segments
76
(sample_PortC_BP2&(1<<P1))?Seg_F4=0:Seg_F4=1;
77
(sample_PortD_BP2&(1<<P2))?Seg_E1=0:Seg_E1=1;
78
(sample_PortD_BP2&(1<<P3))?Seg_D5=0:Seg_D5=1;
79
(sample_PortD_BP2&(1<<P4))?Seg_D4=0:Seg_D4=1;
80
(sample_PortD_BP2&(1<<P5))?Seg_C5=0:Seg_C5=1;
81
(sample_PortD_BP2&(1<<P6))?Seg_C4=0:Seg_C4=1;
82
(sample_PortB_BP2&(1<<P7))?Seg_G3=0:Seg_G3=1;
83
(sample_PortB_BP2&(1<<P8))?Seg_A5=0:Seg_A5=1;
84
Seg_F5=0;// P9 not needed for 0-199 kg conversion
85
Seg_H2=0;// P10 not needed for 0-199 kg conversion