TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Modulay en 19 de Agosto de 2004, 05:23:00

Título: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Modulay en 19 de Agosto de 2004, 05:23:00
Este CCS es un tanto puñetero,pero por fin me ha dejado manusearle el archivito para que podamos enchufar nuestro lcd al puerto que mejor nos venga (A,B,C ó D).Lo he probado en el puerto b que es donde tengo puesto yo el lcd,así que debe funcionar también en los otros.Prueben a ver que tal.Les pasteo el archivo completo:
Codigo:

///////////////////////////////////////////////////////////////////////////
////                             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                            ////
////                      
  Go to start of second line               ////
////                        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.                               ////
///////////////////////////////////////////////////////////////////////////


// Podemos descomentar cualquiera de las líneas siguientes,dependiendo
// del puerto que vayamos a usar,ó podemos incluir la línea correspondiente
// en el programa antes de la línea << #include "lcd.c" >>
// Si no hacemos ninguna de las dos cosas,se usa por defecto el puerto D

//#define use_porta_lcd TRUE
//#define use_portb_lcd TRUE
//#define use_portc_lcd TRUE


struct lcd_pin_map {
           BOOLEAN unused;    
           BOOLEAN rs;
           BOOLEAN rw;
           BOOLEAN enable;
           int data : 4;
        } lcd;


#if defined use_porta_lcd
  #if defined(__PCH__)
    #byte lcd = 0xF80      // PUERTO A GAMA 18
  #else
    #byte lcd = 5          // PUERTO A GAMA INFERIOR
  #endif
  #define set_tris_lcd(x) set_tris_a(x)
#else
  #if defined use_portb_lcd
    #if defined(__PCH__)
      #byte lcd = 0xF81    // PUERTO B GAMA 18
    #else
      #byte lcd = 6        // PUERTO B GAMA INFERIOR
    #endif
    #define set_tris_lcd(x) set_tris_b(x)
  #else
    #if defined use_portc_lcd
      #if defined(__PCH__)
        #byte lcd = 0xF82  // PUERTO C GAMA 18
      #else
        #byte lcd = 7      // PUERTO C GAMA INFERIOR
      #endif
      #define set_tris_lcd(x) set_tris_c(x)
    #else
      #if defined(__PCH__)
        #byte lcd = 0xF83  // PUERTO D GAMA 18
      #else
        #byte lcd = 8      // PUERTO D GAMA INFERIOR
      #endif
      #define set_tris_lcd(x) set_tris_d(x)
    #endif
  #endif
#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);
}


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 "
"   : lcd_gotoxy(1,2);        break;
     case ""   : 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);
}


Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Nocturno en 19 de Agosto de 2004, 05:43:00
Lo probaré en cuanto llegue a casa. Todavía no he sido capaz de sacar algo inteligible por mi LCD.
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: T0ni0 en 19 de Agosto de 2004, 05:50:00
Pues a mi aki       lcd_send_byte(0,LCD_INIT_STRING);  me dice bad expresion syntax
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Modulay en 19 de Agosto de 2004, 05:53:00
Ya,ya he leído por ahí...
No se,pero pueden ser mil los motivos de tu problema,ruidos,la protoboard,el pic...o a unas malas,el lcd.
Si el código te simula bien,debe ir bien tb físicamente
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Modulay en 19 de Agosto de 2004, 06:02:00
No se ha pegado bien el código,y por mas que lo intento,se sigue comiendo trozos.Parece que es por los corchetes.
Lo he subido aqui
Saludos
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Nocturno en 19 de Agosto de 2004, 17:44:00
¿Tienen memoria los LCD?

Es que me pasa una cosa muy extraña. Resulta que tras hacer un millón de pruebas distintas, por todos los puertos del micro habidos y por haber, con un programa que debe sacar por el LCD la palabra "hola", finalmente y sin saber porqué he conseguido que la represente.

Pero ahora, modifico el programa, cambio la palabra por otra, y tras grabar el micro correctamente (comprobado al leerlo con WinPic) sigue saliendo la palabra "hola".

Estoy completamente loco
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Modulay en 20 de Agosto de 2004, 01:01:00
Si has mantenido al lcd alimentado en todo momento,y el segundo programa no ha funcionado bien,veo normal que el display mantenga lo que tenía de antes.Si no es así lo veo de locos.Pues sí que dan tormento los cacharros estos
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Nocturno en 20 de Agosto de 2004, 01:10:00
Lo poco que he dormido esta noche ha sido soñando con el puñetero LCD.

Ya consigo escribir y cambiar el mensaje, para lo cual tengo que:
1. conectar la patilla RW del LCD a la patilla asignada del micro, resetearlo y dejar que grabe el mensaje en el LCD.

2. conectar la patilla RW del LCD a masa, resetear el micro y esperar que el mensaje salga en la pantalla

Y esto sólo funciona a veces; otras veces hago lo mismo y no va.

Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Modulay en 20 de Agosto de 2004, 01:29:00
Modifiqué la librería de nuevo cambiando los retardos que parece que pueden provocar un mal funcionamiento.Pruébala a ver.
http://miarroba.com/foros/ver.php?temaid=2216077&foroid=256746
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Nocturno en 20 de Agosto de 2004, 02:32:00
Ya no estoy en casa, pero deseando llegar para probarla.
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Nocturno en 21 de Agosto de 2004, 03:09:00
Nada de nada, no consigo que funcione ni de coña.

