TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pablo en 04 de Julio de 2007, 13:23:13

Título: LCD otra distribucion
Publicado por: pablo en 04 de Julio de 2007, 13:23:13
Hola gente, por como tengo diagramada la plaqueta necesito que la configuracion de las patas sea distinta a la normal y trate de modificar una libreria conocida por ustedes que es la Flex Grid pero no puedo lograr que prenda el display.
Si alguien se da cuenta de que es lo que tengo que cambiar para lograrlo desde ya estaria muy agradecido.

Les paso la libreria y en las primeras lineas van a ver como necesito conectarlo. Muchas gracias.

// flex_lcd.c

#define LCD_LINEA1 0x80 // Direccion de memoria para la 1 linea
#define LCD_LINEA2 0xc0 // Direccion de memoria para la 2 linea
#define LCD_LINEA3 0x94 // Direccion de memoria para la 3 linea
#define LCD_LINEA4 0xd4 // Direccion de memoria para la 4 linea

// Change these pins to fit your own board.

#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B3
#define LCD_DB6 PIN_B2
#define LCD_DB7 PIN_B1

#define LCD_RS PIN_B7
#define LCD_RW PIN_B6
#define LCD_E  PIN_B5


// 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
  0xc, // Display on
  1, // Clear display
  6 // Increment cursor
};


//-------------------------------------
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_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);

    // 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( byte x, byte y) {
byte dir;
if(y == 1)
   dir=LCD_LINEA1;
else if(y == 2)
   dir=LCD_LINEA2;
else if(y == 3)
   dir=LCD_LINEA3;
else if(y == 4)
   dir=LCD_LINEA4;

//if(y!=1)
//dir=LCD_LINEA2;
//else
//dir=0;

dir+=x-1;
lcd_send_byte(0, 0x80 | dir);
}
//-----------------------------
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

void lcd_setcursor_vb(short visible, short blink) {
  lcd_send_byte(0, 0xC|(visible<<1)|blink);
}
Título: Re: LCD otra distribucion
Publicado por: jfh900 en 04 de Julio de 2007, 14:58:26
Casi seguro que tu problema no está en la librería, ya que está muy probada y funciona perfectamente. El problema está en le resto de elementos que utilizas. Puedes postear tu programa completo? y el esquema completo de tu circuito?

A partir de estos datos podremos buscar el fallo.

Un saludo
Título: Re: LCD otra distribucion
Publicado por: pablo en 04 de Julio de 2007, 17:01:43
No el soft esta probado con la libreria y funciona perfecto pero el tema es que yo necesito modificarle la posicion de las patas.

Antes estaba asi
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7

#define LCD_RS PIN_B1
#define LCD_RW PIN_B2
#define LCD_E  PIN_B3

Ahora lo necesito de esta forma ahi es donde deja de funcionar.
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B3
#define LCD_DB6 PIN_B2
#define LCD_DB7 PIN_B1

#define LCD_RS PIN_B7
#define LCD_RW PIN_B6
#define LCD_E  PIN_B5


Gracias.
Pablo
Título: Re: LCD otra distribucion
Publicado por: jfh900 en 04 de Julio de 2007, 17:12:04
Te sigo diciendo lo mismo con la información que das no podemos decirte mucho.

Un saludo
Título: Re: LCD otra distribucion
Publicado por: pablo en 04 de Julio de 2007, 17:33:31
Te cuento que con la libreria flex grid funciona perfecto desde hace mas de un año el tema es que quiero modificar la placa y esto cambiaria la disposicion de la coneccion del LCD al pic. Para eso trate de modificar la libreria porque los pines no quedarian como estaban originalmente. Si queres yo te paso el soft pero tiene 1500 lineas, todo funciona bien el tema es que ahora modifique la placa y necesito conectar el display alrevez de como esta conectado originalmente en la libreria.

No se si me pude explicar bien, me cuesta un poco tratar de explicarlo.

Si necesitas el soft decime como te lo paso, pero lo tengo funcionando y no tiene problemas, el tema es que necesito conectar el LCD de otra forma para eso tengo que cambiar la libreria y ahi es donde no funciona.

Gracias por la ayuda.
Título: Re: LCD otra distribucion
Publicado por: jfh900 en 04 de Julio de 2007, 19:22:17
Según lo que comentas parece que el problema es de conexión del LCD. Asegúrate que todas las patillas están bien puestas (Alimentación y Brillo), así como el resto de las patillas. Coge un polímetro y mide desde el pín de conexión del LCD hasta la patilla correspondiente del integrado haber si alguna conexión falla o esta cambiada.

Un saludo
Título: Re: LCD otra distribucion
Publicado por: pablo en 04 de Julio de 2007, 20:52:27
Si eso lo medi y esta bien, el tema es que estoy invirtiendo todos los pines y no se si solo cambiando las variables que cambie deberia funcionar. Vos te acordas quien es el que hizo esta funcion? Me parece que era alguien del foro.
Título: Re: LCD otra distribucion
Publicado por: jfh900 en 04 de Julio de 2007, 20:56:29
Claro que tiene que funcionar, está pensado para que se pueda poner los pines que queramos.

Un saludo
Título: Re: LCD otra distribucion
Publicado por: pablo en 04 de Julio de 2007, 22:31:11
Acabo de probar varias configuraciones y cuando pongo los pines RS, RW y E despues de los de datos ahi no funciona.
Ahora cuando los pongo antes por ejemplo RS, RW, E y datos ahi funciona.

