LCDInfo.com http://forum.lcdinfo.com/ |
|
Nokia 6100 LCD base operations http://forum.lcdinfo.com/viewtopic.php?f=9&t=1762 |
Page 1 of 1 |
Author: | matterama [ Thu Oct 12, 2006 8:20 ] |
Post subject: | Nokia 6100 LCD base operations |
My previous note may have been unclear. Using the Sparkfun supplied Nokia 6100 knockoff LCD and Epson controller chip, I have a board I spun that has a switching power supply oscialltion issue. I can supply backlight power (6.8V) OR 3.3V digital / display power to the unit. But not both at the same time currently. I have a C8051F410 processor attached on the same 3.3V supply. It goes into la-la land when the 6.8V is tunred on. I'll fix that, but in the meantime.... If the LCD is supplied 3.3V to digital / display power, it should here my 9bit serial commands, correct? Should I be able to see text regardless of backlight (provided I got my contrast correct), or is that backlight power necessary for other undocumented reasons? Thanks, Matt |
Author: | Zee [ Thu Oct 12, 2006 8:34 ] |
Post subject: | |
Yes you can see something even without the backlight. Your cellphone doesn't keep its backlight burning all the time does it not. |
Author: | matterama [ Thu Oct 12, 2006 16:36 ] |
Post subject: | |
Yes, I knew I was asking for the slap in the face answer :) I was expecting that I should be able to see something with all the bit twiddling I'm doing. Is there a chance that I don't have the volume / contrast controls setup right and that I just am not seeing it? When the display is being run only on 3.3V, how much current is it pulling? I also worry that I have a dead LCD and am just beating my head against an unpowered wall... Thanks Zee, Matt Code: void InitLCD(void)
{ long j; CS = 1; slow_wait_25ms (40); SCK = 1; MOSI = 0; CS = 0; LCDRESET = 0; slow_wait_25ms (40); LCDRESET = 1; // ctl_timeout_wait(ctl_get_current_time() + 50); slow_wait_25ms (40); SendLcd(LCDCommand,DISCTL); // display control SendLcd(LCDData,0x03); //00 SendLcd(LCDData,0x20); //20 SendLcd(LCDData,0x0C); //0A SendLcd(LCDData,0x00); //None for other SendLcd(LCDCommand,NOP); // Data Sheet recomends you send this from time to time SendLcd(LCDCommand,COMSCN); // SendLcd(LCDData,0x01); // Scan 1-80 SendLcd(LCDCommand,OSCON); // SendLcd(LCDCommand,SLPOUT); // Sleep out command (must be done before DISPON) // ctl_timeout_wait(ctl_get_current_time() + 100); // data sheet says to wait 100ms here slow_wait_25ms (40); SendLcd(LCDCommand,VOLCTR); // electronic volume, this is kinda contrast/brightness SendLcd(LCDData,0xff);//ff // change this to get brighter or darker start point then use volup/down to adjust SendLcd(LCDData,0x01); SendLcd(LCDCommand,PWRCTR); // power ctrl SendLcd(LCDData,0x0f); //everything on // //// ctl_timeout_wait(ctl_get_current_time() + 100); // data sheet says to wait 100ms here slow_wait_25ms (40); SendLcd(LCDCommand,DISINV); // SendLcd(LCDCommand,TMPGRD); // Temp Gradient // SendLcd(LCDData,0x01); SendLcd(LCDCommand, DATCTL); // Data Control SendLcd(LCDData, 0x00); // normal orientation; scan across cols, then rows SendLcd(LCDData, 0x00); // RGB arrangement (RGB all rows/cols) // WriteCommand(lctData, 0x04); // RGB arrangement (RGB row 1, BGR row 2) SendLcd(LCDData, 0x01); // 8-color display // WriteCommand(lctData, 0x02); // 16-color display SendLcd(LCDData, 0x00); // // LCD_Set_Resolution(LOW_RES); SendLcd(LCDCommand,RGBSET8); // setup color lookup table // Setup the color lookup table by choosing evenly spaced color values // for a nice even spread. Blue only has 2 bits, so the spacing is wider // but still spans 0x00 - 0x0f // Bit organisation is RRRGGGBB SendLcd(LCDCommand,RGBSET8); SendLcd(LCDData,0x00); // RED SendLcd(LCDData,0x02); SendLcd(LCDData,0x04); SendLcd(LCDData,0x06); SendLcd(LCDData,0x08); SendLcd(LCDData,0x0a); SendLcd(LCDData,0x0c); SendLcd(LCDData,0x0f); SendLcd(LCDData,0x00); // GREEN SendLcd(LCDData,0x02); SendLcd(LCDData,0x04); SendLcd(LCDData,0x06); SendLcd(LCDData,0x08); SendLcd(LCDData,0x0a); SendLcd(LCDData,0x0c); SendLcd(LCDData,0x0f); SendLcd(LCDData,0x00); // BLUE SendLcd(LCDData,0x04); SendLcd(LCDData,0x09); SendLcd(LCDData,0x0f); SendLcd(LCDCommand,NOP); // Data Sheet recomends you send this from time to time SendLcd(LCDCommand,PASET); // page start/end ram SendLcd(LCDData,0x02); // for some reason starts at 2 SendLcd(LCDData,0x83); SendLcd(LCDCommand,CASET); // column start/end ram SendLcd(LCDData,0x00); // for some reason starts at 2 SendLcd(LCDData,0x83); // for some reason starts at 2 SendLcd(LCDCommand,RAMWR); // write some stuff (background) for (j = 0; j < 18000; j++){ SendLcd(LCDData,0x1C); //28 = 0x1C = green } SendLcd(LCDCommand, DISON); // Turn Display ON for (j = 0; j < 160; j++){ // this loop adjusts the contrast, change the number of iterations to get SendLcd(LCDCommand, VOLUP); // desired contrast. This might be different for individual LCDs slow_wait_25ms (4); } } |
Author: | Zee [ Thu Oct 12, 2006 19:17 ] |
Post subject: | |
This is the initialization procedure I'm successfully using with my LCD. Code: WriteCommand(COMSCN);
WriteData(0x01); WriteCommand(OSCON); WriteCommand(SLPOUT); WriteCommand(PWRCTR); WriteData(0x0f); WriteCommand(DISINV); WriteCommand(DATCTL); WriteData(0x01); WriteData(0x01); WriteData(0x02); WriteCommand(RGBSET8); WriteData(0x00); // R WriteData(0x02); // R WriteData(0x04); // R WriteData(0x06); // R WriteData(0x08); // R WriteData(0x0a); // R WriteData(0x0c); // R WriteData(0x0e); // R WriteData(0x00); // G WriteData(0x02); // G WriteData(0x04); // G WriteData(0x06); // G WriteData(0x08); // G WriteData(0x0a); // G WriteData(0x0c); // G WriteData(0x0e); // G WriteData(0x00); // B WriteData(0x04); // B WriteData(0x08); // B WriteData(0x0c); // B WriteCommand(DISON); |
Author: | matterama [ Fri Oct 13, 2006 0:03 ] |
Post subject: | |
Thanks Zee. I'll try that tonight. What would you suggest is the simplest pixel put or demonstrator that would display a dot or something else? Also, is there any chance that all my screwing around could've written something to memory on the LCD that is in conflict with other commands? If so, is there some kind of master reset that resets the LCD to factory defaults? Thanks again, Matt |
Author: | Zee [ Fri Oct 13, 2006 16:29 ] |
Post subject: | |
Very simple plot for the 8-bit mode. Does something visible in the 16-bit mode too but doesn't look correct. Code: void Plot(int X, int Y, int COLOR)
{ if ((X>-1) && (X<132) && (Y>-1) && (Y<132)) { WriteCommand(CASET); WriteData(X); // WriteData(X+1); WriteCommand(PASET); WriteData(Y); // WriteData(Y+1); WriteCommand(RAMWR); WriteData(COLOR); } } I use the hardware reset line to reset the display. Other than that the most problems besides incorrect initialization/command sequence comes from the contrast calibration which varies from display to display. My both (Epson & Philips) displays work just fine without touching any contrast adjustments. |
Author: | matterama [ Fri Oct 13, 2006 20:32 ] |
Post subject: | |
Thanks again Zee. I'm now doubting my SPI bit bang stuff, as I've seen conflicting code that people claims works versus the datasheet. It looks like reset low == off, reset high == on. Chip Select low == device enabled, CS high == device disabled. After a command or data sequence, do you toggle the CS from low to high, then back to low? The datasheet seems to indicate this, but not too many people show this in code. You refer in your post to using the hardware reset: Quote: I use the hardware reset line to reset the display....
Do you program the unit once, then subsquently use the reset switch only, or do you re-initialize the LCD everytime you power your setup on? The datasheet also indicates that to be nice you should turn the display off to let some capacitors bleed down before powering down using PWRCTRL. Do you do this or is is just a little bit of motherhood? Thanks again for all your help Zee... Matt |
Author: | Zee [ Fri Oct 13, 2006 21:47 ] |
Post subject: | |
My "chain of command" in my source seems to be: After powerup: Code: SetPortVal(CONTROL, CL_LO | SD_LO | RES_LO | CS_HI, 1); Delay(40000); SetPortVal(CONTROL, CL_LO | SD_LO | RES_HI | CS_HI, 1); SetPortVal(CONTROL, CL_LO | SD_LO | RES_HI | CS_LO, 1); Then the initialization and after that whatever I want to do. My writeroutines are: Code: void WriteCommand(unsigned char Data)
{ int count; SetPortVal(CONTROL, CL_LO | SD_LO | RES_HI | CS_LO, 1); SetPortVal(CONTROL, CL_HI | SD_LO | RES_HI | CS_LO, 1); for (count=7; count>-1; count--) { if (Data >> count & 1) { SetPortVal(CONTROL, CL_LO | SD_HI | RES_HI | CS_LO, 1); SetPortVal(CONTROL, CL_HI | SD_HI | RES_HI | CS_LO, 1); } else { SetPortVal(CONTROL, CL_LO | SD_LO | RES_HI | CS_LO, 1); SetPortVal(CONTROL, CL_HI | SD_LO | RES_HI | CS_LO, 1); } } } void WriteData(unsigned char Data) { int count; SetPortVal(CONTROL, CL_LO | SD_HI | RES_HI | CS_LO, 1); SetPortVal(CONTROL, CL_HI | SD_HI | RES_HI | CS_LO, 1); for (count=7; count>-1; count--) { if (Data >> count & 1) { SetPortVal(CONTROL, CL_LO | SD_HI | RES_HI | CS_LO, 1); SetPortVal(CONTROL, CL_HI | SD_HI | RES_HI | CS_LO, 1); } else { SetPortVal(CONTROL, CL_LO | SD_LO | RES_HI | CS_LO, 1); SetPortVal(CONTROL, CL_HI | SD_LO | RES_HI | CS_LO, 1); } } } |
Author: | matterama [ Fri Oct 13, 2006 22:04 ] |
Post subject: | |
Ah ha! Going step by step thru yours has forced me to realize that a macro I was using was set to one, but not setting the clock on that specific cycle! I'll BET it'll work tonight when I get back to my setup. THANKS ZEE! |
Author: | matterama [ Tue Oct 17, 2006 5:34 ] |
Post subject: | |
Zee...update...it was something different than I thought, but still a SW bug on my side. LCD is up and running, making pretty colors and boxes. Font mapping is next. Thanks again for all your help... Matt |
Author: | Zee [ Tue Oct 17, 2006 10:39 ] |
Post subject: | |
Where the pictures?-) |
Author: | matterama [ Wed Oct 18, 2006 5:35 ] |
Post subject: | |
Gotta go to Germany for a week and change. I'll post the pretty stuff (fonts, et. al) when I get back along with my code for anyone else that wants to borrow... |
Page 1 of 1 | All times are UTC + 2 hours |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |