Forum: Mikrocontroller und Digitale Elektronik 7-Segment auslesen (Reverse Engineering)


von Tom M. (tomsen)


Angehängte Dateien:

Lesenswert?

Hallo,

mein Problem ist wie folgt: Ich habe hier aus einem gekauften Gerät 
(Digitalwaage) eine fünfstellige 7-Segmentanzeige liegen (mit noch 
dreizehn weiteren Symbolen wie Kommata, Vorzeichen, Einheit und so).

Dieses Segment ist über 16 Pins mit der Platine verbunden.

Jetzt muss es ja irgendwie möglich sein, über diese Pins den Zustand des 
Displays wieder rauszukriegen. Hier 
Beitrag "Küchenwaage mit seriellem Port?" hat das schonmal jemand 
gemacht.
Ich weiß jetzt aber nicht so recht, wie ich das angehen sollte, und 
google hilft mir da auch nicht weiter (komischerweise... ich hätte 
gedacht dass das ne recht häufige Anwengung sei).
Ich hab mir die Signale mit nem Oszi mal angeschaut. Die ersten vier 
Pins haben ein periodisches Signal (0, 1.5V, 3V Pegel), welches 
unabhängig von der Zahl auf dem Display ist. Dieses sieht immer so aus:

---^---_---^---_---^---_---^---_

ein Zustand dauert immer 5ms, die Zustände sind _ = GND; - = 1.5V, ^ = 
3V.

Diese vier pins steuern wohl die backplanes (wenn ich einen im Betrieb 
auf GND oder 3V lege, flackert auch das ganze Display). Da das Signal 
bei allen "strukturell" identisch ist, muss es von Pin zu Pin wohl 
einfach phasenverschoben sein. Dann würde es reichen, zum dekodieren nur 
eins der vier zu kennen, und man wüsste den zustand der anderen drei.

Dann kommen 11 Pins, die (0V, 3V Pegel) sich mit der Zahl auf dem 
Display verändern. Die haben scheinbar immer entweder so ein Signal:

__^^__^^__^^__^^__^^__^^__^^__^^

oder:

_^_^^_^__^_^^_^__^_^^_^__^_^^_^__^_^^_^_

(wieder 5ms pro Zeichen, _ = GND und ^ = 3V)
Der erste dieser 11 Pins hat scheinbar konstant nur das zweite dieser 
beiden Signale drauf. Also sind nur zehn Pins für die fünf 
Segment-Informationen zuständig.

Dann hab ich mal versucht, es andersrum anzugehen, und die Pins am 
ausgeschalteten Display mit GND oder 3V kurzzuschließen. Da es keinen 
GND Pin gibt, hab ich einfach 3V an einen der ersten vier Pins gehalten 
und bin mit GND die 10 Segment-Pins langgegangen. Hier hat dann immer 
für nen Moment (muss wohl mit Wechselspannung laufen) ein Teil eines 
Segments aufgeflackert, der in der Nähe des jeweils grade 
kurzgeschlossenen Pins lag. Es waren auch immer genau zwei benachbarte 
Pins für ein Segment zuständig; der eine für vier, der andere für drei 
der sieben Striche.

Naja jedenfalls bin ich jetzt fürs erste etwas ratlos. Habt ihr 
vielleicht nen Vorschlag, wie ich das Signal dekodiert kriege? Oder ganz 
allgemein ne Idee für ne Herangehensweise?

Danke schonmal, ciao
Thomas

von A. V. (a-v)


Lesenswert?

Vergiss es, nimm eine Webcam, und eine SW, welche das macht.

von MaWin (Gast)


Lesenswert?

Nun, du könntest erst mal sagen, dass es ein passives LCD Display ist.
Dann könntest du feststellen, daß mit 16 Kontakten 48 Segmente nicht 
direkt und nicht im simplen Dual-Multiplex ansteuerbar sind, es gibt 
also mehr als 2 Backplanes, bei dir vermutlich 4.