Voy a desmontar todo lo que tengo pinchado en la protoboard y voy a empezar de nuevo, a ver si lo consigo. Ya no sé por dónde continuar (incluso he comprado otro LCD y nada).

Modulay, abusando de tu amabilidad, ¿sería mucho pedirte que pusieras junto a la librería un diseño en Proteus para 16f877A que funcione correctamente y un programa que lance algún mensaje al LCD?
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Modulay en 21 de Agosto de 2004, 03:29:00
No te preocupes,a ver que podemos hacer.
El problema es que yo con proteus no me llevo muy bien y no he conseguido simular un lcd como mandan los canones.Pero miraré a ver.Creo que fué Pocher quien puso por aquí ayer un ejemplillo proteus que nos viene al pelo.Voy a echar un vistazo.
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Modulay en 21 de Agosto de 2004, 04:19:00
Ya está subido.Proteus lo simula bien.
Suerte!!
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Nocturno en 23 de Agosto de 2004, 03:10:00
Gracias por el trabajo Modulay. He estado todo el fin de semana fuera (en las playitas de Huelva) y ayer cuando volví me puse a intentarlo de nuevo.
He desmontado la proto y la he vuelto a montar conectando la pantalla en el PORTB y usando tanto tu nueva librería como tu nuevo programa de ejemplo.

¿El resultado?, lo que imaginas, no funciona.

No sé si será lo último que haga en mi vida, pero seguro que acabo haciéndolo funcionar. Me tiene comida la moral.
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: MGLSOFT en 23 de Agosto de 2004, 06:56:00
No has probado con el martillo ??
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Nocturno en 23 de Agosto de 2004, 07:03:00
Calla, calla, Marcos, que lo tengo allí al lado y he estado tentado de usarlo más de una vez.
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: MGLSOFT en 23 de Agosto de 2004, 07:07:00
Estas utilizando la linea RW del LCD??
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Nocturno en 23 de Agosto de 2004, 07:15:00
Sí, uso las tres señales de control y las cuatro de datos tal y como aparecen en el diseño Proteus que ha posteado Modulay.
Funcionan en proteus pero no me funcionan en real.

He visto que todos usáis los LCD en modo 4-bits, pero tengo entendido que también se pueden usar en modo 8-bits, aunque no he encontrado ningún ejemplo por ahí.

¿Podrá ser que mis LCD sólo funcionen en 8 Bits?, a lo mejor es una pregunta estúpida, pero ya no sé por dónde tirar.
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Modulay en 23 de Agosto de 2004, 07:20:00
No lo creo,Manolo,pero Pocher ha confeccionado ejemplos y librerías para funcionar con una configuración u otra.Búscalos que no recuerdo en qué rincón estaban pero están.
Un saludo
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Nocturno en 23 de Agosto de 2004, 17:19:00
Por fin lo he conseguido.

Finalmente, se va a hacer bueno ese dicho de que en informática, para que algo funcione lo mejor es apagarlo y encenderlo de nuevo.

He desmontado todos los componentes de la protoboard, los he hechado en la caja y los he vuelto a montar, con la fortuna de que el potenciómetro del contraste ha sido distinto. Y ya funcionan mis dos LCDs. El otro potenciómetro, como podéis imaginar, ha acabado incendiado en el cenicero.

Gracias a todos por vuestra ayuda, especialmente a la inestimable colaboración de Modulay.

Ahora puedo seguir aprendiendo C, jejeje
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: Modulay en 24 de Agosto de 2004, 05:35:00
Cuanto más trabajo cuesta hacer funcionar algo,mayor es la satisfacción cuando lo consigues eh...
Enhorabuena!!!!
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: RedPic en 18 de Diciembre de 2005, 09:24:00
Me arranco los cabellos a manojos y no consigo nada ... Llorica

Mi hardware está conectado como podeís ver en el siguiente esquema:



D0 .. D7 al PORTB completo con E, R/W y RS con los conmutadores en RC0 .. RC2

Mi sueño sería poder usarlo en modo de 4 bits con RB0 .. RB3 manteniendo los controles en RC0..RC1 dejando así libres RB4..RB7 Angelito

El hardware no puedo modificarlo (Ver mi placa de desarrollo) así que solo puedo tocar lo que el CCS me permita, y mis escasos conocimientos alcancen.

¿Alguna segurencia del camino por donde puedo tirar? loco

(P.D. en Pic Basic Pro ha funcionado a la primera, tengo para configurar bit a bit lo que quiero usar, pero quiero en hacerlo en CCS porque en Basic me parece dar un paso atrás)



Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: vszener en 18 de Diciembre de 2005, 12:17:00
Ke tal!!!bueno aqui te dejo un link donde se habla de configurar las lcd"s como se desee
http://miarroba.com/foros/ver.php?foroid=46840&temaid=4465289

Suerte!!!Giño
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: RedPic en 18 de Diciembre de 2005, 13:59:00
Rebotado Rebotado Rebotado Rebotado Rebotado

¡Funcionó a la primera!

Lo he adaptado a mi pinout y funciona correctísimamente.

Gracias vszener. ¡Que los dioses electrónicos te sean propicios.!
Título: RE: Modificación de lcd.c para funcionar con cualquier puerto
Publicado por: jfh900 en 18 de Diciembre de 2005, 17:42:00
Esta librería esta bien, pero ahí otra que permite configurar la salida del LCD por cualquier pin.