TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: elfrancho en 02 de Agosto de 2010, 11:50:03

Título: Muchas dudas sobre LCD
Publicado por: elfrancho en 02 de Agosto de 2010, 11:50:03
Hola a todos antes que nada felicitarlos por todo el material que hay en esta web
Mis inquietudes son las siguientes:

Me compré una placa entrenadora: tiene un LCD 16x2 y está conectado de esta manera:

D4   PORTD,4
D5   PORTD,5
D6   PORTD,6
D7   PORTD,7
E     PORTE,2
RS   PORTE,1
R/W  GND

Bueno no e conseguido imprimir nada en él, no se como configurar la libreria lcd.c ya que tengo el bus datos y de control en distintos puertos

Alguien tiene idea como se debería hacer esto?



Dejo un código con el que he probado:
Código: [Seleccionar]
#include <18F4620.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES NOPROTECT                //Code not protected from reading
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES BORV21                   //Brownout reset at 2.1V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES MCLR                     //Master Clear pin enabled

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)


#define LCD_ENABLE_PIN PIN_E2
#define LCD_RS_PIN PIN_E1
#define LCD_RW_PIN PIN_E0
#define LCD_DATA_PORT PORTD
#define LCD_TYPE 2
#define LCD_TRIS_LOCATION TRISD
#include <lcd.c>

#use fast_io (a)
#use fast_io (b)
#use fast_io (c)
#use fast_io (d)

void main()
{
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF|ADC_TAD_MUL_0);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(False);
   delay_ms(500);
   

   lcd_init();
   delay_ms(500);
   lcd_putc("\fPRUEBA\n");
   delay_ms(500);



}
Título: Re: Muchas dudas sobre LCD
Publicado por: MGLSOFT en 02 de Agosto de 2010, 12:03:49
Deberias poner el codigo de la libreria lcd.c que usas, ya que hay varias versiones, incluso las ultimas estan preparadas para otros tipos de pics.

Ademas creo que hay algun problema cuando declaras el pin R/W en Pin_E0.
Si realmente ese pin no esta conectado tendrias un problema que puede ser el causante de que el LCD no funcione...
Título: Re: Muchas dudas sobre LCD
Publicado por: elfrancho en 02 de Agosto de 2010, 12:07:18
Muchas gracias por tu rapidez!!!

aquí te dejo la librería:

Código: [Seleccionar]

///////////////////////////////////////////////////////////////////////////
////                             LCDD.C                                ////
////                 Driver for common LCD modules                     ////
////                                                                   ////
////  lcd_init()   Must be called before any other function.           ////
////                                                                   ////
////  lcd_putc(c)  Will display c on the next position of the LCD.     ////
////                     The following have special meaning:           ////
////                      \f  Clear display                            ////
////                      \n  Go to start of second line               ////
////                      \b  Move back one position                   ////
////                                                                   ////
////  lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1)    ////
////                                                                   ////
////  lcd_getc(x,y)   Returns character at position x,y on LCD         ////
////                                                                   ////
///////////////////////////////////////////////////////////////////////////
////        (C) Copyright 1996,2003 Custom Computer Services           ////
//// This source code may only be used by licensed users of the CCS C  ////
//// compiler.  This source code may only be distributed to other      ////
//// licensed users of the CCS C compiler.  No other use, reproduction ////
//// or distribution is permitted without written permission.          ////
//// Derivative programs created using this software in object code    ////
//// form are not restricted in any way.                               ////
///////////////////////////////////////////////////////////////////////////

// As defined in the following structure the pin connection is as follows:
//     D0  enable
//     D1  rs
//     D2  rw
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7
//
//   LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B
// #define use_portb_lcd TRUE


struct lcd_pin_map {                 // This structure is overlayed
           BOOLEAN enable;           // on to an I/O port to gain
           BOOLEAN rs;               // access to the LCD pins.
           BOOLEAN rw;               // The bits are allocated from
           BOOLEAN unused;           // low order up.  ENABLE will
           int     data : 4;         // be pin B0.
        } lcd;


#if defined use_portb_lcd
   #locate lcd = getenv("sfr:PORTB")    // This puts the entire structure over the port
   #define set_tris_lcd(x) set_tris_b(x)
#else
   #locate lcd = getenv("sfr:PORTD")    // This puts the entire structure over the port
   #define set_tris_lcd(x) set_tris_d(x)
#endif


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


BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.


                             // The following are used for setting
                             // the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in



BYTE lcd_read_byte() {
      BYTE low,high;
      set_tris_lcd(LCD_READ);
      lcd.rw = 1;
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_lcd(LCD_WRITE);
      return( (high<<4) | low);
}


void lcd_send_nibble( BYTE n ) {
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(2);
      lcd.enable = 0;
}


void lcd_send_byte( BYTE address, BYTE n ) {

      lcd.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ;
      lcd.rs = address;
      delay_cycles(1);
      lcd.rw = 0;
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}


void lcd_init() {
    BYTE i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING[i]);
}


void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE 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;
   }
}

char lcd_getc( BYTE x, BYTE y) {
   char value;

    lcd_gotoxy(x,y);
    while ( bit_test(lcd_read_byte(),7) ); // wait until busy flag is low
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
}



Y entonces como deberia configurar el pin R/W ???


Título: Re: Muchas dudas sobre LCD
Publicado por: elfrancho en 02 de Agosto de 2010, 12:15:16
Deberias poner el codigo de la libreria lcd.c que usas, ya que hay varias versiones, incluso las ultimas estan preparadas para otros tipos de pics.

Ademas creo que hay algun problema cuando declaras el pin R/W en Pin_E0.
Si realmente ese pin no esta conectado tendrias un problema que puede ser el causante de que el LCD no funcione...

En el post de arriba pogué el LCD.C, tengo un 16f877 también para probar pero no he conseguido mostrar nada en el LCD...
Vos decís que el problema puede estar en el pin R/W ?
Título: Re: Muchas dudas sobre LCD
Publicado por: MGLSOFT en 02 de Agosto de 2010, 16:04:36
Esa libreria no te permite utilizar los pines de dos puertos distintos.
Prueba poner todo en PortD o en PortB, asi ves si funciona tu codigo.
Hay una libreria de lcd que si permite usar pines de puertos distintos, se llama flexlcd.c

Buscala en el foro que esta en diferentes lugares colgada por los foristas, la verdad es que no se si viene incluida en el CCS.
Título: Re: Muchas dudas sobre LCD
Publicado por: J1M en 02 de Agosto de 2010, 16:09:18
Te recomiendo el 'flexible LCD Driver' de los foros de CCS:
http://www.ccsinfo.com/forum/viewtopic.php?t=24661

Un saludo
Título: Re: Muchas dudas sobre LCD
Publicado por: elfrancho en 02 de Agosto de 2010, 22:29:29
Esa libreria no te permite utilizar los pines de dos puertos distintos.
Prueba poner todo en PortD o en PortB, asi ves si funciona tu codigo.
Hay una libreria de lcd que si permite usar pines de puertos distintos, se llama flexlcd.c

Buscala en el foro que esta en diferentes lugares colgada por los foristas, la verdad es que no se si viene incluida en el CCS.

Hola, estas seguro que no te permite conectar por dos puertos??? Yo quiero usar los bits de datos por el mismo puerto... y los de control (E RS y RW) por otro... esto no se puedo???

Gracias!!!
Título: Re: Muchas dudas sobre LCD
Publicado por: elfrancho en 02 de Agosto de 2010, 23:06:31
Te recomiendo el 'flexible LCD Driver' de los foros de CCS:
http://www.ccsinfo.com/forum/viewtopic.php?t=24661

Un saludo
Muchas Gracias con esta librería si pude... !!!
Título: tipo de LCD
Publicado por: ZAROD2010 en 31 de Agosto de 2010, 01:07:18
Hola, tengo un LCD color azul de 32 pines, 16 por lado (lado arriba y lado abajo) (1 línea = 16 pines), no sé que tipo es, en la placa dice 1620A-17, usando una línea (la de arriba) me sale bien, puedo mostrar mensajes, aunque no se ilumina el LCD. Mi pregunta es, para qué sirve la línea 2 (línea de abajo) de 16 pines, será para configurar la iluminación y el constraste?. Espero que alguien me ayude.

Rómulo
Título: Re: tipo de LCD
Publicado por: berlanga en 31 de Agosto de 2010, 08:22:01
Hola, tengo un LCD color azul de 32 pines, 16 por lado (lado arriba y lado abajo) (1 línea = 16 pines), no sé que tipo es, en la placa dice 1620A-17, usando una línea (la de arriba) me sale bien, puedo mostrar mensajes, aunque no se ilumina el LCD. Mi pregunta es, para qué sirve la línea 2 (línea de abajo) de 16 pines, será para configurar la iluminación y el constraste?. Espero que alguien me ayude.

Rómulo

sabes el fabricante? porque tirando de google no veo nada que nos solucione la papeleta... (tampoco he tenido mucho tiempo)la retroiluminación suele ir en un lateral... y el contraste en la misma fila de pines que los datos...
Título: Re: Muchas dudas sobre LCD
Publicado por: ASTROCAR en 31 de Agosto de 2010, 09:35:17
Esa libreria no te permite utilizar los pines de dos puertos distintos.
Prueba poner todo en PortD o en PortB, asi ves si funciona tu codigo.
Hay una libreria de lcd que si permite usar pines de puertos distintos, se llama flexlcd.c

Buscala en el foro que esta en diferentes lugares colgada por los foristas, la verdad es que no se si viene incluida en el CCS.

Hola, estas seguro que no te permite conectar por dos puertos??? Yo quiero usar los bits de datos por el mismo puerto... y los de control (E RS y RW) por otro... esto no se puedo???

Gracias!!!

Hola buenos dias me permites un rato en este post segun lo que te comento el colega es que con la libreria que estas usando no puedes manejar el lcd dos dos puertos del pic pero que si existen otras libreria que te puedes ayudar para tu proposito el mensiono hasta el nombre flexlcd algo asi yo no te doy muchos detaller porque ahorita estoy un poco retirado de c pero recuerdo haberla usado y si funciona para declarar la lcd en dos puertos; ojo: el bus de data de la lcd siempre tiene que estar en un mismo puerto sino no te funcionara.

saludos y espero me entiendas.
Atten.
Alexander Santana.
Barcelona-Venezuela.
Título: Re: tipo de LCD
Publicado por: ASTROCAR en 31 de Agosto de 2010, 09:43:13
Hola, tengo un LCD color azul de 32 pines, 16 por lado (lado arriba y lado abajo) (1 línea = 16 pines), no sé que tipo es, en la placa dice 1620A-17, usando una línea (la de arriba) me sale bien, puedo mostrar mensajes, aunque no se ilumina el LCD. Mi pregunta es, para qué sirve la línea 2 (línea de abajo) de 16 pines, será para configurar la iluminación y el constraste?. Espero que alguien me ayude.

Rómulo

Hola buenos dias, oye primero que todo amigo te recomiendo que leas sobre las lcd para que aclares un poco las dudas ya que veo que tienes un poco de confuncion en el tema la lcd a la cual haces referencia es una lcd de 2fila 16 columnas eso quieres decir que en ambas lineas puedes escribir mensajes, ahora el que no te ilumine en sus pines de contacto tiene unos que son para ilimunar la lcd se llaman anodo y cadoto pero para eso lo mejor es buena la hoja de datos de tu lcd y asi puedes saber para que es cada cosa.

Saludos y disculpa mi manera pero es sin animos a ofenderte es otro aclarandote tu dudas.
Atten.
Alexander Santana
Barcelona Venezuela.
Título: Re: Muchas dudas sobre LCD
Publicado por: ASTROCAR en 31 de Agosto de 2010, 09:48:21
Te recomiendo el 'flexible LCD Driver' de los foros de CCS:
http://www.ccsinfo.com/forum/viewtopic.php?t=24661

Un saludo
Muchas Gracias con esta librería si pude... !!!
Oye disculpa no habia leido este en el cual ya comentabas que si pudistes con esa otra libreria.

Saludos.
Atten.
Alexander Santana.
Barcelona-Venezuela.
Título: Re: Muchas dudas sobre LCD
Publicado por: flyingjoint en 21 de Septiembre de 2010, 15:31:26
buen dia:

Estoy empezando a aprender a programar PIC's en C, he leido lo suficiente pero hay varias dudas que tengo al respecto. En cuanto al LCD los links que pusieron sobre el "flex lcd.c" es para poder conectar las salidas del lcd a cualquiera de los pines del Micro, pero mi pregunta es ¿Esa libreria es para conectar el LCD a 8 líneas o sólo para 4? porque al según por lo que entendi del programa es para 4 líneas, y tengo entendido que si lo hago con 8 la comunicación es más rápida, es un LCD de 16 bits y 2 líneas con el que trabajo. Además tengo que crear la libreria y ponerla en la carpeta de drivers del compilador ¿Verdad?. Estoy usando el PIC 16F784. En realidad, mire a detalle la librerica lcd.c y tiene razón en cuanto a que todas las líneas deben de ir al mismo puerto. Espero puedan resolver mi duda. Gracias
Título: Re: Muchas dudas sobre LCD
Publicado por: Suky en 21 de Septiembre de 2010, 16:26:48
Es a 4 lineas. Y la diferencia de velocidad es mínima, ~1us. No creo que afecte.


