Diese Seite beschäftigt sich damit ein LCD an die Platine anzuschliessen und zu betreiben.
Inhaltsverzeichnis |
Die folgenden Displays wurden gestestet:
Da ich ein Pollin Board verwende, hier also die Beschreibung für ein AVR-NET-IO (:biggrin:). Den Anschluss des LCD habe ich von http://www.sprut.de/electronic/lcd/lcd.gif übernommen. Die folgende Grafik zeigt den Anschluss an den Controller:
Wer ein bißchen besser löten kann, benötigt keine Anschlussplatine und kann das Ganze auch direkt auf einen SUB-D Stecker löten, die Stiftnummern stehen in der Grafik dabei.
Bei dem YL162-90 ist zu beachten, dass Vo (Kontrast) nicht mit positiver Spannung anzusteuern ist. Die negative Spannung ist am besten über ein 10kOhm-Potentiometer vom Pin 6 des RS232-Bausteines (Pollin AVR Board) abzugreifen. Bei ca. 5kOhm ist das Display gut zu erkennen.
Danach muss nochmal compiliert werden:
Anmerkung für Anwender die schon länger mit Ethersex arbeiten: Die alte Konfigurationsoption '"Use Port C" ist seit mind. Nov. 2009 nicht mehr im Menü vorhanden. Also manuell in der Konfigurationsdatei des ausgewählten Hardwareprofils (pinning/hardware/...) pinnen:
ifdef(`conf_HD44780', ` pin(HD44780_RS, PC0) pin(HD44780_RW, PC1) pin(HD44780_EN1, PC2) pin(HD44780_D4, PC3) pin(HD44780_D5, PC4) pin(HD44780_D6, PC5) pin(HD44780_D7, PC6) ')
Mehr Info dazu auch unter Pins_in_Ethersex_definieren und Ethersex_Hardware_hinzufügen.
Das LCD macht nach dem Einschalten erstmal gar nix. Zum Testen geht am besten der ECMD.
Man sollte jetzt etwas auf dem LCD lesen können.
In Programmen kann man das LCD z.B. so nutzen:
fputs ("Hallo", lcd);
Oder für Texte, die auch Variablen enthalten:
char buffer [20]; sprintf (buffer,"%2u:%04X:%04X:%02X", IRMP_PROTOCOL, IRMP_ADDRESS, IRMP_COMMAND, IRMP_FLAGS); fputs (buffer, lcd);
Etwas ab einer bestimmten Position schreiben glückt mit:
hd44780_goto(zeile,spalte);
Achtung: die Zählung der Zeilen und Spalten beginnt hier mit 0!
Anbindung eines HD44780 (kompatiblen) LCD über ein Schieberegister. Benötigt nur zwei Portpins am Mikrocontroller.
Aufbau und Ansteuerung: CC2 2-Draht-LCD Aufbau auf Streifenrasterplatine (Projekte -> 2-Draht-LCD)
Hardware-Pinning anpassen:
ifdef(`HD44780_2WIRE', ` pin(HD44780_2WIRE_D, PC0) pin(HD44780_2WIRE_CLK, PC1) ')
HD474780 Unterstützung in menuconfig aktivieren und connection-type "2WIRE(74hct4094)" wählen.
Anbindung eines HD44780 (kompatiblen) LCD über ein I2C Portexpander (z.B. Pollin LCD I2C Adapterboard). Benötigt nur die zwei Portpins des I2C-Bus des Mikrocontroller.
Wenn man die I2C Adresse noch nicht weis, kann man sich eine vorab Firmware mit I2c Mastersupport, I2C Read/Write Support sowie I2C Detect Support kompilieren.
I/O --->
I2C Master Support (EXPERIMENTAL) --->
[*] I2C detection support
[*] I2C generic read/write support
[*] I2C PCF8574X Port extention
(Das PCF Modul wird später benötigt)
Danach kann man über das ECMD Komando "i2c detect" einen I2C Slave Suchlauf starten.
z.B. über den Webserver:
http://192.168.0.90/ecmd?i2c+detect
detected at: 0x21 (33) OK
Woraus wir die Adresse 33 ablesen können.
Diese wird benötigt um das HD44780 Modul einzustellen. Dazu wird das HD44780 Displaymodul aktiviert. Dann muss es auf Connection Type: I2C umgestellt werden und die I2C Adresse eingetragen werden. Readback Support dient der schnelleren Ansteuerung des Displays und Invert Backlight switch ist bedingt duch die Emitterschaltung der Hintergrundbeleuchtungsansteuerung.
I/O --->
LCD Displays --->
[*] HD44780 module driver (Character-LCD) --->
(Original) Controller type
(I2C(pcf8574)) Connection type
[*] Readback support
(33) PCF8574 Address
[*] Invert Backlight switch
Danach kann ganz normal kompiliert werden und über ECMD LCD Komandos das Display gesteuert werden. (s.o.)
Leider habe ich noch nicht rausbekommen, wie man zb. die 1wire Temperatursensoren oder die ADC oder die Ports möglichst elegant auf das LCD bekommt :-). Aber vielleicht hat ja von Euch einer eine Idee.
Diesen LCDisplay Controller findet man in diversen Mobiltelefonen. Ich habe das LCDisplay aus einem Nokia6610 ausgebaut.
Einige Online Portale/Händler bieten es auch incl. Anschlussplatine an.
Die folgenden Displays wurden getestet:
Das 130x130 1.5" FarbLCD mit dem integrierten Controller S1D15G10 wird zB. so angeschlossen:
RESET, PB0 DATA, SPI_MOSI CLK, SPI_SCK CS, PD7
Beispiel für Atmega644: pinning/hardware/etherrape.m4
ifdef(`conf_S1D15G10', `dnl /* port config for s1d15g10 lcd */ pin(S1D15G10_CS, PA3, OUTPUT) pin(S1D15G10_RESET, PA1, OUTPUT) ')
Da die Daten via SPI generiert werden, können nur die Pins für RESET und ChipSelect frei gewählt werden.
Die Stromversorgung für den LCDController sollte nicht über 4V liefern! Die Pins sollten 3.6V nicht übersteigen! Die Hintergrundbeleuchtung braucht 6V - 7V.
Da der AVR meines etherrapes mit 5V läuft, hab ich jeweils eine 3V6 Zenerdiode und einen 1k5Ohm Pullup zwischen AVR und LCD gehangen.
In menuconfig:
│ │ Load a Default Configuration ---> │ │ General Setup ---> │ │ Network protocols ---> │ │ I/O support ---> ... │ │ [*] S1D15G10 module driver (130x130-R/G/B-LCD)
Auf dem LCD wird dann ein bisschen farbiger Text auf schwarzem Hintergrund und das E-Sex Logo angezeigt.
Ist Debug und ECMD via UART aktiv, wird dies auch auf dem LCD ausgeben.
Das sieht dann so aus:
Andere Webseiten auf denen die Möglichkeiten und Anschluß ersichtlich wird. http://thomaspfeifer.net/nokia_6100_display.htm
Folgende Befehle sind für's LCD vorhanden:
| Kommando | Funktion |
|---|---|
| lcd char N D1 D2 D3 D4 D5 D6 D7 D8 | Benutzer-definierbares Zeichen N erstellen mit den Daten D1..D8 (in Hex) |
| lcd clear ZEILE | Lösche ZEILE (0..3) oder das ganze Display (wenn ohne Parameter) |
| lcd goto ZEILE SPALTE | Setze den Cursor auf ZEILE und SPALTE (Ursprung ist 0/0) |
| lcd reinit CURSOR BLINK | Reinitialisiere das Display, schalte CURSOR aus oder ein (0 oder 1) und ob der Cursor BLINKen soll |
| lcd shift RICHTUNG | Schiebe die ganze Anzeige in RICHTUNG (entweder 'left' oder 'right') |
| lcd write TEXT | Schreibe TEXT an die momentane Cursorposition |
Diese Tabelle wurde von Ecmd Reference übernommen und übersetzt.
Anmerkung: Das Zeichen-definieren scheint zu funktionieren, jedenfalls wird "OK" zurückgegeben. Aber wie rufe ich das Zeichen auf, d.h. wie übergebe ich 'lcd write <hex00>'?
Dies ist ein schon etwas älterer schwarz/weiss LCD Controller von Epson (Nachfolger: S1D13700). Link zum Datenblatt
Der Controller kann Displays bis zu einer Grösse von 640*256 Pixel ansteuern und bis zu 3 Textlayer, 3 Grafiklayer oder Text/Grafiklayer gemischt anzeigen. Der Controller hat einen eingebauten Zeichensatz, es ist aber auch möglich eigene Zeichensätze ins RAM des Controllers zu laden (zur Zeit noch nicht unterstützt)
In menuconfig unter
Hier kann jetzt der Display modus eingestellt werden, die Displaygrösse und ob das Backlight schaltbar ist. Die Einstellung von XTAL und Refresh rate muss an den LCD-Controller und das Display angepasst werden. Normalerweise wird der LCD-Controller mit 10MHz betrieben, die von Epson empfohlene Refreshrate ist 75 Hz.
Die Implementierung des Treibers unterstützt 2 Modi:
Pinning: (an eigene HW anpassen!):
/* ports the s1d13305 is attached to */
ifdef(`conf_S1D13305', `dnl
S1D13305_DATA_PORT(A)
pin(S1D13305_CS, PC6, OUTPUT)
pin(S1D13305_RES, PD4, OUTPUT)
pin(S1D13305_A0, PD5, OUTPUT)
pin(S1D13305_RD, PD6, OUTPUT)
pin(S1D13305_WR, PD7, OUTPUT)
ifdef(`conf_LCD_BACKLIGHT', `dnl
pin(LCD_BACKLIGHT, PC7, OUTPUT)
')dnl
')dnl
Nach der Initialisierung sollte das Display leer sein und nicht flimmern. Man kann jetzt z.b. mit
lcd_writeTextPos(5,5,"Hallo Welt", 10);
einen Text auf dem Display ausgeben.
Wenn man eine Grafik ausgeben möchte, muss man im eigenen Code LCD_DRAWBITMAP_USED definieren und lcd_getBMPData implementieren. Beispiel:
#define LCD_DRAWBITMAP_USED
uint8_t lcd_getBMPData(uint16_t address_ui16)
{
return pgm_read_byte(yourBMP+address_ui16);
}
Dann ruft man lcd_drawBitmap auf. Z.b. so:
lcd_drawBitmap(LCD_LAYER_2, 10, 10, 20, 30);
Zu beachten ist hier, dass der vierte Parameter die Breite der Bitmap in BYTE erwartet, nicht in Pixeln! lcd_DrawBitmap ruft jetzt lcd_getBMPData auf um die zu zeichnende Bitmap zu holen.
Eine Bezugsquelle für Platinen ist z.b. Mark de Jong Displays und die passenden Flachkabelstecker bekommt man gelegtlich bei Pollin oder bei Wallbraun-Electronics im Shop.