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!
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.
ok, also jedesmal wen Enable high liegt am Datenbus gerade ein neues Zeichen an? Werde ich mal ausprobieren. Danke!
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???
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
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.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.