Autor Tema: lcd no funciona  (Leído 5490 veces)

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

Desconectado narcosystem

  • PIC10
  • *
  • Mensajes: 32
lcd no funciona
« en: 18 de Agosto de 2004, 06:06:00 »
hola foreros, estoy quemadisimo, me he cambiado al 18f452 y no soy capaz de hacer que funcione un lcd de la marca Ampire, he modificado las librerias que vienen con el CCS con las direcciones del 18f452 y por supuesto con el mapa de pines que utilizo y soy incapaz de mostrar las dos lineas, si que puedo sin embargo mostrar una u otra linea independientemente, es decir en dos programas distintos. (esto no hay quien lo entienda, estoy al borde de la desesperacion mas absoluta)Si se os ocurre que puede estar pasando por favor,AYUDADMEEEE!

adjunto codigo que no funciona:

#include "18F452.h"
#use delay(clock=20000000)
#include "puertos.h"
#include "lcd_18f.h"


void main(void){

   
   inicia_puertos();   //configura puertos
     inicia_lcd();      //inicia el lcd

      printf(lcd_putc,"fhola";
      lcd_gotoxy(1,2);
      printf(lcd_putc,"mundo";


   while(1){
 
      }
}


esta es la parte que he cambiado del lcd.c


struct lcd_pin_map {
           int     data : 4;
           boolean enable;
           boolean rs;

        } lcd;

#byte lcd = 0xF80                  // puerto A
#byte pcon = 0xFD0      //Nos indica el ultimo reset

#define set_tris_lcd(x) set_tris_a(x)
#define lcd_linea_dos 0x40    // Dirección de segunda linea


STRUCT lcd_pin_map const LCD_WRITE = {0,0,0}; // Modo escritura, todo salidas


y esta es la configuracion de los puertos


#use fast_IO(a) //Nos permite configurar a nosotros los registros
#use fast_IO(b)   
#use fast_IO(c)
#use fast_IO(d)
#use fast_IO(e)

#byte porta=0xF80
#byte portb=0xF81
#byte portc=0xF82
#byte portd=0xF83
#byte porte=0xF84

void inicia_puertos(void)
{
   set_tris_a(0b00000000);    //lcd
   set_tris_b(0b00000011);    //  pulsadores
   
}



Gracias de antemano por vuestra ayuda.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: lcd no funciona
« Respuesta #1 en: 18 de Agosto de 2004, 08:41:00 »
Resulta muy extraño que cuando escribes en la primera línea lo haga sin problemas y sin embargo con la segunda no te funcione.
Creo que te estás complicando un poco la vida con tantos ficheros de cabecera,al fin y al cabo,estás usando las rutinas de "lcd.c" ¿no?
Si vas a manejar irremisiblemente el lcd con el puerto A,podemos buscar la manera de añadir unas líneas al código de lcd.c para que,con añadir en nuestro programa principal la línea #define use_portX_lcd(siendo X el puerto que vayamos a usar),sea suficiente y no haya que recurrir al uso de ficheros .h adicionales.
Prueba a añadir #define lcd_type 2 a tu código,es posible que esa sea la causa de que no te reconozca la segunda línea del lcd.
Si no funciona,veo mejor optar por hacer las cosas que te he comentado.
Ya nos cuentas.
Un saludo

Desconectado narcosystem

  • PIC10
  • *
  • Mensajes: 32
RE: lcd no funciona
« Respuesta #2 en: 18 de Agosto de 2004, 13:19:00 »
No si lo curioso de todo es que puedo escribir en las dos lineas, pero una sola vez en el programa, lo que no puedo hacer es mostrar las dos a la vez, curiosisimo.

Desconectado narcosystem

  • PIC10
  • *
  • Mensajes: 32
RE: lcd no funciona
« Respuesta #3 en: 19 de Agosto de 2004, 03:11:00 »
esto sigue sin funcionar, ahora no se que he hecho pero no sale ya nada en el lcd, se queda el cursor parpadeando en la primera linea. esto es lo que he modificado en el lcd.c


struct lcd_pin_map {
            int     data : 4;                 // 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
                                       // be pin A0.
        } lcd;



#if defined(__PCH__)
#if defined use_porta_lcd
   #byte lcd = 0xF80                   // This puts the entire structure
#else
   #byte lcd = 0xF83                   // This puts the entire structure
#endif
#else
#if defined use_portb_lcd
   #byte lcd = 6                  // on to port B (at address 6)
#else
   #byte lcd = 8                 // on to port D (at address 8)
#endif
#endif

#if defined use_porta_lcd
   #define set_tris_lcd(x) set_tris_a(x)
#else
   #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


Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: lcd no funciona
« Respuesta #4 en: 19 de Agosto de 2004, 05:31:00 »
He modificado la librería lcd.c para que pueda funcionar con cualquiera de los puertos.
Hazte con ella aqui ,modifica la estructura del mapa de pines según tu conexionado y prueba este programa a ver que tal:
Codigo:

#include <18F452.h>
#use delay(clock=20000000)
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT
#define use_porta_lcd TRUE
#include "lcd.c"


void main()
   {
   lcd_init();
   printf(lcd_putc,"fhola");
   lcd_gotoxy(1,2);
   printf(lcd_putc,"mundo");
   for(;;) {}
   }




Supongo que tendrás el pin RW del lcd puesto a masa ¿no?

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: lcd no funciona
« Respuesta #5 en: 19 de Agosto de 2004, 13:06:00 »
He probado en PROTEUS la rutina de CCS lcd.c para un 18F452 con pines de control en RB0..RB2 y pines de datos en RB4..RB7 y "funciona relativamente bien" mostrando caracteres en las 2 líneas (pero tarda demasiado), eso sí para una frecuencia de 4MHz. Para 20MHz o 40MHz no funciona bien.

Habría que comprobar todo esto físicamente para ver que va bien.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: lcd no funciona
« Respuesta #6 en: 19 de Agosto de 2004, 13:13:00 »
Te refieres a la modificación que hice?
Voy a probar con el resto de puertos,no me fío demasiado de proteus

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: lcd no funciona
« Respuesta #7 en: 19 de Agosto de 2004, 13:23:00 »
No me refiero a la rutina original de CCS lcd.c sin tocarle nada, únicamente habilitando el define del PORTB

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: lcd no funciona
« Respuesta #8 en: 19 de Agosto de 2004, 13:34:00 »
No te entiendo pocher

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: lcd no funciona
« Respuesta #9 en: 19 de Agosto de 2004, 16:49:00 »
Perdon por la intromision, pero es posible que la rutina no funcione bien en Proteus solamente.
No se olviden que los delays que tiene son calculados nuevamente en funcion del reloj que pongan, por lo tanto no pueden variar....
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 679
RE: lcd no funciona
« Respuesta #10 en: 19 de Agosto de 2004, 19:35:00 »
Bueno, yo tengo harta experiencia en discutir con el 18F452, tanto con el proteus y con el ICD pocas cosas que he mirgrado del 16F877 andan de buenas a primeras, con respecto al LCD el error esta en el DRIVER de CCS que el que lo hizo le puso unos delay_cicles (1); que hacen un retardo de 1 microsegundo a 4 mhz, pero cuando uno pone el 18F452 a 40 Mhz ( xtal de 10 Mhz con H4 ) se pudre todo y el LCD NO ANDA MAS, entonces cambiar el DELAY_CICLES (1); POR DELAY_US(1); o 3 microsegundos mejor y empieza a funcionar el LCD, hay otras cosas como por ejemplo el MSSP que hace lo que se le antoja, pero solo cuando uso CCS, modifique una rutina en ASM para I2C y  la inserte en el codigo de C y tuti viento in popa, inclusive va a 100 KHz cosa que no puedo lograr con CCS.

saludos

Ariel
 

saludos
PikMan

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: lcd no funciona
« Respuesta #11 en: 20 de Agosto de 2004, 01:05:00 »
Vamos a probar a cambiar esos retardos que comentais.
Otra cosa...según parece,narcosystem tiene conectado el lcd al puerto A,con el pin RW supuestamente a masa.Yo he probado a hacer lo mismo y el display parece que se inicializa bien pero no representa nada de nada,y sólo con volver a poner RW comandado por el pic ya va bien.Alguien ha probado esa configuración de RW?

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: lcd no funciona
« Respuesta #12 en: 20 de Agosto de 2004, 01:34:00 »
Ya están modificados los retardos.
http://miarroba.com/foros/ver.php?temaid=2216077&foroid=256746
He probado con 16F876 a 10Mhz y va bien.Con 18F258 a 10Mhz tb va bien,pero si le pongo el cristal de 40Mhz funciona,pero los delays que le pongo al programa para que se vea en el lcd un texto de forma intermitente parece que se hacen más largos,es decir la ejecución se hace más lenta.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: lcd no funciona
« Respuesta #13 en: 20 de Agosto de 2004, 06:20:00 »
La linea RW permite leer o escribir desde y hacia el display, segun el nivel que se le de.
La rutina de CCS lo que hace es leer luego de enviar un comando, para saber cuando esta listo el display para recibir un nuevo dato.
Si se exceden los tiempos entre envios el display tambien anda, no todo lo bien que esperamos....
Hay rutinas que hacen que el display trabaje sin el uso de la linea RW, el basic de PBP trabaja sin ella, por ejemplo.

Pero el experto en LCD´s, que me ayudo a mi a resolverlo en CCS es el Maestro PIKMAN, por lo cual le dejo a El la explicacion...

Una ultima cosa:
No utilizen la rutina original de CCS sin usar la linea de RW, porque cometen errores muy grandes, ya que esa rutina trabaja  bien leyendo el display...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: lcd no funciona
« Respuesta #14 en: 21 de Agosto de 2004, 08:32:00 »
Bueno pues ante la imposibilad de comandar el lcd con el puerto a,volveeeeemos a hacerle la cirugía al lcd.c modificado.
Saludos


 

anything