pcnerd
Take a parachute, and jump!
'ello,
Ik heb na even prutsen mijn Graphische lcd display van ledsee aan de praat gekregen. Eerst verkeerde potmeter aansluiting voor contrast en omgekeerde Chip Select lijntjes zijn inmiddels opgelost maar ik sta nu voor een nieuw probleem.
Bij het tekenen van lijnen die helemaal aan de rechterkant van het display liggen (dus x=127) wordt er slechts om de 8 pixels een pixel zwart gemaakt en dus niet de hele lijn. Dit gebeurt ook aan de rechterkant van de eerste chipcontroller (x=63).
de (simpele) code gebruik in in combinatie met avrlib:
unsigned char i;
for (i=0; i<7; i++){
glcdSetDot(127, i);
glcdSetDot(126, i);
glcdSetDot(64, i);
glcdSetDot(63, i);
glcdSetDot(0, i);
}
Ik krijg het dus in de verste verte niet voor elkaar om die pixels te kleuren, en ik ben bang dat het probleem ergens in de software van AVRLIB ligt, maar ik kan het niet vinden. Voor de geïnteresseerden kan ik wel even een output van m'n logic analyzer uploaden maar erg veel wijs kan ik er zelf eigenlijk niet uit worden.
Kan iemand misschien de vinger op de zere plek leggen? Hier nog een paar van de routines die de data naar de display uploaden.
ks0108.c
void glcdDataWrite(u08 data)
{
register u08 controller = (GrLcdState.lcdXAddr/GLCD_CONTROLLER_XPIXELS);
#ifdef GLCD_PORT_INTERFACE
cli();
glcdBusyWait(controller); // wait until LCD not busy
sbi(GLCD_CTRL_PORT, GLCD_CTRL_RS);
cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);
outb(GLCD_DATA_PORT, data);
sbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
outb(GLCD_DATA_DDR, 0xFF);
asm volatile ("nop"); asm volatile ("nop");
asm volatile ("nop"); asm volatile ("nop");
asm volatile ("nop"); asm volatile ("nop");
asm volatile ("nop"); asm volatile ("nop");
cbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
sei();
#else
//sbi(MCUCR, SRW); // enable RAM waitstate
glcdBusyWait(controller); // wait until LCD not busy
*(volatile unsigned char *)
(GLCD_CONTROLLER0_CTRL_ADDR + GLCD_CONTROLLER_ADDR_OFFSET*controller) = data;
//cbi(MCUCR, SRW); // disable RAM waitstate
#endif
// increment our local address counter
GrLcdState.ctrlr[controller].xAddr++;
GrLcdState.lcdXAddr++;
if(GrLcdState.lcdXAddr >= GLCD_XPIXELS)
{
GrLcdState.lcdYAddr++;
glcdSetYAddress(GrLcdState.lcdYAddr);
glcdSetXAddress(0);
}
}
glcd.c:
void glcdSetDot(u08 x, u08 y)
{
unsigned char temp;
glcdSetAddress(x, y/8);
temp = glcdDataRead(); // dummy read
temp = glcdDataRead(); // read back current value
glcdSetAddress(x, y/8);
glcdDataWrite(temp | (1 << (y % 8)));
glcdStartLine(0);
}
b.v. _O_ _O_
mvg pcnerd
//edit: nog even vergeten, als ik een vierkant "om" het scherm heen teken krijg ik weer de rechterkant slechts een paar pixels, en ook 1 pixel ergens in het midden van het scherm, timing probleem?
woeha, plaatje, met nieuwe code (glcdRectangle(0, 0, 64, 128);):
Laatste signalen op logic analyzer (waar het volgens mij fout gaat):
http://gallery.tomzooi.nl/full/67.jpg
pcnerd
Take a parachute, and jump!
Even een antwoordje, anders wordt deze TS zo ontzettend lang.
Als ik nu dit doe:
glcdSetDot(127, 8);
delay_ms(1);
glcdSetDot(127, 7);
delay_ms(1);
glcdSetDot(127, 6);
delay_ms(1);
glcdSetDot(127, 5);
delay_ms(1);
glcdSetDot(127, 4);
delay_ms(1);
glcdSetDot(127, 3);
delay_ms(1);
glcdSetDot(127, 2);
delay_ms(1);
glcdSetDot(127, 1);
delay_ms(1);
dan merk ik op dat pixel met nummer 8 en 1 worden (en de rest niet)geset, voeg ik er een glcdSetDot(127, 0) aan toe, dan worden 8 en 0 geset en de rest niet. zelfde geldt voor 2 als ik 0 en 1 weghaal. 2 wordt geset en 8, rest niet. Blijkbaar wordt alleen de laatst gesette pixel ook echt geset oid...
//edit: verkeerd geteld, ging om pixel nr 9 die de hele tijd wordt geset (door glcSetDot(127,8);)
//edit: nieuwe vordering, door
glcdSetDot(127, 1);
delay_ms(500);
glcdSetDot(127, 2);
te doen zie ik het puntje van 2 naar 3 verspringen, op de een of andere manier lijkt hij dus de andere dot te "clearen", erg vreemd...
[Bericht gewijzigd door pcnerd op (12%)]
RES
RES
Ik heb dat probleem ook gehad pas geleden, het bleek in de timing van busy flag polling te zitten.
Die busy flag moet gepollt worden binnen 320 nsec nadat de kloklijn hoog werd, maar de cycletijd moet wel 1 usec blijven.
Dat probleem zou dan in de driver software moeten zitten, het ene display is net een fractie anders dan het andere, misschien timing net iets te krap ingesteld.
pcnerd
Take a parachute, and jump!
busy flag polling, heb je zelfde display en ook avr lib? dan mag je me wel even aanwijzen waar het zit, ik weet niet hoe dat gedoe in elkaar steekt namelijk, kun je 't ff kort uitleggen en wat er precies fout gaan (wat gaat te snel/laat hoog of wordt te snel/laat uitgelezen)?
RES
RES
glcdBusyWait(controller); // wait until LCD not busy
sbi(GLCD_CTRL_PORT, GLCD_CTRL_RS);
cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);
outb(GLCD_DATA_PORT, data);
sbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
outb(GLCD_DATA_DDR, 0xFF);
asm volatile ("nop"); asm volatile ("nop");
asm volatile ("nop"); asm volatile ("nop");
asm volatile ("nop"); asm volatile ("nop");
asm volatile ("nop"); asm volatile ("nop");
cbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
Ik heb daar 5 nops staan. (tCYC>=1usec, voor de E lijn.)
Heb geen libs, prog alles handmatig (ASM).
Heel kritisch die timing.
sorry voor offtopic, maar heb een vraagje aan de TS:
zie dat je een zeroplus logic analyzer gebruikt, bevalt die een beetje?
mooie apparaten als ik het zo zie, ben zelf ook veel met avr's bezig tegenwoordig, en het ziet er best handig uit.
krijg je een beetje waar voor je geld? prijzen liggen best laag
pcnerd
Take a parachute, and jump!
Ik moet zeggen dat ik er goed mee kan werken, lekker klein en simpel, ik wacht nog op de databestanden met bus-protocollen, daarmee zou het nog leuker moeten worden (niet meer zelf uitvogelen wat er nou over irc wordt verstuurd, dat doet het protcol)
Kortom, geen problemen mee, leuke dingen. De mijne komt bij eleshop.nl weg.
RES: wat doet nop eigenlijk? is dat frequentie afhankelijk?
RES
RES
Met een nop vertraag je 1 clockcycle zonder iets uit te voeren (no operation).
Die ene nop kan net voldoende zijn om die KS0108 te settelen. Dus 1 regel erbij, en dan eens proberen.
asm volatile ("nop"); asm volatile ("nop");bedankt voor je reactie
ik heb hem inderdaad gezien bij eleshop, en vond het er erg interessant uitzien:)
pcnerd
Take a parachute, and jump!
Op 28 november 2008 12:49:20 schreef RES:
Met een nop vertraag je 1 clockcycle zonder iets uit te voeren (no operation).
Die ene nop kan net voldoende zijn om die KS0108 te settelen. Dus 1 regel erbij, en dan eens proberen.asm volatile ("nop"); asm volatile ("nop");
Gedaan, ook nog wat verder gestoeid maar geen resultaten geboekt. Wel vreemd trouwens dat ik net, toen ik mijn setup na gisteren aanzette ik wel de juiste stippies kreeg, maar daarna niet meer, zeer apart.
ik heb ff de besturingscode van ks0108 online gezet:
http://pastebin.com/d775c4808
Misschien kun je grove fouten ontdekken, dat controller select gedeelte heb ik zelf aangepast, ik werd een beetje gek van de hele alles uit zetten en daarna 1 aan, grote troep op m'n logic analyzer. Dan maar een beetje bitmanipuleren
.
//edit:
nog even gekeken wat er gebeurd als ik alles met factor 8 verlaag (internal clock divide/8 aanzetten), maar het probleem blijft hetzelfde, ik snap er geen zak meer van...
[Bericht gewijzigd door pcnerd op (33%)]
pcnerd
Take a parachute, and jump!
even voor zowel v3n0m als voor de rest, op
http://www.tomzooi.nl/crap/glcd.als
staat het logic analyzer data bestandje met de signalen van/naar het glcd dat je kunt openen met dit proggie:
http://www.eleshop.nl/downloads/Zeroplus%20WIN_XP_VISTA32.zip
(demo versie kiezen na geïnstalleerd te hebben, easy.)
van http://www.eleshop.nl/zeroplus-usb20-logic-analyzer-a-p-298.html
dit is een text bestandje, stuk onoverzichtelijker maargoed:
http://www.tomzooi.nl/crap/glcd.txt
pcnerd
Take a parachute, and jump!
16 xD.
heb jij alleen bij de datawrite functies 5 nops, of heb je er bij de read functies e.d. ook 5?
ik zal ze zometeen ff omzetten naar 10 xD.
//edit: alle nops verdubbelt, geen effect
.
[Bericht gewijzigd door pcnerd op (14%)]
pcnerd
Take a parachute, and jump!
Ik heb 2 setdot functies op de Logic analyzer te weten isoleren. Dit plaatje:
http://www.tomzooi.nl/crap/pix1.jpg
hoort bij glcdSetDot(127,0);
en
http://www.tomzooi.nl/crap/pix2.jpg
hoort bij glcdSetDot(127,1); daarna.
Volgens mij kan ik ongeveer zien wat er misgaat, namelijk dat hij eerst de data ophaald van controller0 en daarna naar 1 schrijft. Beetje vreemd en ik kan de oorzaak niet achterhalen, iemand die het wel voor elkaar krijgt?
ik heb ook glcd.c nog ff in pastebin gegooid:
http://pastebin.com/m3c055abd
hierin zit de setdot functie, in ks0108.c zitten de datwrite functies enzo:
http://pastebin.com/d775c4808
//nog meer vreemd, als ik glcdClearDot(127,0); gebruik om de onderste pixel weg te halen (die helemaal niet geset is) wordt pixel 127,1 weggehaald....
//edit: hier zie je wat er gebeurd als ik de volgende code uitvoer:
PORTB |= H(PB5);
delay_us(50);
PORTB &= ~(H(PB5));
glcdSetDot(127,0);
PORTB |= H(PB5);
delay_us(50);
PORTB &= ~(H(PB5));
glcdSetDot(127,1);
PORTB |= H(PB5);
delay_us(50);
PORTB &= ~(H(PB5));
glcdSetDot(126,0);
PORTB |= H(PB5);
delay_us(50);
PORTB &= ~(H(PB5));
glcdSetDot(126,1);
PORTB |= H(PB5);
delay_us(50);
PORTB &= ~(H(PB5));
ik gebruik PB5 om het ondescheid tussen intialisatie en de setdot routines te maken, afin, linker 2 routines zijn dus fout en rechter 2 zijn goed, maar waar het nou precies zit kan ik niet vinden, ik vindt ze allebei een beetje raar
.
Iemand die er beter in is dan mij?:
http://www.tomzooi.nl/crap/signals.gif
[Bericht gewijzigd door pcnerd op (33%)]
RES
RES
//edit: alle nops verdubbelt, geen effect
.
Je moet minimaal 1 usec hebben als tCYC.
10/16MHz=0.625 usec. Probeer eens 16 nop's? Of nog beter 17, net ietsjes meer dan 1 usec.
Dan weet je zeker dat het daar niet aan ligt, dan weer verder zoeken naar prob.
pcnerd
Take a parachute, and jump!
Op 30 november 2008 11:01:59 schreef RES:
[...]Je moet minimaal 1 usec hebben als tCYC.
10/16MHz=0.625 usec. Probeer eens 16 nop's? Of nog beter 17, net ietsjes meer dan 1 usec.
Dan weet je zeker dat het daar niet aan ligt, dan weer verder zoeken naar prob.
dus 17 regels met 2 maal nop? of 9 regels met 2?
Een tip met dit LCD: Nooit de chipselects van de chips tegelijk actief maken. De chips lopen namelijk niet synchroon met elkaar intern. In het geval van busy status opvragen geeft dit zelfs bus conflicten (als 1 chip niet busy is en de andere wel).
Of chip 1 busy pollen totdat 'ie niet busy is en alleen naar chip 1 schrijven. Of dit alleen voor chip 2 doen. Dus niet tegelijk.
Ook niet schrijven naar beide chips tegelijk en dan van 1 chip de busy bepalen. De ande chip kan namelijk nog net busy zijn terwijl de eerste die je opvraagt klaar is.
Nog wat (assembly) code uit mijn LCD lib voor dit ding:
; =========================================================================================================
; Definitions
; =========================================================================================================
.equ LCD_PB0 = PORTB0
.equ LCD_PB1 = PORTB1
.equ LCD_PB2 = PORTB2
.equ LCD_E = PORTB3
.equ LCD_RW = PORTB4
.equ LCD_DI = PORTB5
.equ LCD_CS1 = PORTB6
.equ LCD_CS2 = PORTB7
.equ LCD_CTRL = PORTB
.equ LCD_CDIR = DDRB
.equ LCD_CDIRINIT = (1<<LCD_E)|(1<<LCD_RW)|(1<<LCD_DI)|\
(1<<LCD_CS1)|(1<<LCD_CS2)
.equ LCD_DIN = PINC
.equ LCD_DOUT = PORTC
.equ LCD_DDIR = DDRC
.equ LCD_BUS_PB = (1<<LCD_PB0)|(1<<LCD_PB2)
.equ LCD_BUS_IDLE = LCD_BUS_PB|(1<<LCD_DI)|(1<<LCD_RW)
.equ LCD_BUS_RDS = LCD_BUS_PB|(1<<LCD_RW)
.equ LCD_BUS_RDD = LCD_BUS_PB|(1<<LCD_RW)|(1<<LCD_DI)
.equ LCD_BUS_WRC = LCD_BUS_PB
.equ LCD_BUS_WRD = LCD_BUS_PB|(1<<LCD_DI)
.equ LCD_BUS_E = (1<<LCD_E)
.equ LCD_BUS_CSN = (0<<LCD_CS2)|(0<<LCD_CS1)
.equ LCD_BUS_CS1 = (0<<LCD_CS2)|(1<<LCD_CS1)
.equ LCD_BUS_CS2 = (1<<LCD_CS2)|(0<<LCD_CS1)Defines
; ---------------------------------------------------------------------------------------------------------
; In: R14 Must be 0x00
; R15 Must be 0xFF
; R16 Chip select bits
; R17 Data to write to the display RAM
;
; Modifies: R16
; R17
LcdWriteRam: ANDI R16, LCD_BUS_CSM ; Filter CS1 and CS2
ORI R16, LCD_BUS_WRD ; Set up a RAM register write
; ---------------------------------------------------------------------------------------------------------
; In: R14 Must be 0x00
; R15 Must be 0xFF
; R16 LCD bus control byte
; R17 Byte to write to the LCD
;
; Modifies: R16
; R17
LcdWrite: OUT LCD_CTRL, R16
OUT LCD_DDIR, R15
OUT LCD_DOUT, R17
SBR R16, LCD_BUS_E
OUT LCD_CTRL, R16
CBR R16, LCD_BUS_E
OUT LCD_CTRL, R16
OUT LCD_DOUT, R15
OUT LCD_DDIR, R14
ANDI R16, LCD_BUS_CSM
ORI R16, LCD_BUS_RDS
OUT LCD_CTRL, R16
SBR R16, LCD_BUS_E
OUT LCD_CTRL, R16
LDI R17, LCD_BUS_IDLE
LcdWriteBusy: SBIC LCD_DIN, LCD_SB_BUSY
RJMP LcdWriteBusy
OUT LCD_CTRL, R17
RETLCD write routine
De write gaat uit van een 16MHz systeem klok, er zijn geen nops nodig hier, daar het sturen van de poorten in een dusdanige volgorde is gedaan dat de timings al worden gehonoreerd.
[Bericht gewijzigd door MagicBox op (79%)]
pcnerd
Take a parachute, and jump!
Ik kan op de Logic Analyzer niet ontdekken dat allebei de chips tegelijkertijd worden geactiveerd dus dat zal het probleem niet zijn, echter is bij eerdere logic analyzer signalen de sample rate wel een beetje laag, ik heb het nu eindelijk voor elkaar gekregen om goeie samples op 10mhz te krijgen. Die zien er stukken anders uit, ik moet ze alleen is een keer navolgen om te kijken wat die library nou precies doet want er zijn wel zo'n 70 enable-cycles per setdot....
als iemand dat programma al heeft geïnstalleerd wil ik die wel ff uploaden, maar alles screenshotten is een hel
[Bericht gewijzigd door pcnerd op (11%)]
Ik zie het probleem al:
sbi(GLCD_CTRL_PORT, GLCD_CTRL_RS);
cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);
outb(GLCD_DATA_PORT, data);
sbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
outb(GLCD_DATA_DDR, 0xFF);Je zet de dataport op output NADAT je E al hoog maakt. E zelf is geen latch clock, maar E staat de interne clock toe te latchen op de eerst volgende inkomende flank. Soms heb je geluk dat de latch op of na het zetten als output komt, soms te vroeg en krijg je random data.
sbi(GLCD_CTRL_PORT, GLCD_CTRL_RS);
cbi(GLCD_CTRL_PORT, GLCD_CTRL_RW);
outb(GLCD_DATA_PORT, data);
outb(GLCD_DATA_DDR, 0xFF);
sbi(GLCD_CTRL_PORT, GLCD_CTRL_E);
Zo zal 'ie het een stuk beter doen.
pcnerd
Take a parachute, and jump!
Dat had ik stiekem zelf blijkbaar al veranderd
. Hier de huidige ks0108.c met daarin de dataread/write functies:
http://pastebin.com/m7bc3be68
geen effect nog steeds dus, vindt hier een mooie opname van de Logic Analyzer op 10mhz:
http://www.tomzooi.nl/crap/glcd2.als
heb je als gezegd ff dat proggie voor nodig bovenstaand.
[Bericht gewijzigd door pcnerd op (39%)]
pcnerd
Take a parachute, and jump!
Inmiddels heb ik het hele gebeuren maar weer is opgepakt, ik heb een lijst gemaakt van de functies die glcdSetDot(x,y); uitvoert om deze vervolgens te kunnen vergelijken met de data van de logic analyzer:
1. glcdBusyWait(0);
2. controlwrite(0,GLCD_SET_PAGE | y/8)
3. glcdBusyWait(1);
4. controlwrite(1,GLCD_SET_PAGE | y/8)
5. glcdBusyWait(0);
6. controlwrite(0, GLCD_SET_Y_ADDR | 0x00)
7. glcdBusyWait(1);
8. controlwrite(1, GLCD_SET_Y_ADDR | 0x00)
9. glcdBusyWait(0);
10. controlwrite(((GrLcdState.lcdXAddr/GLCD_CONTROLLER_XPIXELS),GLCD_SET_Y_ADDR | (GrLcdState.lcdXAddr & 0x3F))
11. glcdBusyWait(0);
12. dataread();
13. glcdBusyWait(0);
14. dataread();
15. glcdBusyWait(0);
16. controlwrite(0,GLCD_SET_PAGE | y/8)
17. glcdBusyWait(1);
18. controlwrite(1,GLCD_SET_PAGE | y/8)
19. glcdBusyWait(0);
20. controlwrite(0, GLCD_SET_Y_ADDR | 0x00)
21. glcdBusyWait(1);
22. controlwrite(1, GLCD_SET_Y_ADDR | 0x00)
23. glcdBusyWait(0);
24. controlwrite(((GrLcdState.lcdXAddr/GLCD_CONTROLLER_XPIXELS),GLCD_SET_Y_ADDR | (GrLcdState.lcdXAddr & 0x3F))
25. glcdBusyWait(0);
26. datawrite(0, dataread() | (1 << (y % 8))
27. glcdBusyWait(0);
28. controlwrite(0, GLCD_START_LINE | 0);
29. glcdBusyWait(1);
30. controlwrite(1, GLCD_START_LINE | 0);
vervolgens ben ik hiermee en een printuit van de functies glcdSetDot(127,1); (die fout gaat) en glcdSetDot(126,1); gaan zitten en gaan bestuderen totdat ik het volgende tegenkwam.
Bij de nummers 12 en 14 leest het programma de data uit die op die plek op het lcd staat. Als er dus van te voren een puntje is geset zal deze daarop tevoorschijn komen en op die manier worden meegenomen bij het schrijven van een extra punt. Immers, de avr kan slechts rijen van 8 pixels schrijven en niet "bijschrijven", dus moet men de puntjes die er al stonden ophalen en die samenvoegen met het volgende puntje dat wordt geschreven om ervoor te zorgen dat de eerder geschreven puntjes niet verdwijnen.
Nadat ik eerst pixel 126,0 had geset, sette ik ook 126,1 en kreeg daarvan een uitdraai op de logic analyzer waarvan dit een extract is:
http://www.tomzooi.nl/crap/good.jpg
er wordt eerst een dummy-read uitgevoerd (geen idee waarom maargoed, blijkbaar toch nodig xD ). Dit is te zien aan het eerste hoge RS signaal. Hierna wordt een busy wait gedaan, die 2 enable cycli duurt. Hierna volgt de 2e read functie die de juiste data ophaalt waaruit blijkt dat pixel 126,0 geset is.
wat we echter zien bij het setten van pixel 127,1, nadat ook bij deze 127,0 is geset is dit:
http://www.tomzooi.nl/crap/problem.jpg
Je ziet dat hier de 2 read cycles worden onderbroken door een heleboel andere cycles die feitelijk nergens op slaan. In dit geval is ook niet zichtbaar dat 127,0 al is geset, zowel in de eerste als in de 2e read cycle. Wat ook nog opvalt is dat de 2e read cycle op een andere controller (CS0) wordt uitgevoerd. Dit zou CS1 moeten zijn. De Chip Select lijnen zijn btw active low, pixels x groter dan 63 bevinden zich op CS1. (dus ook x=126 of 127)
Dit lijkt ofwel op een fout in de programmatuur, maar dit lijkt me erg vreemd aangezien het dezelfde functies zijn als de setDot cycli voor de 126,1 pixel. Het lijkt er meer op dat er een ontplofte stack ofzo wordt veroorzaakt waardoor de avr niet meer weet welke functie hij aan is/was uitvoeren of iets dergelijks.
Ik kan maar niet uitvogelen wat er hier nou zo vreselijk misgaat. Iemand suggesties?
de genoemde functies komen uit ks0108.c als bovengenoemd. glcd.c bevat de SetDot functie en is hier te vinden.
Ik vondt dit trouwens in de datasheet:
33.1.2 AT90CAN32 RevA (Date code < 0107)
• CAN acknowledge error in 3-sample mode with prescaler =1
• CAN transmission after 3-bit intermission
• Asynchronous Timer-2 wakes up without interrupt
• Reset of Timer-2 flags in asynchronous mode
• Miss-functioning when code stack is in XRAM
bij de errata
zou die laatste misschien met mijn probleem te maken hebben?
ik weet alleen niet hoe ik ervoor zorgen dat alles in het Sram terecht komt...
Sorry maar ik ga ech niet die c library uit zitten vogelen. Wat voor LCD moduul heb je? Heb je daar de datasheet ook van? Want op de moduul zijn CS0 en CS1 actief hoog.
Je zou er goed aan doen die hele library aan de kant te mieteren en zelf gaan bitbangen. Ten eerste leer je het LCD kennen, ten tweede geen last van een rookgordijn dat die c library opgooit.
Als je rechtstreeks dat LCD laat doen wat je wil, dan ben je al een heel eind verder.
pcnerd
Take a parachute, and jump!
dat was ook niet mijn verzoek
.
lcd module is ks0108. Komt van ledsee.com af, datasheet daar ook te vinden:
http://ledsee.com/index.php?page=shop.getfile&file_id=54&produ…
lcd ken ik inmiddels wel inside out, zo ook de library, maar voor zover ik kan zien zitten er naast vaagheden geen fouten in. Ik wil nog tot de kerstvakantie wachten met een oplossing om deze library te gebruiken, scheelt een hoop werk. Ik weet dat ik inmiddels allang zelf een lib had kunnen schrijven maar achteraf is altijd makkelijk praten.
Ik ben ook al bezig geweest met een GLCD van niels en de libs maar ook niet werkend gekregen dus heb ik maar een andere library gebruikt, welke wel werkte 
http://www.scienceprog.com/simulate-ks0108-graphical-lcd-with-proteus-…
Getest en werkt op verschillende clock snelheden.