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:
- Kijk of de 2 bovenste regels werken met de control board dimmer en standaard meegeleverde software.
- Maak een dimmer op het verloopstukje.
- 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:
- PC7 = DB7
- PC6 = DB6
- PC5 = DB5
- PC4 = DB4
- PC3 = E1
- PC2 = E2
- PC1 = RS
- PC0 = R/W
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 |
- Software voor dit onderdeel
|
|