Dann schaust du einfach mal im Internet nach, wie solche Displays 
angesteuert werden, und erfährst, daß dabei nicht nur digitales 
Spannungen 'an'/'aus' sondern verschiedene Spannungslevel notwendig 
sind, zumindest 3.

Musst du die Spannungslevel auch auswerten? Nein, weil nur die 
Backplanes damit angesteuert werden, die Segmente nur mit 0V/3V, also 
TTL-kompatibel.

WENN eine Backplane auf 0V liegt, DANN sind die Segmentinformationen für 
SIE (wenn die anderen Backplaneleitung auf 0V liegt, ist die 
Segmentinformaiton für diese andere Backplane).

WENN die Backplane bei 1.5V liegt, ist die Segmentinformation für eine 
andere Backplane.

WENN die Backplane bei +3V liegt, st die Segmentinformation INVERTIERT 
für sie, die brauchst du gar nicht zu beachten.

Schau also, dass deine Auswertelektronik die 0V Signale erkennen kann 
(Komparatoren? Sowieso TTL-Schaltschelle unter 1.5V?) und latche die 
Segmentinformationen (es werden 12 Leitungen sein, auch noch eine für 
bisher unbenutze Zusatzsegmente) passend synchron zu den 4 Backplanes.

von Lorenz P. (lpg-elektronik)


Lesenswert?

Hallo!

Nimm nen Logikanalyzer!

Z.b. den hir : http://www.saleae.com/home/  Das is ein cooles Ding, und 
für knapp 150EUR gehörts Dir!

von Tom M. (tomsen)


Lesenswert?

Ok danke schonmal für eure Hilfe.
Webcam hab ich mir auch schon überlegt, wär aber ne unschöne Lösung, 
weil ich eigenlich keinen PC anschließen wollte. Der logic-analyzer ist 
mir zu teuer :(

MaWin, vielen Dank erstmal, so in der Art hab ich mir das auch gedacht - 
die drei Spannungspegel und die Taktung konnt ich aufm Oszi ja auch 
sehen, und Dennis hatte hier 
Beitrag "Re: Küchenwaage mit seriellem Port?" geschrieben dass ein 
Controller nur zwischen 0V und 3V unterscheiden können muss. Daher auch 
meine Überzeugung, dass ich das hinkriegen können müsste. Die Info, dass 
der mittlere Pegel gleichbedeutend mit 3V ist, und dass die backplane 
aktiv ist, wenn der Pin auf GND liegt, waren mir allerdings neu, danke 
dafür.

Die Pins der vier Backplanes kenn ich ja auch schon, die haben ja 
jeweils dieses Signal ---_---^ periodisch fortgesetzt. Da 1.5V dieselbe 
Bedeutung haben wie 3V, interessiert der mittlere Pegel nicht, und mein 
Controller sieht pro Pin bzw backplane halt immer für 35ms nen 
high-Pegel und dann für 5ms nen low - also immer 5ms an, dann 35ms aus. 
Die Pinbelegung der Segmente selbst ist offenbar dieselbe wie hier 
http://www.mikrocontroller.net/attachment/24909/WaageLCD.JPG im oberen 
Bild, so in der Richtung hab ich das ja auch bei meinen Tests gemessen.

Ich würd dann so vorgehen: alle Pins per Controller (mega32 auf 3V, 
18.432MHz, vielleicht immer nen kleinen Vorwiderstand vor jeden Pin des 
mega32) einlesen. Hoffen dass direkt wie bei Dennis die 1.5V als 3V 
erkannt werden. Wenn sich ne backplane auf 3V aendert, eine oder ne 
halbe ms warten zur Sicherheit falls ein Segment-pin etwas 
hinterherhängt, dann die zwölf Segment-Pins einlesen. Das ganze muss 
einmal für jede der 4 backplanes passieren. Dann kann ich die Zahlen mit 
dem WaageLCD.jpg-Bild da oben rekonstruieren. Klingt das so ok?

Ich frag mich nur, wieso das Display nur 4*5ms = 20ms von 40ms an ist... 
ne 100% Auslastung wär doch bestimmt sinnvoller, oder hab ich was 
übersehen?

Naja jedenfalls nochmal danke für den input!

Ciao

Thomas

von chris (Gast)


Lesenswert?

Ich weiß jetzt nicht, was du messen musst, ev. der große C hat günstige 
Waagen mit serieller Schnittstelle.

von Tom M. (tomsen)


Lesenswert?

Klingt cool, haste nen Link? Ich brauch bis 1KG max Gewicht, die Waage 
die ich hier liegen hab kostete 7 Euro und löst mit 0.1g auf. Ich hab 
ziemlich viel mit google und so gesucht, alle Lösungen mit rs232 die ich 
gefunden hatte kosteten mehr als 100 Euro...
Und ich find dass das ein recht interessantes und eigentlich auch recht 
simples Projekt zum basteln ist :) jedenfalls, wenn das auslesen so 
funktioniert, wie ich mir das vorstelle.

