LCD 40X04 text

Dit LCD schermpje wordt aangeleverd zonder ook maar 1 enkele instructie. Het is dan ook vaag om welk type het exact gaat. Het blijkt in ieder geval een type L4044 van Seiko Instruments Inc. (SII) te zijn. Deze bestaat in 4 smaken:

De type nummering is niet willekeurig, maar volgens een systeem. Gezien de specificaties is het in ieder geval geen LED type, want die zijn 1 cm dik en deze lcd is slechts 4 mm dik. Verder wordt er een DC/AC INV 5V inverter meegeleverd. De specificaties suggereren bij de opgave van het stroomverbruik dat een inverter uitsluitend nodig is voor het EL back-light type, dus ga ik er maar van uit dat de L4044 21J000 het juiste type is.

Voor de operating instructions maakt het niet uit welk type het is, omdat die site voor alle types gelijk is. Ook voor de pinout lijkt er geen verschil te bestaan tussen de 4 genoemde smaken.

De inverter heeft een 5Vdc ingangsspanning nodig en levert een uitgangsspanning van 90Vac, met een frequentie van 330HZ. Deze inverter is op een apart printje gemonteerd. Dit zal wel gedaan zijn omdat hij veel ruis afgeeft en dus niet in de buurt van ttl electronica mag worden ingebouwd. Ook bij dit printje word niets meegeleverd en bovendien staat er niets op het printje dat een houvast zou kunnen geven om een type te bepalen. Aan de andere kant bestaat er slechts 1 geschikte inverter voor de L4044 serie, dus ik ga er maar van uit dat de juiste inverter is meegeleverd. Er worden dus ook geen aansluitgegevens meegeleverd. Verder heeft dit printje de vervelende eigenschap dat hij dusdanig klein is dat hij nergens direct op gemonteerd kan worden.

Als enige mogelijkheid om de inverter aan te sluiten blijft eigenlijk over pin 17 (Va = Anode) en pin 18 (Vc = Cathode). Als opmerking staat erbij dat "LED powered through pins 17 & 18". Dit forum suggereert dat de anode en cathode inderdaad voor het backlit gedeelte zorgen. Ook deze site over EL suggereert dat een inverter uitsluitend nodig is voor de EL types. Volgens dit forum is de kathode negatief en de anode is positief, volgens het ezelsbruggentje: KNAP. Overigens lijkt het er op dat het schermpje ook zal werken zonder het backlit, wat ook logisch lijkt gezien de beperkte levensduur van EL backlighting (3000 uur bij halve sterkte). Dus eerst testen zonder inverter.

Om de LCD makkelijk te kunnen aansluiten op diverse microcontrollers heb ik een verloopstukje in elkaar gezet.

De eerste test geeft een probleem, want de EL achtergrondverlichting doet het niet. Ondanks dat alles juist lijkt aangesloten. Uitzoeken.

Het Futurlec controlboard kan slechts de bovenste regels aansturen. Dit werkt op zich goed. De onderste 2 regels lukt echter niet, omdat dit board slechts 1 enable pin heeft aangesloten. En de onderste 2 regels hebben een tweede enable pin nodig. Er zitten namelijk 2 aparte processoren op deze lcd. Om de lcd aan de STK500 te kunnen testen moet ik eerst een contrast regelaar maken op het verloopstukje. Hiervoor is uitsluitend een 10k instelpotmetertje nodig.

De timing is belangrijk bij de aansturing. Het basisprogramma voor de aansturing van de LCD wordt meegeleverd met het Futurlec control board op de bijbehorende CD. Het programma is geschikt voor 16 mHz systemen en niet erg elegant. Er zijn diverse real-time vertragingen nodig. De berekeningen zijn als volgt: cycles=tijd*freqentie, tijd=cycles/frequentie en frequentie=cycles/tijd.

