CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

hi. when I separate my lcd from my main board, there is prb.

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
zamzam23



Joined: 25 Aug 2010
Posts: 47

View user's profile Send private message

hi. when I separate my lcd from my main board, there is prb.
PostPosted: Mon Jul 25, 2011 11:51 pm     Reply with quote

this is my lcd driver:
Code:

// flex_lcd.c

// These pins are for the Microchip PicDem2-Plus board,
// which is what I used to test the driver.  Change these
// pins to fit your own board.

#define LCD_DB4   PIN_D4
#define LCD_DB5   PIN_D5
#define LCD_DB6   PIN_D6
#define LCD_DB7   PIN_D7

#define LCD_E     PIN_D3
#define LCD_RS    PIN_B2
#define LCD_RW    PIN_D2
// If you only want a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line.

#define USE_LCD_RW   1

//========================================

#define lcd_type 2        // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line


int8 const LCD_INIT_STRING[4] =
{
 0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
 0x0C,//0xf,                    // Display on
 1,                      // Clear display
 6                       // Increment cursor
 };

/*
byte CONST LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xC, 1,6};

Value   Cursor  Blink
0x0C     Off      Off
0x0D     Off      On
0x0E     On       Off
0x0F     On       On

*/

//-------------------------------------
void lcd_send_nibble(int8 nibble)
{
// Note:  !! converts an integer expression
// to a boolean (1 or 0).
 output_bit(LCD_DB4, !!(nibble & 1));
 output_bit(LCD_DB5, !!(nibble & 2));
 output_bit(LCD_DB6, !!(nibble & 4));
 output_bit(LCD_DB7, !!(nibble & 8));

 delay_cycles(1);
 output_high(LCD_E);
 delay_us(2);
 output_low(LCD_E);
}

//-----------------------------------
// This sub-routine is only called by lcd_read_byte().
// It's not a stand-alone routine.  For example, the
// R/W signal is set high by lcd_read_byte() before
// this routine is called.

#ifdef USE_LCD_RW
int8 lcd_read_nibble(void)
{
int8 retval;
// Create bit variables so that we can easily set
// individual bits in the retval variable.
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3

retval = 0;

output_high(LCD_E);
delay_cycles(1);

retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);

output_low(LCD_E);

return(retval);
}
#endif

//---------------------------------------
// Read a byte from the LCD and return it.

#ifdef USE_LCD_RW
int8 lcd_read_byte(void)
{
int8 low;
int8 high;

output_high(LCD_RW);
delay_cycles(1);

high = lcd_read_nibble();

low = lcd_read_nibble();

return( (high<<4) | low);
}
#endif

//----------------------------------------
// Send a byte to the LCD.
void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);

#ifdef USE_LCD_RW
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif

if(address)
   output_high(LCD_RS);
else
   output_low(LCD_RS);

 delay_cycles(1);

#ifdef USE_LCD_RW
output_low(LCD_RW);
delay_cycles(1);
#endif

output_low(LCD_E);

lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}

//----------------------------


void lcd_setcursor_vb(short visible, short blink) {
  lcd_send_byte(0, 0xC|(visible<<1)|blink);
}


void lcd_init(void)
{
int8 i;

output_low(LCD_RS);

#ifdef USE_LCD_RW
output_low(LCD_RW);
#endif

output_low(LCD_E);

delay_ms(15);

for(i=0 ;i < 3; i++)
   {
    lcd_send_nibble(0x03);
    delay_ms(5);
   }

lcd_send_nibble(0x02);

for(i=0; i < sizeof(LCD_INIT_STRING); i++)
   {
    lcd_send_byte(0, LCD_INIT_STRING[i]);

    // If the R/W signal is not used, then
    // the busy bit can't be polled.  One of
    // the init commands takes longer than
    // the hard-coded delay of 60 us, so in
    // that case, lets just do a 5 ms delay
    // after all four of them.
    #ifndef USE_LCD_RW
    delay_ms(5);
    #endif
   }

}

//----------------------------

void lcd_gotoxy(int8 x, int8 y)
{
int8 address;

if(y != 1)
   address = lcd_line_two;
else
   address=0;

address += x-1;
lcd_send_byte(0, 0x80 | address);
}


//-----------------------------
void lcd_putc(char c)
{
 switch(c)
   {
    case '\f':
      lcd_send_byte(0,1);
      delay_ms(2);
      break;

    case '\n':
       lcd_gotoxy(1,2);
       break;

    case '\b':
       lcd_send_byte(0,0x10);
       break;

    default:
       lcd_send_byte(1,c);
       break;
   }
}

//------------------------------
#ifdef USE_LCD_RW
char lcd_getc(int8 x, int8 y)
{
char value;

lcd_gotoxy(x,y);

// Wait until busy flag is low.
while(bit_test(lcd_read_byte(),7));

output_high(LCD_RS);
value = lcd_read_byte();
output_low(lcd_RS);

return(value);
}
#endif