von Dennis (Gast)


Lesenswert?

Hi,

ich/wir habe/n damals diese Waage aus dem Thread "gepimt" - ohne oszi, 
wenn Du noch Interesse hast und hier vorbei schaust dann gebe ich gern 
Auskunft.

Mittlerweile habe ich noch weitere Displays (LCD) rückgewandelt, das 
geht in den meisten Fällen schneller und einfacher als man denkt.

z.B.:
Beitrag "Multimeter mit serieller Schnittstelle für unter 10€"

Gruß,
Dennis

von Tom M. (tomsen)


Lesenswert?

Hey Dennis, cool dass du diesen thread gefunden hast!

Jetzt grade frag ich mich, wie ich am besten mit den 3V umgehe. Bisher 
hab ich immer nur mit 5V gearbeitet..

Also ich benutze zum Programmieren den mysmartsub mk3 
http://shop.myavr.de/index.php?404;http://www.myavr.de:80/shop/article.php?artDataID=131, 
den kann man auf 5V und 3V einstellen. Werd ich das dann auch tuen 
müssen? Oder ist die Spannung bei der Programmierung unerheblich für die 
beim Betrieb?
Und kann ich einfach zB nen mega48 benutzen? Im Datasheet 
http://www.datasheetcatalog.com/datasheets_pdf/A/T/M/E/ATMEGA48.shtml 
steht zB: "Operating Voltages: 2.7 - 5.5V for ATmega48/88/168" (beim 
atmega32 datasheet steht zB nut 4.5-5.5V). Also kann ich einfach die 
Schaltung bauen wie bisher immer für 5V, und dann einfach 3V anlegen? 
Irgendwo stand, dass das bei zu hohen (quarz-oszi) Taktungen ärger 
macht, aber wenn ich bei internen 8MHz bleibe, würde das dann gehen?

Und wenn ich (zu testzwecken) mit einem PC kommunizieren will, brauch 
ich ja zB einen max232. Nun hab ich ein paar Beiträge gelesen, in denen 
stand, dass man bei 3V einen max3232 braucht... aber hier 
Beitrag "Re: msp430 FF1132 & MAX232" zB steht, dass ein 
normaler ausreicht. Hast du/jemand anders da Erfahrung mit?

Und wie mach ich am besten (sprich: einfachsten, billigsten) die 
Kommunikation mit nem anderen controller, der auf 5V läuft? Da bräuchte 
ich ja einmal ne Wandlung 5V->3V (Spannungsteiler?) und einmal ne 
Wandlung 3V-5V (irgendein einfacher Transistor?)

Danke schonmal, ciao
Thomas

von Dennis (Gast)


Lesenswert?

Hallo,

das sind ja viele Fragen auf mal. Bevor ich mich um die Randprobleme 
Kümmere würde ich mich erstmal um das Kernproblem kümmern, das reverse 
auslesen:

