Forum: Mikrocontroller und Digitale Elektronik LCD-Display Signal abgreifen, verändern und weiterschicken


von Ricardo M. (ricardodidneineleven)


Lesenswert?

Moin zusammen,

Ich bin grade dabei das Display von meinem Autoradio zu kapern (128x16). 
Wie die Datenübertragung funktioniert ist mittlerweile klar, jetzt geht 
es darum das Ganze für eigene Zwecke umzumodellieren.

Die Daten werden seriell Bit für Bit bzw Pixel für Pixel übertragen, 
wenn der Data/Command-Pin auf High ist. Ich würde gerne die Funktion des 
Radios erhalten, jedoch die Möglichkeit haben, auf Teilen des Displays 
etwas anderes anzuzeigen.

Meine Idee war folgende: Über einen Multiplexer (Duplexer?) den 
SerialIn-Pin auf einen zweiten Mikrocontroller legen sobald D/C High 
wird (statt auf DataIn vom Display). Dann soll der µC mit einem 
Interrupt die Signale aufnehmen, zwischenspeichern und anschließend die 
zweiten, individuellen Daten drüberlegen. Jetzt werden die kombinierten 
Daten an das Display weitergeschickt.
Die Frequenz mit der die Daten über den Seriellen Bus geschickt werden 
ist ungefähr 50khz (clock). Im Leerlauf schickt das Radio jede Sekunde 
einmal die Daten durch. Wenn ein Knopf gedrückt wird, wird automatisch 
auch ein Refresh ausgelöst. Der zweite µC Müsste also ziemlich schnell 
sein. Am besten fast synchron.

Somit würde der "original"-µC weiterhin alle Commandos schicken, die 
Daten werden aber von meinem µC eingeschleust.

Kann das soweit funktionieren oder seht ihr irgendwelche größeren 
Probleme? Müsste ich da am Besten mit Assembler ran oder kriegt man das 
auch "einfach" in C gelöst?

Gerne auch andere Lösungsvorschläge falls euch was "Besseres" einfällt 
:-)

EDIT: Wobei. Es wäre wahrscheinlich praktischer, falls ein Knopf 
gedrückt wird, den zweiten µC und das Overlay für zb 5 Sekunden zu 
deaktivieren. Das würde die Bedienung vereinfachen

: Bearbeitet durch User
von Jobst M. (jobstens-de)


Lesenswert?

1. Datenleitung auftrennen und 2. Portpins (Eingang und Ausgang) Deines 
µCs dazwischen hängen.
2. Clockleitung an einen IRQ-Eingang
3. D/C an einen weiteren Eingang.

Sobald D/C auf Daten schaltet, den IRQ einschalten.
Dabei sollte dieser genau auf der anderen Flanke liegen, als der, bei 
der das Display die Daten übernimmt.
Bei jedem IRQ wird ein Zähler inkrementiert.
Solange sich der Zähler außerhalb Deines Bereichs (Bereiche!) befindet, 
werden die Daten vom Eingangspin mit höchstmöglicher Geschwindigkeit zum 
Ausgangspin geschaufelt. Ist der Zähler innerhalb, dann muss bei jedem 
IRQ ein Bit aus Deinem Speicher am Datenpin ausgegeben werden.
Wenn D/C wieder auf Kommandos schaltet, alle Zähler zurücksetzen, Daten 
wieder einfach durchreichen.

Viel Spaß!

Gruß
Jobst

: Bearbeitet durch User
von Ricardo M. (ricardodidneineleven)


Lesenswert?

Jobst M. schrieb:
> 1. Datenleitung auftrennen und 2. Portpins (Eingang und Ausgang) Deines
> µCs dazwischen hängen.
> 2. Clockleitung an einen IRQ-Eingang
> 3. D/C an einen weiteren Eingang.
>
> Sobald D/C auf Daten schaltet, den IRQ einschalten.
> Dabei sollte dieser genau auf der anderen Flanke liegen, als der, bei
> der das Display die Daten übernimmt.
> Bei jedem IRQ wird ein Zähler inkrementiert.
> Solange sich der Zähler außerhalb Deines Bereichs (Bereiche!) befindet,
> werden die Daten vom Eingangspin mit höchstmöglicher Geschwindigkeit zum
> Ausgangspin geschaufelt. Ist der Zähler innerhalb, dann muss bei jedem
> IRQ ein Bit aus Deinem Speicher am Datenpin ausgegeben werden.
> Wenn D/C wieder auf Kommandos schaltet, alle Zähler zurücksetzen, Daten
> wieder einfach durchreichen.
>
> Viel Spaß!
>
> Gruß
> Jobst