Tijd Gebruik Fut32
>= 15 msec na het opstarten 255
>= 4,1 msec in de reset sequentie 86
>= 1,64 msec display clear 33
>= 100 ?sec in de reset sequentie 255
>= 40 ?sec standaard schrijftijd 224
>= 1 ?sec standaard tussen eerste en tweede nibble 4

Een vreemd verhaal is dat de 2e regel per display het nu niet doet. Het lijkt er op dat de display kapot is, of fout aangesloten. Eigenlijk zou de tekst door moeten lopen, maar dat doet hij niet. De display is niet kapot en er lijkt zich ook geen kortsluiting te bevinden in de kabel. Dat betekent toch dat het nog steeds een timing probleem is. De initialisatie lijkt niet juist te verlopen. Na een reset is het gedrag ook verschillend. De vraag is nu wat de juiste timing is: de 16 mHz van het Futurlec ATmega32 controlboard of de 3,69 mHz van de STK500. Bij narekenen lijken ze geen van beiden te kloppen. Dan lijkt het er bijvoorbeeld op dat het Futurlec board loopt op ong. 11 mHz. Dus beduidend langzamer dan aangegeven. Maar waar komt dit vandaan? En wat betekent dit voor de ATmega8 op een STK500. Hoe snel is die? En gelden die timingswaardes dan ook voor een AT90S8515? zou eigenlijk wel moeten indien ze met dezelfde instructies kunnen runnen? of gaan ze toch weer anders met hun timing om? Het meest likely is dat er een timingfout zit in het versturen van 1 byte, zowel instructie alsook data!

Dit interne Fuses / RC oscilator lijkt gefused op 1 mHz en niet op een externe waarde. De volgende test is dus op 1 mHz en dat is aanzienlijk langzamer dan de 3,69 dan die eerst werd verondersteld. Kijken of het nu wel goed gaat. Alle timers worden nogmaals aangepast, betekenende dat ze kleiner worden omdat de controller langzamer wordt. Maar dit lijkt geen verschil te maken. Timers zover terugaangepast dat het lijkt alsof de processor op 500kHz loopt. Nog steeds dezelfde fout. Dus kennelijk loopt hij erg langzaam? Of ik ga de hele tijd al te snel! Beide opties nogmaals proberen. Het probleem lijkt te zijn dat de initialisatie niet goed gebeurd, doordat er 0x30 ipv 0x33 wordt uitgegeven in de 4 bits communicatie.

Het timer probleem is inmiddels opgelost en de display heeft een eigen ATmega8 als driver gekregen. Deze stuurt hem bij 16 mHz aan met 8 bits databreedte. Hierdoor kan hij als TWI device worden gebruikt binnen mijn robots. Hij is dus nu veel meer universeel toepasbaar. Zo wordt de display continu ververst vanuit het SRAM. De eerste display wordt vanuit het EEPROM naar het SRAM gecopieerd tijdens het opstarten. Vervolgens kan de LCD zelf een klok uitlezen en kunnen andere TWI devices ook data pushen. Het pushen van data is inmiddels gelukt, maar het blijkt dan wel noodzakelijk dat de LCD driver continu op afwachten staat. Daardoor kan hij zelf geen klok meer bijhouden bijvoorbeeld, of data pushen naar het datalog geheugen. Als oplossing een soort mengvorm genomen, waarbij een timer op de achtergrond x keer per seconde een interrupt veroorzaakt die een sequentie veroorzaakt van diverse programmas, waaronder het lezen van de klok en het verversen van de display en het wegschrijven van de logdata. Deze interupt moet zo min mogelijk worden veroorzaakt, omdat tijdens het runnen de display niet beschikbaar is als TWI-slave en de diverse sensoren dus niet hun data kwijt kunnen. Het onderstaande tabelletje geldt voor een systeem dat loopt op 16 mHz en slechts meet t.o.v. de rijrichting:

Resolutie Snelheid Metingen per seconde Cycles
5 cm 0,18 km/u 1 16.000.000
10 cm 5 km/u 13,88 1.151.079