when I separate my lcd display from my main board, everything is stopped and don't run. whereas I didnT use lcd commands when I seperate the lcd from my board.
What is that's reason and what is the solution?
MiniMe



Joined: 17 Nov 2009
Posts: 50

View user's profile Send private message

PostPosted: Tue Jul 26, 2011 4:15 am     Reply with quote

Hi, zamzam23

You need to set up some registers inside LCD, before display something on display. To do that u need simply run function: void lcd_init(void) after every time you connect the LCD to your board.
zamzam23



Joined: 25 Aug 2010
Posts: 47

View user's profile Send private message

PostPosted: Tue Jul 26, 2011 4:39 am     Reply with quote

no problem with showing characters on lcd. my problem is when I keep apart my lcd display from the main board, my cpu is turn off but when I touch the pin's of lcd, the cpu is turn on again. I think this code is the problem but the programmer of the flex_ldc.c must reply this question how can I fix it?
while(bit_test(lcd_read_byte(),7)) ;
temtronic



Joined: 01 Jul 2010
Posts: 9225
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Tue Jul 26, 2011 5:01 am     Reply with quote

It sounds like a hardware problem NOT a software problem. If the LCD worked fine when on the main board and you only have problem when it's away, then your wiring is not correct.Recheck all the connections(probably 10, 4 data,3 control ,3 power ?).
MiniMe



Joined: 17 Nov 2009
Posts: 50

View user's profile Send private message

PostPosted: Tue Jul 26, 2011 5:05 am     Reply with quote

I do not have much experience with similar problems.

Things i can think of:
- If you have one or more power sources u must keep grounds together.
- Check your wire connections, you might think.. believe maybe, that tease soldering are well done, but often the problems like that are originated from bad contact point.
- Check your contrast pin voltage. Use a potentiometer voltage divider.
- Write simplest program to test your hardware with it.
- if you desperate enough, then just re do everything. Usually its the simplest solution.
zamzam23



Joined: 25 Aug 2010
Posts: 47

View user's profile Send private message

PostPosted: Tue Jul 26, 2011 5:08 am     Reply with quote

My all project works fine( if the connections are wrong, the system doesnT work).
For example my project works for 3-4 hours and then just stopped one where. Then sometimes I touch the lcd pins and it works again sometimes doesn't work. If that time I reset my card and it works again.

So I thought that my lcd driver locked down somewhere. I am tring to find this. Thanks for all replies.
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Tue Jul 26, 2011 12:09 pm     Reply with quote

Quote:

Then sometimes I touch the lcd pins and it works again sometimes
doesn't work. So I thought that my lcd driver locked down somewhere.

must reply this question how can I fix it?
while(bit_test(lcd_read_byte(),7)) ;

The Flex LCD driver can be configured so it doesn't read the lcd's busy bit.
This is how to do it:

1. Comment out this line, as shown below:
Code:
// #define USE_LCD_RW   1


2. Disconnect the the R/W signal from the PIC. Then connect the R/W pin
on the LCD to ground. Leave PIC pin D2 not connected to anything.
Now you are using a "6-pin" LCD interface.

3. Re-compile the program and test it.


If it's not easy to disconnect the R/W pin from the PIC, there is another
way to do it. Just add a line of code at the start of main() to set the
R/W pin to a logic 0 level. Example:
Code:

output_low(LCD_RW);
Ttelmah



Joined: 11 Mar 2010
Posts: 19506

View user's profile Send private message

PostPosted: Tue Jul 26, 2011 2:47 pm     Reply with quote

zamzam23 wrote:
My all project works fine( if the connections are wrong, the system doesnT work).
For example my project works for 3-4 hours and then just stopped one where. Then sometimes I touch the lcd pins and it works again sometimes doesn't work. If that time I reset my card and it works again.

So I thought that my lcd driver locked down somewhere. I am tring to find this. Thanks for all replies.


Seriously, there are levels of 'wrong connection'. I'd have to agree you have a hardware problem. Probably most of the pins are going to the right places (which is why it works), but at least one is resistive.
Or _grounds_, as the first suggestion from MiniMe. A lot of CMOS components, will 'apparently work', without either ground, or +5v connections. They work, because the internal diodes in the CMOS gates, and the capacitance on the board, act together, so the capacitor's +ve end charges to the highest voltage coming from any of the input signals, and the -ve end charges to the lowest voltage coming from any of the signals. Result is, the circuit powers up, but powered from the logic signals, and with very little noise margin on the signals, so a tiny glitch then stops it working.

You really need to physically 'bus through' each connection wire.

Best Wishes
zamzam23



Joined: 25 Aug 2010
Posts: 47

View user's profile Send private message

PostPosted: Wed Jul 27, 2011 12:18 am     Reply with quote

thanks for your replies. I have solved the problem with PCM programmer suggestions. Ttelmah and other friends, thanks you all too.
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group