Forum: Mikrocontroller und Digitale Elektronik LCD Display "abhören"


von Malte I. (maltomat)


Lesenswert?

Hallo,

ich möchte das LCD Display eines (bereits vorhandenen) Gerätes mit
einem ATMega "abhören", also die gerade dargestellten Zeichen
auslesen und über die serielle Schnittstelle weiterleiten. Ich kann
alle Anschlüsse des Displays (Hitachi, 20 Zeichen, eine Zeile, also
Standard) anzapfen. Die Datenleitungen kommen natürlich an einen Port,
aber was ist mit den Anschlüssen Enable, R/W und RS, wie ist da das
Timing? Kann man sowas in der Art sagen wie: wenn RS runter geht liegt
gerade ein gültiges Zeichen am Datenbus an?
Sorry für die Frage, ich könnte das auch durch ausprobieren oder
studieren der entsprechenden Unterlagen rauskriegen. Wenn einer aber
eine schnelle Antwort weiss, würde mir das viel Arbeit ersparen.

Danke schon mal!

von Jan M. (mueschel)


Lesenswert?

Ersetze RS durch Enable und "runter geht" durch "high ist" und dann
dürfte deine Aussage bei den meisten LCDs stimmen (Daten werden meist
gelesen, sobald Enable von high auf low geht). Sicherheit verschafft
hier das Datenblatt zu dem LCD-Controller.

von Malte I. (maltomat)


Lesenswert?

ok, also jedesmal wen Enable high liegt am Datenbus gerade ein neues
Zeichen an? Werde ich mal ausprobieren.
Danke!

von Malte I. (maltomat)


Lesenswert?

geht leider nicht. Ich habe Enable auf INT1 gelegt, dann werden Daten
eingetaktet, allerdings nur Müll. Habe sowohl auf steigende und
fallende Flanke versucht zu triggern, verschiedene Delays eingebaut
aber immer kommen nur wirre Zeichen. Hat jemand ne Idee???

von Andreas W. (andreasw) Benutzerseite


Lesenswert?

Wird das LCD vielleicht im 4-Bit-Modus verwendet?

von Malte I. (maltomat)


Lesenswert?

Habe ich gerade auch schon dran gedacht. Aber dann müssten sich
wenigstens irgendwelche Regelmässigkeiten erkennen lassen. Am Display
wird zB. die Zeit angezeigt und jede Sekunde aktualisiert. Dabei ändert
sich meistens ja nur eine Stelle (die Sekunde), die anderen bleiben
gleich. Die ausgelesenen Daten ändern sich aber immer komplett (beide
Nibbles aller Zeichen).

Hier die entscheidenen Code Fragmente. Ist das alles richtig so?


PORTC=0x00; DDRC=0x00;
GIMSK |= (1 << 7);      //enable INT1
MCUCR |= (1 << 3);  //fallende
MCUCR |= (1 << 2);  //Flanke
sei ();

ISR (INT1_vect)  //Display
{
  data[cnt] = PINC;
  cnt++;
}

main: wenn cnt>15 sende data über UART, cnt=0

von RAM (Gast)


Lesenswert?

Möglicherweise ist die Reaktionszeit einfach zu langsam. Wenn Deine
Interruptroutine aufgerufen wird, sind die mit der steigenden Flanke
von E angelegten Daten schon längst wieder ungültig ...

Das 6800-Interface sieht E als Taktsignal mit einer Frequenz von
üblicherweise 1 MHz. Alle Busaktivitäten geschehen innerhalb eines
Taktzyklus, sowohl ein Schreib-, als auch ein Lesezugriff. Die
eigentliche Datenübertragungsphase geschieht in der Halbperiode des
E-Taktes, wenn E high ist.

Dein AVR müsste es demnach schaffen, innerhalb von weniger als 500 ns
nach der steigenden Flanke von E den Datenbus abzufragen.
Das mag möglich sein, wenn Du die Interruptroutine in Assembler
codierst, aber bei einer in C geschriebenen Routine bezweifle ich
dies.

Obendrein liegen nicht mit jeder Flanke von E gültige Daten an (wenn es
eine echte Implementierung des 6800-Busses ist), das ist, wie eingangs
schon erwähnt ein durchlaufender Takt.
Als Triggererignis solltest Du eine Verknüpfung aus E und /CS
verwenden.

von Malte I. (maltomat)


Lesenswert?

@RAM

Das hört sich interessant an. Bei dem gleichen Gerät zapfe ich nämlich
an anderer Stelle einen anderen Bus an, was zunächst auch nicht
funktionierte. Ich habe dort dann 74HC374 verwendet, um die Daten
hardwareseitig "zwischenzuspeichern", erfolgreich. Fälschlicherweise
dachte ich, dass dies bei nem ollen Display nicht nötig wäre...

Kannst du mir bitte noch erklären, wie ich das mit der Verknüpfung aus
E und C/S machen kann. C/S gibts bei mir nicht. Danke.


PS: im Kommentar zum Code muss en natürlich heissen: steigende Flanke

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.