Ik heb op dit moment een conflict voor de LCD controller tussen het wachten als slave en het tijd displayen als master. De bedoeling is dat de display controller normaalgesproken als slave staat te wachten (kan dit met een interrupt?) maar op vaste momenten de tijd uitleest en data wegschrijft. Het op deze manier omschakelen lijkt echter een probleem te veroorzaken op de TWI bus. Dat is jammer, want op deze wijze zou er optimaal gebruik worden gemaakt van de ATmega8 LCD controller in dit project. Misschien is het verstandiger om deze controller geheel als slave in te richten en enkel via commando?s meer specifieke functies te laten uitvoeren. Heeft het logische waarde om te proberen een slave ook tegelijkertijd via een interrupt als master te laten functioneren? Heeft het praktische waarde, of is het sowieso verstandiger om een LCD als slave in te richten? Hoe geldt dit in zijn algemeenheid? Is hier een filosofische opmerking van toepassing? Kennelijk zit hier ook een fout van de ATmega32 master in, want de tijd wordt pas verversd als de reset wordt ingedrukt en werkt verder zolang de reset ingedrukt wordt gehouden. Dat betekent dat de ATmega32 de TWI-bus bezet houdt! Het lijkt er op dat TWI master en slave niet echt eenvoudig door elkaar gebruikt kan worden door 1 device. Technisch is het allemaal denkbaar, maar praktisch mag hij echt maar met 1 functie tegelijk bezig zijn. Dit heeft slechts gedeeltelijk te maken met het feit dat de bus natuurlijk ook door derden bestuurd wordt. Het heeft namelijk ook te maken met het feit dat 1 device weliswaar beide states aan kan nemen, maar dat dit dan ook volstrekt gescheiden functies moeten zijn. Kortom, maak de LCD controller geheel slave en wat zijn de nadelen hiervan? Overigens kan het ook worden veroorzaakt doordat de protocollen op dit moment nog onvolledig zijn geimplementeerd.

 

  Dit verloopblokje is bedoeld voor dit LCD scherm.

Een lcd scherm trekt redelijk veel stroom, dus het is verstandig om deze rechtstreeks op de voeding aan te sluiten en niet via een processorboard. Verder heeft het lcd-scherm een 20-polige connector, terwijl het ATmega32 controlboard een 16-polige connector heeft en de STK-500 10-polige connectors heeft. Verder moet de inverter ook nog ergens zijn plaats krijgen. Kortom tijd om een verloop stekker blokje te maken, zodat de LCD op iedere microcontroller kan worden aangesloten.

Bij de aansluiting zal er rekening mee moeten worden gehouden dat deze LCD niet serieel maar enkel parallel kan worden aangestuurd. Hierbij is er keuze tussen 4 bits breedte en 8 bits breedte. Ik kies voor 4 bits breedte omdat de snelheid van aansturing in mijn eindconcept niets uitmaakt omdat de lcd toch een eigen microcontroller krijgt, tezamen met het toetsenbord indien de timing dat toelaat. Aan de andere kant zou dit pleiten voor een 8-bits breedte omdat er anders onaangesloten pennen overblijven en dat is helemaal zonde, want dan kan beter de extra snelheid worden benut.

Een verdere bijzonderheid van deze LCD is dat het eigenlijk twee 2X20 lcd-schermen zijn. Dat wil zeggen dat er 2 enable lijnen nodig zijn: E1 en E2.

 


De pinbelegging van de ATmega32 controlboard lcd display connector is als volgt:

?___________________________________
| 2 | 4 | 6 | 8 | 10 | 12 | 14 | 16 |
|---|---|---|---|----|----|----|----|
| 1 | 3 | 5 | 7 |? 9 | 11 | 13 | 15 |
|____________--------_______________|

