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
Vergiss es, nimm eine Webcam, und eine SW, welche das macht.
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.
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!
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
Ich weiß jetzt nicht, was du messen musst, ev. der große C hat günstige Waagen mit serieller Schnittstelle.
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.
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
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
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
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
> 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.....
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
schaust du hier, "jasmin" / Dietmar Beitrag "Große 7-Segment Anzeige" was sollen die 20 cm displays von den inselapen denn kosten ???
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.