Autor Tema: Modificación de lcd.c para funcionar con cualquier puerto  (Leído 4825 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Modificación de lcd.c para funcionar con cualquier puerto
« 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);
}



Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Modificación de lcd.c para funcionar con cualquier puerto
« Respuesta #1 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.

Desconectado T0ni0

  • PIC16
  • ***
  • Mensajes: 196
RE: Modificación de lcd.c para funcionar con cualquier puerto
« Respuesta #2 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
- T0ni0 -
30RCF112

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Modificación de lcd.c para funcionar con cualquier puerto
« Respuesta #3 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

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Modificación de lcd.c para funcionar con cualquier puerto
« Respuesta #4 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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Modificación de lcd.c para funcionar con cualquier puerto
« Respuesta #5 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

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Modificación de lcd.c para funcionar con cualquier puerto
« Respuesta #6 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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Modificación de lcd.c para funcionar con cualquier puerto
« Respuesta #7 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.


Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Modificación de lcd.c para funcionar con cualquier puerto
« Respuesta #8 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

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Modificación de lcd.c para funcionar con cualquier puerto
« Respuesta #9 en: 20 de Agosto de 2004, 02:32:00 »
Ya no estoy en casa, pero deseando llegar para probarla.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Modificación de lcd.c para funcionar con cualquier puerto
« Respuesta #10 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?

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Modificación de lcd.c para funcionar con cualquier puerto
« Respuesta #11 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.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Modificación de lcd.c para funcionar con cualquier puerto
« Respuesta #12 en: 21 de Agosto de 2004, 04:19:00 »
Ya está subido.Proteus lo simula bien.
Suerte!!

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: Modificación de lcd.c para funcionar con cualquier puerto
« Respuesta #13 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.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: Modificación de lcd.c para funcionar con cualquier puerto
« Respuesta #14 en: 23 de Agosto de 2004, 06:56:00 »
No has probado con el martillo ??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.