LCD

Aus Ethersex_Wiki
Wechseln zu: Navigation, Suche

Diese Seite beschäftigt sich damit ein LCD an die Platine anzuschliessen und zu betreiben.

HD44780

Die folgenden Displays wurden gestestet:

  • Pollin, SC1604A, Bstnr. 120 572 (gestestet von #OR)
  • Pollin, TC1604A-01 Bstnr. 120 628 (getestet von Chefkoch mit I2C) - LCD-Controller SPLC780D
  • Pollin, YL162-90, Bstnr. 120 060 (getestet von SuperRiggi)
  • Pollin, TC1602E-01, Bstnr. 120 420 (getestet von Bitfehler)
  • Solomon, LM1180SYL (getestet von Doozer)
  • Conrad, AV2040, Bstnr. 181657-62, - Controller Type ks0067b auswählen - (getestet von punktl)
  • Bürklin, Peaktech P204A, Bstnr. 72S1170, - Controller ks0067b (getestet von michi)
  • TC1602E-01 (getestet von afloria)
  • Reichelt, Displaytech 162
  • WINTEK WD-C2704M-1HNN (getestet von VBen)
  • SD1602QULB (Datenblatt: [1]) - Controller ks0067b auswählen (getestet: weef)
  • weitere?

Pollin AVR-NET-IO

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:

Ethersex LCD.png

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:

  • make menuconfig
  • Menüpunkg "I/O --->"
  • Untermenu "LCD Displays --->"
  • den Punkt "HD44780 module driver (Character-LCD) --->" aktivieren
  • in selbiges Untermenu abtauchen und noch "Readback Support" aktivieren
  • danach rausgehen, speichern, compilieren, laden

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.

  • netcat 192.168.0.90 2701 aufrufen
  • dann lcd write Hallo eingeben

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!

2-Draht-LCD

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.

I2C-LCD

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

Weitere Spielereien mit dem LCD

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.

  • Unter Temperaturanzeige_mit_TTY findet sich ein kleines Control6-Skript, mit dem man die Messwerte von 1-wire Temperatursensoren mit Hilfe des TTY-Layers auf's Display zaubern kann. --Stella 15:19, 26. Jun. 2009 (UTC)

S1D15G10

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:

  • Epson, S1D15G10, ausgebaut aus Nokia6610 (getestet von veyron)
  • weitere?

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:

Veyrons ethersex S1D15G10.jpg

Bezugsquellen

  • Sparkfun vertreibt das LCD incl. Anschlussplatine
  • In folgenden Nokia Handys wurden diese LCDs verbaut:
    • 6100, 6610, 7210, 7250, und 5100

Andere Webseiten auf denen die Möglichkeiten und Anschluß ersichtlich wird. http://thomaspfeifer.net/nokia_6100_display.htm

Ansteuerung per ECMD

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>'?

S1D13305

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)

Aktivierung

In menuconfig unter

  • I/O ->
  • LCD Displays ->
  • S1D13305 module Driver (GLCD)

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:

  • Text/Grafik gemischt, wobei dann Layer 1 der Textlayer ist Layer 2 der Grafiklayer
  • Nur Grafik, dann sind 3 Grafiklayer verfügbar.

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.

Todo

  • ECMD Unterstützung
  • Grafikbibliothek für einfache Zeichenoperationen (evtl. gemeinsam für alle Displays?)
  • Laden von eigenen Zeichensätzen

Bezugsquellen

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.