LCD display documentatie

9 antwoorden [Laatste bericht]
jdemeyer
User offline. Last seen 26 weken 2 dagen ago. Offline
Lid sinds: 2009-10-28

Ik vind op jullie website bijna niets van documentatie terug over het LCD-scherm, enkel in http://www.dwengo.org/nl/tutorials/lcd wordt er iets over de LCD gezegd. Je zou op zijn minst een link moeten maken naar het datasheet van het LCD-scherm.

Michiel
User offline. Last seen 4 weken 7 uur ago. Offline
Lid sinds: 2009-04-17

Hallo Jeroen

Bedankt om dit te melden, de specificaties van het LCD-display zijn inderdaad niet vermeld op de site, we maken dit snel in orde. Het LCD-display is een standaard HD44780-gebaseerd 16x2 karakterdisplay met achtergrondverlichting. Dit is een van de meest gebruikte displays voor allerlei projecten op het internet. De pinout van deze displays is ook "gestandaardiseerd":

    1       Vcc
    2       GND
    3       V0      Contrast adjustment
    4       RS      Register select: low = instruction, high = data
    5       R/W     low = write, high = read
    6       E       Enable (active high)
    7       DB0     Data-bus bit 0 (not used in 4-bit mode)
    8       DB1     Data-bus bit 1 (not used in 4-bit mode)
    9       DB2     Data-bus bit 2 (not used in 4-bit mode)
    10      DB3     Data-bus bit 3 (not used in 4-bit mode)
    11      DB4     Data-bus bit 4
    12      DB5     Data-bus bit 5
    13      DB6     Data-bus bit 6
    14      DB7     Data-bus bit 7
    15      LED+    Positive backlight supply (if used)
    16      LED-    Negative backlight supply (if used)

Om het voor jullie gemakkelijker te maken, hebben we de bibliotheek "lcd.h" geschreven die ervoor zorgt dat de diverse signalen reeds met de correcte timing worden aangestuurd. Tekst op het display plaatsen is daardoor zeer eenvoudig geworden via enkele intuïtieve functies, zoals in de lcd-tutorial wordt uitgelegd.

jdemeyer
User offline. Last seen 26 weken 2 dagen ago. Offline
Lid sinds: 2009-10-28

Ik zoek eigenlijk nog informatie over de timing van het LCD-scherm. In jullie lcd.c staan bijvoorbeeld een heleboel lange delays. Ten eerste, zijn die echt nodig; ten tweede waarom zijn bijna alle delays in lcd.c fout?

Bijvoorbeeld lijn 91:
Delay1KTCYx(25); // TCx = 200ns, wait 4 ms
Dit moet zijn:
Delay1KTCYx(25); // TCY = 83.3ns, wait 2.08ms
Ofwel:
Delay1KTCYx(48); // TCY = 83.3ns, wait 4ms
En zelfs als je een kloksnelheid aanneemt van 20MHz is het nog fout, want dan zou het moeten zijn:
Delay1KTCYx(25); // TCY = 200ns, wait 5 ms

Francis
User offline. Last seen 2 uur 40 min ago. Offline
Lid sinds: 2009-04-16

We zijn er ons van bewust dat de delays in de bibliotheek van het LCD-scherm erg conservatief zijn. Momenteel zijn we aan het werken aan een vernieuwde, handige bibliotheek voor het Dwengo-bord. De bibliotheek voor het LCD-scherm heeft hierbij hoogste prioriteit.
De fouten in de commentaar van de LCD-bibliotheek zijn ontstaan bij de overgang van het oude bord naar de huidige versie van het Dwengo-bord. Hoewel deze bibliotheek de gebruiker van de juiste functionaliteit voorziet (het tonen van karakters, tekst en getallen op het scherm) is er gekozen om met een nieuwe bibliotheek te beginnen met beter gekozen functies en striktere timings. De oude bibliotheek (met conservatieve delays en fouten in de commentaar) werd toch online gezet om gebruikers de mogelijkheid te geven nu al het LCD-scherm te gebruiken. Niettemin heeft het LCD-scherm vrij lange delays nodig om te kunnen werken.

Wat betreft de informatie over de timings van het LCD-scherm kan je je baseren op de informatie die er beschikbaar is over HD44780 compatibele LCD-schermen zoals de datasheet van de HD44780 display controller.

jdemeyer
User offline. Last seen 26 weken 2 dagen ago. Offline
Lid sinds: 2009-10-28

Volgens de datasheet waarnaar je verwijst, is het mogelijk om een "busy flag" te lezen van de HD44780. Ik denk dat het beter is om die busy flag te gebruiken in plaats van een arbitraire delay. Volgens de datasheet op p.52 moet je trouwens de E lijn 230ns hoog houden, dus de lijnen

  1. LCD_EN_PIN = 1; // Clock in the command
  2. LCD_EN_PIN = 0;