Pin Naam Aansluiting Kleur PortC Kleur
1 Vcc + 5 Vdc nvt PC0 paars
2 Gnd aarde zwart Gnd zwart
3 RS PC2 geel PC1 oranje
4 VO contrast via potmeter nvt Gnd nvt
5 E PC3 oranje PC2 blauw
6 RW Gnd? grijs Gnd nvt
7 D1 Gnd nvt PC3 bruin
8 D0 Gnd nvt Gnd nvt
9 D3 Gnd nvt PC4 grijs
10 D2 PC4 nvt Gnd nvt
11 D5 PC5 paars PC5 groen
12 D4 PC6 blauw Gnd nvt
13 D7 PC7 wit PC6 wit
14 D6 PC8 groen Gnd nvt
15 BL- Gnd nvt PC7 geel
16 BL+ +5 Vdc via pullup weerstand nvt Vcc +5 Vdc  

De LCD connector is 20-polig, maar daarvan worden er slechts 18 gebruikt. De pinbelegging van de LCD connector is als volgt:

?_____________________________________________
| 18 | 16 | 14 | 12 | 10 | 8 | 6 | 4 | 2 |n.a.|
|----|----|----|----|----|---|---|---|---|----|
| 17 | 15 | 13 | 11 | ?9 | 7 | 5 | 3 | 1 |n.a.|
|__________________----------_________________|

Pin Naam Functie Pin Fut Kleur PortC Kleur
1 DB7 Data bus 13 wit PC7 geel
2 DB6 Data bus 14 groen PC6 wit
3 DB5 Data bus 11 paars PC5 groen
4 DB4 Data bus 12 blauw PC4 grijs
5 DB3 Data bus nvt nvt nvt nvt
6 DB2 Data bus nvt nvt nvt nvt
7 DB1 Data bus nvt nvt nvt nvt
8 DB0 Data bus nvt nvt nvt nvt
9 E1 Enable bovenste 2 lijnen 5 oranje PC3 bruin
10 R/W L: schrijf data van MPU naar LCM / H: lees data van LCM in MPU gnd 6 grijs PC0 paars
11 RS L: Instructie code / H: data input 3 geel PC1 oranje
12 Vlc Liquid crystal driving voltage = contrast 0-0,7 Vdc brd instel potmeter bruin nvt nvt
13 Vss Aarde brd zwart brd zwart
14 Vdo Voedingsspanning +5 Vdc brd rood brd rood
15 E2 Enable onderste 2 lijnen n/a ny PC2 blauw
16 NC Niet verbonden ? nvt nvt nvt
17 Va Anode back light = positief = Uitgang inverter brd ny nvt nvt
18 Vc Kathode back light = negatief = aarde brd zwart nvt nvt

Wat opvalt is dat er op het Futurlec controlboard 2 pinnen fout zijn om deze lcd aan te kunnen sturen, namelijk de R/W pin is geaard en daardoor kan er enkel naar de lcd worden geschreven. Verder ontbreekt er een pin voor de E2 enable de onderste 2 regels. Jammer, want gezien de pinbelegging zouden hiervoor PC1 en PC2 gebruikt kunnen worden. De beste aanpak om dit aan te passen lijkt:

  1. Kijk of de 2 bovenste regels werken met de control board dimmer en standaard meegeleverde software.
  2. Maak een dimmer op het verloopstukje.
  3. Verander de aansluiting naar Port C direct, dus zonder de display uitgang van het futurlec board te gebruiken.

Op die manier zijn alle functionaliteiten voorhanden om de LCD 40X4 te kunnen laten werken. Dit leidt tot de volgende aansluitingen, waarbij de port iedere port kan zijn, maar hier voor het softwaregemak port C wordt genomen:


De pinbelegging van een rechte verbindingskabel met de STK500 connectoren is als volgt, waarbij de nok van de controllers is weggericht:

?____________________
| ?9 | 7 | 5 | 3 | 1 |
|----|---|---|---|---|
| 10 | 8 | 6 | 4 | 2 |
|______--------______|

Pin Kleur Port
1 bruin +5 Vdc
2 rood Gnd
3 oranje Px7
4 geel Px6
5 groen Px5
6 blauw Px4
7 paars Px3
8 grijs Px2
9 wit Px1
10 zwart Px0