Perfekt, danke dir für deine ausführliche Antwort. Das klingt schon mal 
nach einem guten Leitfaden.

Jetzt muss ich mich nurnoch um einen geeigneten µC kümmern.

Ich hätte gerne ein CAN-Anbindung, da ich einige Sensoren auslesen + 
anzeigen lassen will. Hat da eventuell jemand eine geeignete Kombination 
im Kopf? Ich hatte an den ATMEGA16M1 gedacht, der hätte CAN direkt mit 
an Board. Oder macht ein dedizierter CAN-IC hier mehr Sinn der dann über 
SPI angebunden wird?
Das ganze auf einem ATTINY zu realisieren wäre natürlich cool, jedoch 
wird es da schon mit den seriellen Schnittstellen knapp, wenn ich noch 
einen IC anbinden will (oder?)

Ist mein erstes "größeres" Projekt, deshalb entschuldige ich mich mal 
für eventuell offensichtliche Fragen :-)

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

Solche Fragen wurden hier schon öfter gestellt und sämtliche Versuche 
mangels Erfolg bzw. ausufernder Komplexität wieder eingestellt.

Du müßtest alle Kommandos prüfen, ob sie Positionen setzen oder 
beschreiben, die im gesperrten Bereich liegen. Wenn Du nur mitlauschst, 
ist es zu spät, das LCD hat sie dann schon empfangen.
Du müstest also sämtliche Daten erstmal zwischenspeichern, um zu 
entscheiden, sollen sie weiter gereicht werden oder nicht. Außerdem 
müßtest Du alle globalen Kommandos so umändern, daß sie nur den 
erlaubten Bereich ändern.
Und Du müßtest Deine eigenen Daten geschickt mit einfädeln, ohne das es 
zu Kollisionen kommt.

von Peter D. (peda)


Lesenswert?

Ein anderer Ansatz wäre, der zwischen-MC fungiert als Software-LCD, d.h. 
schreibt in einen internen Bildspeicher. Diesen gibt er dann zyklisch 
mit dem zusätzlichen Bereich an das LCD aus.
Der MC muß alle LCD-Befehle intepretieren. Das Ganze wird also richtig 
aufwendig.

von Vanye R. (vanye_rijan)


Lesenswert?

> Der MC muß alle LCD-Befehle intepretieren. Das Ganze wird also richtig
> aufwendig

Eigentlich nicht. Er kann ja alle Befehle welche sich nicht als Pixel
auf dem Screen wiederfinden, ignorieren. Aber natuerlich muss man dann
einmal selber das Display initialisieren.

Vanye

von Εrnst B. (ernst)


Lesenswert?

Peter D. schrieb:
> Der MC muß alle LCD-Befehle intepretieren. Das Ganze wird also richtig
> aufwendig.

Mal in meiner Uralt-Bookmarkkiste gekramt:
http://dinceraydin.com/djgfxlcdsim/djgfxlcdsim.html

Das Javascript ist recht übersichtlich, und es ist ja nichtmal gesagt, 
dass das Autoradio alle möglichen Befehle auch nutzt.

von Peter D. (peda)


Lesenswert?

Ricardo M. schrieb:
> Ich bin grade dabei das Display von meinem Autoradio zu kapern (128x16).

Für so ein winziges LCD wäre mir der Entwicklungsaufwand viel zu hoch.

von Εrnst B. (ernst)


Lesenswert?

Peter D. schrieb:
> Für so ein winziges LCD wäre mir der Entwicklungsaufwand viel zu hoch.

Immerhin hätte er mit einer Simulator-Lösung die Option ein viel 
größeres LCD anzuschließen, und den 128x16-Bereich da irgendwie 
reinzumappen.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Peter D. schrieb:
> Für so ein winziges LCD wäre mir der Entwicklungsaufwand viel zu hoch.

Andererseits wäre dabei der Buffer, den der 'Man-in-the-Middle' MC 
bereitstellen muss, auch entsprechend übersichtlich und zumindest mal 
eine gute Fingerübung für den TE. Aber stimmt schon, das ist recht 
winzig.

von Ricardo M. (ricardodidneineleven)


Lesenswert?