lijken me fout. Er moeten nog minstens 2 klokcycles tussen zitten.

Aangezien de HD44780 de data inleest op de 1->0 overgang lijkt het me trouwens logischer om als volgt te werken:
1. Zet RS (RE0) en R/W (RE1) pinnen van de LCD goed
2. Zet E (RE2) hoog
3. Bewaar de oude data pinnen
4. Zet de data pinnen goed
5. Zet E (RE2) laag
6. Zet de data pinnen terug

jdemeyer
User offline. Last seen 26 weken 2 dagen ago. Offline
Lid sinds: 2009-10-28

Bij nader inzien lukt het inlezen van de "busy flag" niet door de LEDs. Als je JP3-1 uittrekt werkt het wel. Dus toch maar delays :-). (als jullie ooit een versie 1.1 van het Dwengo-bord maken: zet misschien een buffer of latch tussen de PIC en de LEDs.)
Ik ben van plan om een LCD-display bibliotheek te schrijven die gebruik maakt van timer-interrupts in plaats van delays. Zo kan een programma nog iets nuttigs doen terwijl het op de LCD wacht.

Peter
User offline. Last seen 8 weken 6 dagen ago. Offline
Lid sinds: 2009-04-16

Leuk dat je zelf een alternatieve LCD-bibliotheek wil schrijven op basis van timer-interrupts! Voor toepassingen waarbij snelheid te belangrijk is even op die LCD te wachten, is dat zeker interessant ... Veel succes alvast en laat ons weten of het gelukt is!

Michiel
User offline. Last seen 4 weken 7 uur ago. Offline
Lid sinds: 2009-04-17

In de datasheet staat dat wanneer RS=0 en R/W= 1, de 'busy flag' rechtstreeks wordt uitgevoerd naar DB7 (die dan als output staat geschakeld). De 'busy flag' is 1 wanneer de HD44780 bezig is, en wordt daarna laag. Volgens de datasheet is de uitgangstrap van poort D een push-pull trap, en zou dus zowel actief omhoog als omlaag moeten kunnen trekken. De LEDs vereisen dat de display-driver een kleine 10mA moet kunnen leveren om de pin hoog te kunnen trekken. Ik vind in de datasheet echter niet terug wat de maximale stroom is die deze push-pull trap kan leveren. We hebben wel al gemerkt dat het display soms de LEDs doet branden als het display niet correct geinitialiseerd wordt, en de driver dus wel degelijk in staat is de uitgang hoog te trekken. In principe zou het dus moeten werken, maar we hebben dit zelf nog niet getest, dus we kunnen dit niet garanderen.

In het andere geval zul je inderdaad JP3-1 moeten verwijderen. Maar doordat we de LEDs in 2 groepen hebben opgesplitst, zal je hierdoor dus nog steeds 4 leds kunnen gebruiken.

Een interrupt gestuurde LCD-display aansturing kan er inderdaad voor zorgen dat de PIC minder cycli verliest bij het communiceren met het display. Niet iedereen zal dit echter wensen, bijvoorbeeld als men de timer-interrupts reeds in gebruik heeft voor andere doeleinden en de rekentijd van de PIC verder voldoende is. Maar voor andere toepassingen is dit zeker en vast een prima idee!

jdemeyer
User offline. Last seen 26 weken 2 dagen ago. Offline
Lid sinds: 2009-10-28

Snel even gemeten met een multimeter: de LCD-controller kan die RD-ingangen maar tot 2.55V brengen en volgens de datasheet van de PIC zijn de ingangen van port D schmitt-triggers die 4.0V nodig hebben om "hoog" te komen. Het lukt dus niet...

Het is wel opvallend dat die LEDs toch krachtig lijken te branden bij 2.5V.

Michiel
User offline. Last seen 4 weken 7 uur ago. Offline
Lid sinds: 2009-04-17

Hallo Jeroen

Dan zal het inderdaad niet lukken met de LEDs ingeschakeld. Gelukkig kunnen de LEDs dus uitgeschakeld worden via jumpers. Bij het ontwerpen van een dergelijk bordje, moet je altijd afwegingen maken tussen complexiteit, veelzijdigheid en kostprijs.

Over een rode LED staat normaalgezien een spanning van ongeveer 1.5V. Dat wil zeggen dat er over de weerstand nog een spanning van pakweg 1V staat. Gezien de weerstand 470 ohm is, betekent dit dat de display-uitgangstrap in staat is van pakweg 2mA (1/470) te leveren. Dit is voldoende om een led reeds zichtbaar te laten oplichten.