Saludos!
Título: Re: Muchas dudas sobre LCD
Publicado por: meledu en 28 de Septiembre de 2010, 10:01:44
Hola amigos les comento que recien me sumergi en el mundo de la programacion en C y resulta que no es tan dificil como lo pensaba, pero hay una duda que me acongoja y es que no he logrado mostrar nada en un lcd 2x16, me he contruido una placa entrennadora(la suvire aver si les sirve,es compatible con amicus,aunque yo la uso con un 16f876a) en la cual  he colocado un conector para un lcd, el orden de pines es bus de datos de RB4 a RB7 , RB2 como RS y RB3 como Enable,el pin de RW lo he puesto a tierra, yo estaba programando en basic y mi entrenadora funciona bien he logrado mostrar todo lo que he querido,comunicacion serial y varia otras cosas pero he decicido ppasarme a C para asi tener un mejor contro del tiempo y tambien la performance del micro ,volviendo al tema del lcd he usado el fichero que viene por defecto en el CCS pero he modificado lo pines ,solo he tenido problemas con el pin RW ya que si lo coloco como  unused me da un error de compilacion, entonces lo he puesto a rb1,mi programa de prueva funciona bien en Proteus colocando todos los pines en segun el ficero LCD.C pero si pongo el pin RW a tierra Como en  mi placa se come algunos caracteres,todo esto ocurre en el simulador, entonces decidi probar en la vida real ,pero resulta que no funciona ,nisiquiera llega a inicializar la lcd ,he probado con y sin pin RW ,tube que hacer un puente para lograr esto ya que en mi board estaba soldado a tierra, he probado en basic y funciona bien configurando el RW y sin configurar tambien, tambien he probado con un fichero que baje de una pagina UCont.... que pone el orden de pines casi como en mi board solo que tube que invertir E y RS pero tampoco funca.
estoy usando un PIC16F876a con un xtal de 20Mhz.
PD:uso C porque quiero tener mejores resultados que con basic asi que no estoy muy seguro de usar el ficehro flexible lcd ya que segun lei ocupa un 50% mas de memoria.
Tambien quiero saber si esque es verdad que obtendre mejores resultados ya que tengo varias dudas entre ellas ,el uso de los ficheros ya que traen muchas veces cosas que no llegamos a necesitar, como por ejemplo varias lineas de codigo con la cual se elige entre un puerto y otro segun se requiera.
Muchas gracias  amigos por toda la ayuda que siempre he encontrado aquí.   
Título: Re: Muchas dudas sobre LCD
Publicado por: Suky en 28 de Septiembre de 2010, 10:48:02
No es la manera correcta de configurar la librería, no hay que asignarle cualquier pin si no se usa, sino decirle que no lo use para que genere la demora necesaria que necesita el LCD. No se si la librería que trae CCS permite eso (No la uso  :mrgreen: ), mejor busca lcd_flex, es más flexible a todos los cambios.


Saludos!
Título: Re: Muchas dudas sobre LCD
Publicado por: meledu en 28 de Septiembre de 2010, 14:39:07
Hola Suky , gracias por responder, lo que pasa esque esa libreria ocupa mucho espacio, y como dije mi intencion al pasarme a C es que quero mejorar el rendimiento del pic , lo quiero aprevechar mejor que con basic, y no me parece que una buena opcion sea esta libreria, y como te dije lo he probado tambien conectandole el pi RW (le quite la tierra y le conecte a RB1)pero tampoco anda,lo raro esuqe en el proteus si funciona.
Título: Re: Muchas dudas sobre LCD
Publicado por: Suky en 28 de Septiembre de 2010, 15:20:31
Dibujando en el aire es difícil comprender, muéstranos como estás usando la librería y como lo conectas.


Saludos!
Título: Re: Muchas dudas sobre LCD
Publicado por: meledu en 28 de Septiembre de 2010, 16:00:12
Amigos una duda,ya he logrado hacerle funcionar ,con el flex_lcd, pero lo que pasa es que me he dado cuenta que usa mucha memoria ,una vez compilado me usa hasta la posicion 0x130 e memoria ,en cambio he escrito el mismo programa en basic y al momento de programarlo solo me usa hasta la psicion C0 de memoria,esto lo he podido ver al cargar el programa en el pickit 2.
Entonces mi duda es la siguiente, yo me pase a C porque queria aprovechar al maximo los recursos del pic, no porque lo necesite a toda costa sino porque asi debe ser, pero me estoy desanimando un poco y por eso queria ver que me dicen ustedes al respecto .