| Projekte | |
internes LCD (16x2)
Warnung! Dieses Display wird
direkt an den Prozessorbus des RoboInterface angeschlossen.
Fehler im Aufbau des Displays können das RoboInterface
dauerhaft beschädigen, ferner erlöscht
die Garantie.
Ich übernehme keine Haftung für Defekte, die durch die hier beschriebenen Schaltungen entstehen könnten.
Als ich bei www.reichelt.de den Katalog durchstöberte, fand ich durch Zufall ein LCD, das exakt in die Lücke zwischen Funk-Modul und USB-Buchse passte. Nun fehlte nur noch eines, die Ansteuerung. Zwar sind Steckplätze vorhanden, jedoch gab es zunächst keine Schaltpläne / Informationen, um diese zu nutzen. Doch auch hier kam der Zufall zu Hilfe, ein Fan hat durch reverse engineering einen Schaltplan des Interface erstellt (vielen Dank an W.Hobelbrecht an dieser Stelle, ohne dessen Arbeit dieses Projekt nicht möglich gewesen wäre).
Da sich auf den Steckplätzen der Datenbus des Prozessors befindet, schien es mir sinnvoll, das LCD ohne einen zusätzlichen Controller zu betreiben. Dies setzt voraus, dass alle Steuercodes, die das LCD benötigt, direkt vom Prozessor des RoboInterface generiert werden müssen. Da solche Funktionen nicht in RoboPro implementiert sind, kann dieses LCD leider nicht mit RoboPro betrieben werden, das LCD kann entweder per C mit dem Renesas-Compiler oder per Basic mit dem Roboint-Basic Compiler angesprochen werden.
Da dies keine Anleitung
für Anfänger sein soll und kann, gibt es nur den
Schaltplan / Layout und ein paar Codeschnipsel. Ich kann leider aus
Zeitgründen auch keinen Support bieten - wenn die hier
veröffentlichten Informationen nicht ausreichen, ist dies ein
Zeichen dafür, besser die Finger von solchen Basteleien zu
lassen... sorry.
Für den Anfang besser geeignet sind die externen Displays,
weil diese bei einem fehlerhaften Aufbau nicht gleich das ganze
Interface ins Grab ziehen
Der Prozessorbus des µControllers ist leider einen Tick zu schnell für das LCD, so dass etwas zusätzliche Beschaltung hinzukommt. Im wesentlichen besteht diese aus zwei Latches, um Daten- und Adressbus zwischenzuspeichern und einer Verzögerung, aufgebaut mit Nicht-Gattern (ich hatte gerade einen 74HC04 zur Hand, man kann es auch mit einem Monoflop lösen). Durch diese Beschaltung ist es leider nicht mehr möglich, das Busy-Flag des LCD abzufragen, man muss also nach jedem Datentransfer eine gewisse Zeit warten, bis das LCD wieder bereit ist. Bei Basic muss sich der Anwender nicht um diese Einschränkung kümmern, dort wird das LCD innerhalb eines 1ms - Zeitrasters aktualisiert.

Bild 1: LCD eingebaut ins Robo Interface. Hier noch der Prototyp auf Lochraster-Platine.


Bild 2: Das LCD-Modul auf geätzter Platine Bild 3: Die Rückseite der Platine (Version 1.0)
Die obigen Bilder zeigen noch eine Platine einer älteren Generation, bei Gelegenheit wird das aktualisiert.| ID | Bezeichnung | Reichelt-Bestellnummer | Anzahl |
| C1,C2 | Elko 1µF (Subminiatur) | SM 1,0 /63 RAD | 2 |
| C3,C4,C5 | Kondensator 100nF | Z5U-2,5 100N | 3 |
| C6 | Kondensator 27pF | KERKO 27P | 1 |
| IC1 | 74HC574 | 74HC 574 | 1 |
| IC2 | 74HC273 | 74HC 273 | 1 |
| IC3 | 74HC04 | 74HC 04 | 1 |
| D1 | Diode | 1N 4148 | 1 |
| R1,R2 | Widerstand 120R | 1/4W 120 | 2 |
| R3 | Widerstand 10K | 1/4W 10K | 1 |
| LCD (*) | EA DOGM162E-A | 1 | |
| Beleuchtung(*) | EA LED55X31-G | 1 | |
| Buchsenleiste (**) | BL 2X25G8 2,54 | 1 | |
| Platinenmaterial | |||
Software
1. Ansteuerung in C
Durch
die Anbindung an den Prozessor-Bus des Robo-Interface werden die
Register des LCD im Adressraum des µC eingeblendet. Das LCD ist
an D0..D7 angeschlossen, es werden also nur Byte-Zugriffe
benötigt. Die vom RoboInterface bereitgestellte Select-Leitung
IOSEL3 wird ab einer
Adresse 0C3000H angesprochen. Da die Adressleitung A1 mit der
RS-Leitung des LCD verbunden ist, können Daten und Befehle einfach
durch ansprechen unterschiedlicher Adressen ausgewählt werden.
Ein zusätzliches Feature ist die Möglichkeit, die Beleuchtung
des LCD ein- und abzuschalten. Diese Funktion wird durch die
Adressleitung A2 realisiert, weshalb die Ansteuerung unterschiedlicher
Adressen notwendig ist.
Im Anschluß ein kurzer Code-Auschnitt für die grundlegendsten Funktionen.
#pragma ADDRESS display_adress 0C3000H;
unsigned char far display_adress;
unsigned char LcdLight;
void lcd_command (UCHAR command)
{
volatile UCHAR far *pointer;
pointer = &display_adress;
if (LcdLight == 0)
*(pointer) = command;
else
*(pointer + 4) = command;
}
void lcd_data (UCHAR data)
{
volatile UCHAR far *pointer;
pointer = &display_adress;
if (LcdLight == 0)
*(pointer+2) = data;
else
*(pointer + 2 + 4) = data;
}
void lcd_init (void)
{
lcd_command (0x39);
FtDelay(1);
lcd_command (0x14);
FtDelay(1);
lcd_command (0x55);
FtDelay(1);
lcd_command (0x6D);
FtDelay(1);
lcd_command (0x78);
FtDelay(210);
lcd_command (0x0C);
FtDelay(1);
lcd_command (0x01);
FtDelay(1);
lcd_command (0x06);
FtDelay(100);
LcdLight = 1;
}
Nach Aufruf der Funktion lcd_init() kann das LCD mit den Funktionen lcd_command() und lcd_data() angesprochen werden. Weitergehende Informationen sind im Datenblatt des LCD zu finden.
2. Ansteuerung in BASIC
Mit dem Basic-Compiler ist es wesentlich einfacher, das LCD anzusteuern, hierzu wurde der Befehl lcdprint implementiert. Informationen und Beispiele hierzu sind in der Anleitung des Basic-Compilers zu finden.
| Projekte | |