Schritt 1: Controller so programmieren das es auf 2 pins ein 
entgegengesetztes signal mit rund 50% 50% Tasverhältnis und einer 
Frequenz von 30 bis 50Hz erzeugt, ist ein kleiner 5zeiler. Controller 
kann ruhig an 5V betrieben werden.

Schritt 2: Display aus der Waage ausbauen und einen pin des Controllers 
an eine Backplane (hast du ja schon heruasgefunden) und mit dem anderen 
Pin über die restlichen Anschlüsse des Displays gehen (wenn Gummileiter 
vorhanden) dann diesen in verbindung mit display benutzen um die 
kontakte am Glas nicht zu verletzen. Eine Backplane nach der anderen 
abgehen.

Schritt 3: Tabelle erstellen, Backplanes zu restlichen Segmentpins 
aufzeichnen.

Schritt 4: Kleines Programm schreiben was den Zustand eines Ports an den 
Augang eines anderen Ports des Controllers kopiert (zweizeiler). 
Controller der für den Spannungsbereich 3V geeignet ist an einen der mux 
pins der Waage und an einen Segmentpin legen. mit dem Oszi messen was 
der Controller von den LCD Signalen "hält".

Wenn LCD Segmente angeregt werden, wird dies von der grundlegenden 
Funktionsweise her so gelöst, das sie mit einem Wechselsignal 
angesteuert werden, d.h. wenn die Backplane des Segmentes an Gnd liegt, 
dann muss das Segment an + liegen und umgekehrt. das wird meistens mit 
einer Frequenz zwischen 30 und 50Hz gemacht... ist nicht so wichtig. 
Wenn das Segment aus sein soll werden Backplane und Segment im 
"Gleichtakt" angesteuert.

Prinzip:
Backplane:
   _    _
__|  |__|  |__

Segment on:
_    __    _
  |__|  |__|

Segment off:
   _    _
__|  |__|  |__


Das Programm muss sich später auf das Signal der Backplane 
synchronisieren und im richtigen Moment gucken wie die Zustände der 
entsprechenden Segmente sind, sie sie "gleich" ist es eine 0 also aus, 
ist es genau umgekehrt, dann ist es eine 1 also an.

Schritt 5: programm schreiben, welches in abhöngikeit des Zustandes der 
Muxpins den Zustand der Segmentpins an einen Rechner (232) übermittelt 
und mal ansehen was man da so bekommt.

Schritt 6: das Programm erweitern um eine große Fallabfrage in der der 
Segmentinhalt "Reverse" einem Asci Zeichen oder etwas mit dem man 
weiterarbeiten will zugeordnet wird, und dann über rs232 verschicken.

Max232 hat bei mir an 3V funktioniert, aber das Datenblatt gibt da immer 
sicher auskunft. Die Pegel bei 232 sind da sehr weitreichend akzeptabel, 
sollte der Max etwas schwächer auf der brust sein, kommt es eher zu 
Problemen wenn die Leitungslänge zu groß wird. Ich habe aber auch schon 
Probleme mit no name 232 Pegelwandlern gehabt, die Ladungspumpen wollten 
im dem fall nicht mehr so wirklich.
Mit rs232 kannst du dann auch unter Systemen mit unterschiedlicher 
Betreibsspannung kommunizieren.


Das Programm kommt im normalfall ohne Interrups aus, ausser man nutzt 
den Uart tx ready interrupt. Das ganze kommt mit einem paar delays und 
pinabfragen und einem großen case sowie einem uart tx als sequenzielles 
Programm schon aus.

Da es sich um sehr geringe Frequenzen handelt, kannst du den Atmel mit 
internen 1Mhz (8:1) nutzen, selbst dann verbringt er die meiste zeit 
damit auf das display zu warten.

soweit erstmal,
Dennis

von Tom M. (tomsen)


Lesenswert?