Matthias S. schrieb:
> Peter D. schrieb:
>> Für so ein winziges LCD wäre mir der Entwicklungsaufwand viel zu hoch.
>
> Andererseits wäre dabei der Buffer, den der 'Man-in-the-Middle' MC
> bereitstellen muss, auch entsprechend übersichtlich und zumindest mal
> eine gute Fingerübung für den TE. Aber stimmt schon, das ist recht
> winzig.

Naja hier geht es ja nicht um das Display selbst, sondern darum das 
Autoradio im verbauten Zustand für eigene Zwecke zu nutzen. Es soll 
neben dem üblichen Radiokram auch Vcc, Strom (Generator,Batteri out/in), 
Öltemp, etc anzeigen.

Wichtig sind eigentlich nur die Anfangskommandos der ersten 200ms, wenn 
das Display initialisiert wird. Die Kommandos danach sind recht 
übersichtlich und regeln nur den Speicher/Pagezugriff des 
LCD-Controllers.

Ich will auch bewusst kein anderes Display einbauen, da es am Ende nicht 
nach Bastelbude aussehen soll :-) Sonst könnte man sich den ganzen 
Aufwand sparen und einfach einen CAN-Receiver + 16x2 Display verbauen

Peter D. schrieb:
> Solche Fragen wurden hier schon öfter gestellt und sämtliche Versuche
> mangels Erfolg bzw. ausufernder Komplexität wieder eingestellt.
>
> Du müßtest alle Kommandos prüfen, ob sie Positionen setzen oder
> beschreiben, die im gesperrten Bereich liegen. Wenn Du nur mitlauschst,
> ist es zu spät, das LCD hat sie dann schon empfangen.
> Du müstest also sämtliche Daten erstmal zwischenspeichern, um zu
> entscheiden, sollen sie weiter gereicht werden oder nicht. Außerdem
> müßtest Du alle globalen Kommandos so umändern, daß sie nur den
> erlaubten Bereich ändern.
> Und Du müßtest Deine eigenen Daten geschickt mit einfädeln, ohne das es
> zu Kollisionen kommt.

Die Daten werden ohne Zwischenkommando seriell durchgeschoben. Das heißt 
insgesamt 1024 Clockcycles am Stück deren Anfang sich ganz leicht über 
die Data/Command-Line erkennen lässt. Ich hätte jetzt vermutet dass es 
reicht die Daten über den MC aufzunehmen, den entsprechenden Bereich zu 
manipulieren und dann wieder rauszugeben? Kommandos sind hier wie gesagt 
nur 3 nötig

Ablauf: Page adress set -> column adress set -> column adress set lower 
bit -> DATA/CMD High -> 1024x Pixel als einzelne ClckCycles.

: Bearbeitet durch User
von Axel R. (axlr)


Lesenswert?

Klingt doch spannend; probier's aus. Radio auf den Basteltisch und los 
geht's ;) Das am Kfz im eingebauten Zustand testen zu wollen, würde ich 
für den Anfang ablehnen.

von Ricardo M. (ricardodidneineleven)


Angehängte Dateien:

Lesenswert?

Axel R. schrieb:
> Klingt doch spannend; probier's aus. Radio auf den Basteltisch und los
> geht's ;) Das am Kfz im eingebauten Zustand testen zu wollen, würde ich
> für den Anfang ablehnen.

Ist schon passiert :D hab mir auch zwei weitere Radios besorgt und die 
Stecker ausgeschlachtet um einen ordentlichen Adapter zwischen Radio und 
Display zu verbauen. Ich häng mal den Saleae Logic Trace mit an und das 
Datenblatt des Controllers, falls es jemanden interessiert :-)

Das ätzende wird wohl eher, dass ich die ganze Bibliothek für Zeichen 
und Buchstaben selbst schreiben/definieren muss, da der Controller keine 
interne hat.
Oder kennt jemand dafür ein existierendes Tool?

: Bearbeitet durch User
von Ron-Hardy G. (ron-hardy)


Lesenswert?

Ricardo M. schrieb:
> 1024x Pixel als einzelne ClckCycles

bei einem 128x16 Display?

von Ricardo M. (ricardodidneineleven)


Lesenswert?

Ron-Hardy G. schrieb:
> Ricardo M. schrieb:
>> 1024x Pixel als einzelne ClckCycles
>
> bei einem 128x16 Display?

Ah upsi, du hast recht. Es sind 1024 Pixel pro Page/Zeile (8x128).

Also ingesamt 2048 die jeweils in 1024er Paketen verschickt werden

: 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.