No me doy cuenta que puede ser.
Título: Re: LCD otra distribucion
Publicado por: jfh900 en 04 de Julio de 2007, 22:33:46
¿Qué microcontrolador estas usando? Haber si es un problema de polarización del puerto B.

Un saludo
Título: Re: LCD otra distribucion
Publicado por: pablo en 04 de Julio de 2007, 22:36:58
Estoy usando el 18f452 y lo estoy simulando en el proteus con el mismo.

Perdoname si no te sigo en algo pero no se electronica, lo hice de hobby para poder controlar una pecera.

Gracias.
Título: Re: LCD otra distribucion
Publicado por: jfh900 en 04 de Julio de 2007, 22:44:55
Tienes activadas las resistencias de polarización internas del pic?. Si utilizas CCS puedes pones al principio del programa:

port_b_pullups(TRUE);

Un saludo
Título: Re: LCD otra distribucion
Publicado por: pablo en 04 de Julio de 2007, 22:57:25
Lo acabo de poner pero no pasa nada.
Título: Re: LCD otra distribucion
Publicado por: jfh900 en 04 de Julio de 2007, 23:00:32
Puedes poner el fichero de la simulación y el programa en .Hex, para simularlo y ver que es lo que pasa?

Un saludo.
Título: Re: LCD otra distribucion
Publicado por: pablo en 04 de Julio de 2007, 23:09:49
No se como colgarlo, si queres te lo paso por mail.
Si no decime como puedo colgarlo.
mi mail es pablofiscella@yahoo.es

Gracias.
Título: Re: LCD otra distribucion
Publicado por: jfh900 en 05 de Julio de 2007, 06:23:53
1º) Comprime en un fichero el fuente, el .hex y el fichero del proteus.

2º) Subirlo a www.rapidshare.com

3º) Poner el enlace en el foro, en este hilo.

En cuanto lo subas lo simulo y veo haber que puede fallar.

Un saludo
Título: Re: LCD otra distribucion
Publicado por: pablo en 05 de Julio de 2007, 11:08:02
Gracias

http://rapidshare.com/files/41162494/Termometro_PIC18452.rar.html
Título: Re: LCD otra distribucion
Publicado por: Menta en 05 de Julio de 2007, 13:13:00
Puede ser una tontería, pero no encuentro en la librería las sentencias de tris ni en el programa o ahora que lo pienso eso es sólo para fast IO ¿?

No lo puedo simular, cuál es la versión de proteus en la que está??
Título: Re: LCD otra distribucion
Publicado por: jfh900 en 05 de Julio de 2007, 14:07:31
Joer (perdonarme la expresión) por fin ya funciona:

(http://img232.imageshack.us/img232/3557/acuarioxt7.th.jpg) (http://img232.imageshack.us/my.php?image=acuarioxt7.jpg)

Veras cual es el problema:

Tu tienes una librería para manejar el lcd que se llama: lcd420.c. Esta librería está modificada para poder conectar los pines del lcd como queramos. Tú tienes la copia modificada posiblemente en tu directorio de trabajo, pero en el directorio de librerías de CCS tienes la librería original sin modificar. Si utilizas la librería original los pines son fijos:

Código: C
  1. // As defined in the following structure the pin connection is as follows:
  2. //     B0  enable
  3. //     B1  rs
  4. //     B2  rw
  5. //     B4  D4
  6. //     B5  D5
  7. //     B6  D6
  8. //     B7  D7
  9. //
  10. //   LCD pins D0-D3 are not used and PIC B3 is not used.

Esto es el conexionado de los pines según la librería original.

¿Cual es el problema entonces?, muy sencillo: es algo que se suele pasar por alto al programar en C pero que es sumamente importante:

Cuando una libreria se refiere así: <libreria.c> LA ESTAMOS BUSCANDO EN EL DIRECTORIO DE LIBRERIAS POR DEFECTO DEL COMPILADOR

Cuando la referenciamos así: "libreria.c" La buscamos en el directorio de trabajo.

Como se ha solucionado: cambiando <lcd420> por "lcd420" con lo que ha cogido la librería correcta y funciona sin problemas.

Fíjate que cuando ponías las conexiones como decía la librería original funcionaba ya que estaba tomando esta librería, pero al cambiar cualquiera de los pines dejaba de funcionar por seguir tomando la misma librería.

Un saludo y perdón por el discurso.
Título: Re: LCD otra distribucion
Publicado por: Giovanny en 05 de Julio de 2007, 14:43:10
tambien me sucedio eso alguna vez, pero son de las cosas que solo pasan una vez, asi que Pablo, adelante con tu proyecto
Título: Re: LCD otra distribucion
Publicado por: pablo en 05 de Julio de 2007, 15:03:12
NNNNOOOO, soy un bolu$%, tenes razon, estaba trabadicimo y no me daba cuenta, mil gracias. Si no fuera por todos uds. nunca hubiera podido hacerme este aparatito.

Muchas gracias.
Saludos.
Pablo
Título: Re: LCD otra distribucion
Publicado por: jfh900 en 05 de Julio de 2007, 20:54:46
¿Entonces funciona?

Un saludo
Título: Re: LCD otra distribucion
Publicado por: pablo en 05 de Julio de 2007, 22:49:34
Si funciona perfecto, ya lo probe en una placa que tenia y va de 10.

Mil gracias.