So, danke nochmal Dennis und alle anderen fürs Hilfe leisten. Die 
Anwendung funktioniert jetzt wie am Schnürchen.
Also 13 der 16 pins des Displays (vier backplanes, acht Segment-pins [je 
zwei für die vier Ziffern], ein Vorzeichenpin) gehen direkt (ohne 
Widerstand oder so) an input-Pins an einem mega48. Um meine eigene Frage 
zu beantworten: dieser kann auch direkt mit 3V betrieben werden, der 
max232 kommt damit auch klar.

Ich war zuerst nicht sicher, ob von dem Tristate auf den Backplanes das 
1.5V Level als GND oder als 3V erkannt wird, deshalb hab ich in einem 
Testdurchgang ausgeben lassen, wie lang der pin auf high/low ist. 
Ergebnis war: 12% high, also erkennt der immer die 1.5V als low. 
Andersrum wär auch nich schlimm, denn ob die backplane auf gnd ist und 
der segmentpin auf 3V oder umgekehrt, macht ja nix. Das beantwortet 
übrigens auch meine Frage weiter oben: Die Auslastung ist 100% und nicht 
50% (5ms high, 5ms low pro backplane --> 10ms*4 backplanes = 40ms = 
Periodizität)

Das Entschlüsseln der Signale hab ich jetzt einfach so gemacht, indem 
ich im ersten Schritt für jeden Pin ein byte ausgerechnet habe, wobei in 
diesem byte das bit an N-ter Stelle gesetzt wird, wenn die backplane 
Nummer N auf HIGH war während der pin auf LOW lag. (Also wenn das 
zugehörige Segment also aktiv war). Sah im sourcecode etwa so aus:
1
if ... then x=0 else x=1
2
if ... then x=x+2
3
if ... then x=x+4
4
if ... then x=x+8
Ok, und da ja zwei pins pro Ziffer aktiv sind, hab ich das noch mit x+16 
bis x+128 für den zweiten pin fortgesetzt.
Dann hab ich mir im rs232 terminal aufm PC die zu den bytes gehörigen 
Ziffern auf dem Display angesehen, und ne enstprechende Tabelle in den 
bascom code (zB "If A = 220 Then Ziffer = 3" usw) getan, fertig. Wenn 
man erstmal dran sitzt ist das ne sehr einfache Geschichte.

Ein paar sehr seltene Ausreißer sind bisher noch drin, aber die werd ich 
entweder im Programm aufm mega48 entfernen oder ich mach einfach bei der 
Anwendung die hinten dran kommt nen median-Filter über die letzten 3-4 
Werte.

Aso, ich frag mich was passiert wenn ich die Waage mit 5V betreibe? Geht 
die dann kaputt? Oder misst ungenau?

Naja war jedenfalls ne interessante, einfache und nützliche Bastelei. 
Danke auf jeden Fall nochmal.

Caiosen
Thomas

von MaWin (Gast)


Lesenswert?

> Naja war jedenfalls ne interessante, einfache und nützliche Bastelei

Es wäre noch mehr Bastelei geworden, wenn du A. V. Ratschlag mit WebCam 
und Texterkennungssoftware gefolgt wärst.....

von Dennis (Gast)


Lesenswert?

Hallo Tom,

es freut mich, wenn es klappt. Wenn ich es recht verstehe ist dein 
Display wie meins aufgebaut (erste Zeichnung im Küchenwaagen Thread).

3 Tips noch:

1) Es wäre von der Anordnung her logischer wenn du die Segmente eines 
Displays in eine 8 Bit Variable "sortierst". Dann Kannst du die 
Umwandlung in Asci Zeichen mit ein und der selben Funktion für alle 4 
Displays machen.

2) bei einem Ausreißer würde ich die zuletzt erkannte Ziffer erneut 
senden.

3) wenn du VT100 Befehle mit in deinen seriellen Datenstrom einbaust, 
kannst du sehr viele Terminal Programme zum Anzeigen einsetzten, und 
benötigst keine extra sofware auf dem Rechner. Solltest du es nicht 
anzeigen, sondern speichern o sonstig weiterverarbeiten, kannst du die 
VT100 Steuezeichen sogar zur synchronisation nutzen.

Freut mich das es geklappt hat, ging mir aber ählich, funktioniert 
100%ig.

Gruß,
Dennis

von D. S. (jasmin)


Lesenswert?

schaust du hier,

"jasmin" / Dietmar


Beitrag "Große 7-Segment Anzeige"



was sollen die 20 cm displays von den inselapen denn kosten ???

von Tom M. (tomsen)


Lesenswert?

Hi Dennis,
jo richtig, der Aufbau mit den Backplanes und den Segment-Pins ist 
identisch zu dem aus deinem thread ( 
http://www.mikrocontroller.net/attachment/24909/WaageLCD.JPG )
Zu deinem ersten Tip, das mit dem byte mach ich auch so, war nur etwas 
umständlich beschrieben. Also jede Ziffer auf dem Display besitzt 
dadurch ein byte (0..255), und in einer einzigen bascom-"Function" (case 
220: P=4 etc) wird das 0..255 byte in eine 0..9 byte umgewandelt. 
Ausgegeben wird dann ein Integer I(a,b,c,d)=1000*a+100*b+10*c+d, also 
das Gewicht in 1/10 Gramm.
Zum zweiten Tip, Ausreißer gibts inzwischen keine mehr :) Immer wenn ein 
Zeichen nicht erkannt wurde, wird einfach nochmal alles neu eingelesen. 
Ist etwas overkill, aber bei den 25Hz fällt das nich weiter ins Gewicht. 
Passiert ja auch nur sehr selten. (Vorher sah die Implementierung so 
aus, dass, wenn ein Zeichen nicht erkannt wird, einfach das Zeichen der 
letzten Messung behalten wurde. Also wenn die Anzeige zB von 200 auf 199 
fiel, und die 1 nicht erkannt wurde, lautete die Ausgabe 299)
Was die Ausgabe angeht, ich will in meiner Anwendung nur, dass ein 
weiterer µc (mega32 auf 5V) das Gewicht als input nimmt, ich schicke 
also einfach immer per "Print" das Gewicht raus wenn es sich vom letzten 
gemessenen Wert unterscheidet, ohne Anfrage von außen.
Zur Kommunikation werde ich dann einfach direkt TxD vom mega48 auf RxD 
vom mega32 legen. Wenn das nich klappt, setz ich nen Transistor 
dazwischen der die 3V auf 5V ändert, oder (sehr umständlich, aber kost 
auch nix) ich benutz zwei max232.. der erste wechselt von 3V auf ~10V 
und der zweite von ~10V auf 5V.

Kleine Info noch für Nachahmer: Ein Haken war bisher die 
auto-Abschaltfunktion der Waage, diese geht nämlich immer nach 60 
Sekunden Inaktivität (also Stillstand des Gewichts/der Anzeige) aus. Das 
will ich aber nicht. Deswegen hab ich einen freien Pin des mega48 auf 
output geschaltet und mit der "mode"-taste der Waage (bzw mit dem 
Kontakt darunter) verbunden. Wenn ich jetzt sechsmal hintereinander kurz 
GND drauflege, schaltet der schnell (<1.5 Sekunden) alle sechs Einheiten 
durch und landet dann wieder bei Gramm, wobei der 60 Sekunden timer 
wieder resettet wird. Und da ich den Befehl immer nach 55 Sekunden 
Inaktivität sende, geht die Waage so schnell nich mehr aus :)
Diese Methode hat noch einen kleinen Haken, da die Waage manchmal nich 
60 Sekunden nach der letzten Display-Änderung ausgeht, sondern 60 
Sekunden nach der letzten eindeutigen Messung oder so, muss ich noch 
rausfinden. Wird aber irgendwie zu machen sein.

Also Danke nochmal für die Unterstützung, ciao

Thomas

von Finder (Gast)


Lesenswert?

Auf Beitrag "Re: Küchenwaage mit seriellem Port?" gibts sowas in 
der Art nun auch mit Source...

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.