TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: elnina en 01 de Junio de 2009, 12:38:52

Título: lcd_init() --> No me funciona, desesperado
Publicado por: elnina en 01 de Junio de 2009, 12:38:52
Pues he intentado mil maneras distintas. No consigo que el programa pase de esta linea. El caso es que en Proteus me funciona de perlas pero en placa no hay manera. He intentado otro puerto, otro display, otro PIC, he cambiado lo de los retardos en la libreria del LCD, he probado distintas alimentaciones, he probado otra placa.....

No se que mas puedo hacer, no soy capaz ni de encender el display con el PIC, (la backligth si funciona)
Uso el PIC 18F252 y la libreria para el puerto B de ucontrol.

no me funciona ni algo tan simple como esto:

#include <18F252.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)

#include <lcd.c>

void main()
{
   lcd_init();
   set_tris_b(0x00);  //RB0-RB7 salidas
   
   while (TRUE) {
   lcd_putc("Ready.....");
   delay_ms(1000);
   }

esta es la libreria que uso para el LCD:

//     B0 
//     B1 
//     B2  E
//     B3  RS
//     B4  D4
//     B5  D5
//     B6  D6
//     B7  D7
//   (Sin 'RW') conectado a Masa
//
// Funciones soportadas:
//                         lcd_init()
//                         lcd_gotoxy( BYTE col, BYTE fila)
//                         lcd_putc( char c)
//                              \f  Clear display                             
//                              \n  Go to start of second line               
//                              \b  Move back one position


#define use_portb_lcd TRUE  //LCD conectado al puerto b.

struct lcd_pin_map {
   BOOLEAN unused1; // RB0
   BOOLEAN unused2; // RB1
   BOOLEAN enable;  // RB2
   BOOLEAN rs;      // RB3
   int data : 4;    // RB4-RB7
} lcd;

#if defined use_portB_lcd
   #locate lcd = getenv("sfr:PORTB")    // This puts the entire structure over the port
   #ifdef __pch__
    #locate lcd = 0xf81
   #else
    #locate lcd = 6
   #endif
   #define set_tris_lcd(x) set_tris_b(x)
#else
   //#locate lcd = getenv("sfr:PORTD")    // This puts the entire structure over the port
   #ifdef __pch__
    #locate lcd = 0xf83
   #else
    #locate lcd = 8
   #endif
   #define set_tris_lcd(x) set_tris_d(x)
#endif

#ifndef lcd_type
#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 lines
#endif

#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 '\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);
}



Ke mas puedo probar????  :( :( :( :( :( :( :(
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: AKENAFAB en 01 de Junio de 2009, 13:00:11
Estas usando el pin RW???Me parece que no lo usas y esta comentado.
mmmm...(esto no es problema pero estoy pensando )  xD

Deberias subir tu diagrama electronico de la placa que no te funciona.


En el Tipo de Oscilador pones HS con un click=4MHz , en este caso cambia a XT .




Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: elnina en 01 de Junio de 2009, 13:14:23
(http://i721.photobucket.com/albums/ww217/_elnina_/logos%20foros/Dibujo.jpg)

No creo que sea problema del programa, pq he intentado varios ejemplos.
Yo creo que se debe a libreria...
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: alexysar en 01 de Junio de 2009, 13:33:59
generalmente hay que borrar el display antes de usarlo, pero despues de inicializarlo. Podrias probar para ver que resultados te da.

Aqui algunos ejemplos que dejo el colega zerc79 Ejemplos LCD (http://www.todopic.com.ar/foros/index.php?topic=26243.0;topicseen)
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: cerebro en 01 de Junio de 2009, 13:40:24
Me juego a que es el contraste..... mira este pdf LCD (http://www.4shared.com/file/45432416/6c16fcd/lcd1.html) (aporte de cryn) que a todos les da una mano.

Saludos!
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: elnina en 01 de Junio de 2009, 13:48:11
Tampoco poniendo esa linea del '\f'
Tampoco cambiando el delaycicle por delay_us(1) o delay_us(3).

Cuando el programa llega a la linea del init no hace nada, se queda parado.
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: elnina en 01 de Junio de 2009, 13:50:21
en el pin del contraste tengo un potenciometro de 10k y en serie una r de 10K, he probado a ponerlo directamente y tampoco.
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: Suky en 01 de Junio de 2009, 14:27:03
En esta función:
Código: C
  1. void lcd_send_byte( BYTE address, BYTE n ) {
  2.  
  3.       lcd.rs = 0;
  4.       while ( bit_test(lcd_read_byte(),7) ) ;
  5.       lcd.rs = address;
  6.       delay_cycles(1);
  7.       //lcd.rw = 0;
  8.       delay_cycles(1);
  9.       lcd.enable = 0;
  10.       lcd_send_nibble(n >> 4);
  11.       lcd_send_nibble(n & 0xf);
  12. }

Reemplaza la linea: while ( bit_test(lcd_read_byte(),7) ) ;
Por un delay --> delay_us(60);

Estas esperando la habilitación del LCD, realizando una lectura, la cual no la tienes habilitada.
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: cerebro en 01 de Junio de 2009, 14:31:31
en el pin del contraste tengo un potenciometro de 10k y en serie una r de 10K, he probado a ponerlo directamente y tampoco.

 :shock:
leiste por lo menos el pdf?
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: elnina en 01 de Junio de 2009, 14:48:12
En esta función:
Código: C
  1. void lcd_send_byte( BYTE address, BYTE n ) {
  2.  
  3.       lcd.rs = 0;
  4.       while ( bit_test(lcd_read_byte(),7) ) ;
  5.       lcd.rs = address;
  6.       delay_cycles(1);
  7.       //lcd.rw = 0;
  8.       delay_cycles(1);
  9.       lcd.enable = 0;
  10.       lcd_send_nibble(n >> 4);
  11.       lcd_send_nibble(n & 0xf);
  12. }

Reemplaza la linea: while ( bit_test(lcd_read_byte(),7) ) ;
Por un delay --> delay_us(60);

Estas esperando la habilitación del LCD, realizando una lectura, la cual no la tienes habilitada.

Nada sigue igual.

Respecto al pdf, que me recomiendas hacer, me refiero a que experimentos de los que cita
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: cerebro en 01 de Junio de 2009, 14:59:44

Respecto al pdf, que me recomiendas hacer, me refiero a que experimentos de los que cita

yo no tengo idea si estas trabajando en alguna placa entrenadora o directamente en el protoboard, supongamos la segunda opción capas que tu circuito esta bien y hay algún cable cortado u otra  pavada que puede hacerte perder mucho tiempo. Si por lo menos probas encender el display o sea pasar la función init_lcd()  eliminas mucha incertidumbre.....
yo se lo que te digo yo tenia una pista cortada y estaba al borde de tirarlo a la basura y me tome el tiempo de por lo menos hacer la primera prueba.

Saludos!
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: elnina en 01 de Junio de 2009, 15:32:41
No, uso una placa entrenadora.

No consigo ver ni un solo cuadrado negro, solo se me enciende el backlight.

ahora he conseguido que el programa pase del lcd_init() y haga lo siguinte, pero no veo ninguna frase en el display.

He habilitado RW y lo he onectado al RB1 del PIC.

este es el programa que he usado:

#include <18F252.h>  //Libreria del PIC escogido

#FUSES XT         //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOOSCSEN   //Oscillator switching is disabled, main oscillator is source
#FUSES NOPUT      //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOWDT      //No Watch Dog Timer
#FUSES STVREN     //Stack full/underflow will cause reset
#FUSES NOLVP      //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG    //No Debug mode for ICD
#FUSES NOPROTECT  //Code not protected from reading
#FUSES NOCPD      //No EE protection
#FUSES NOWRT      //Program memory not write protected
#FUSES NOWRTC     //configuration not registers write protected
#FUSES NOWRTB     //Boot block not write protected
#FUSES NOWRTD     //Data EEPROM not write protected
#FUSES NOEBTR     //Memory not protected from table reads
#FUSES NOEBTRB    //Boot block not protected from table reads

#use DELAY(CLOCK=4000000)
#use FIXED_IO(C_OUTPUTS=PIN_C0,PIN_C1,PIN_C2,PIN_C3)

#include <lcd.c>

#INT_EXT
void alarma1(void) //Interrupción pulsador manual alarma zona1
{
 
   output_low(PIN_C0);
   output_low(PIN_C1);
   output_low(PIN_C2);
   output_low(PIN_C3);
   delay_ms(3000);
   
}
 
void main(void)
{
   set_tris_b(0b00000001); //input:   output:
   set_tris_c(0b00000000); //input:   output:
   
   ext_int_edge(H_TO_L);
   enable_interrupts(INT_EXT);
   enable_interrupts(GLOBAL); //Todas las interrupciones activadas
   lcd_init();
   while (true)
   {
      output_high(PIN_C0);
      delay_ms(500);
      output_high(PIN_C1);
      delay_ms(500);
      output_high(PIN_C2);
      delay_ms(500);
      output_high(PIN_C3);
      delay_ms(500);
      output_low(PIN_C0);
      output_low(PIN_C1);
      output_low(PIN_C2);
      output_low(PIN_C3);
      lcd_putc('\f');
      lcd_putc("abcdefghijklmnop");
      delay_ms(500);
   }
}


y la libreria:

///////////////////////////////////////////////////////////////////////////
////                             LCDB.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,2007 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.                               ////
///////////////////////////////////////////////////////////////////////////

//     B0 
//     B1  RW
//     B2  E
//     B3  RS
//     B4  D4
//     B5  D5
//     B6  D6
//     B7  D7
//   (Sin 'RW') conectado a Masa
//
// Funciones soportadas:
//                         lcd_init()
//                         lcd_gotoxy( BYTE col, BYTE fila)
//                         lcd_putc( char c)
//                              \f  Clear display                             
//                              \n  Go to start of second line               
//                              \b  Move back one position


#define use_portb_lcd TRUE  //LCD conectado al puerto b.

struct lcd_pin_map {
   BOOLEAN unused1; // RB0
   BOOLEAN rw;      // RB1
   BOOLEAN enable;  // RB2
   BOOLEAN rs;      // RB3
   int data : 4;    // RB4-RB7
} lcd;

#if defined use_portB_lcd
   #locate lcd = getenv("sfr:PORTB")    // This puts the entire structure over the port
   #ifdef __pch__
    #locate lcd = 0xf81
   #else
    #locate lcd = 6
   #endif
   #define set_tris_lcd(x) set_tris_b(x)
#else
   //#locate lcd = getenv("sfr:PORTD")    // This puts the entire structure over the port
   #ifdef __pch__
    #locate lcd = 0xf83
   #else
    #locate lcd = 8
   #endif
   #define set_tris_lcd(x) set_tris_d(x)
#endif

#ifndef lcd_type
#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 lines
#endif

#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 '\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);
}
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: Suky en 01 de Junio de 2009, 15:54:34
Prueba con la libreria que te adjunto, a ver si podemos solucionar este problema.
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: cerebro en 01 de Junio de 2009, 15:59:29
 El backlight no esta relacionado con la lógica del LCD el lcd que estas utilizando es de 16x2 compatible con el hitachi no?, yo sacaría por el momento el backlight seguiría paso a paso textuales el pdf y pondría una resistencia mucho mas chica por ejemplo ahora tengo montado mi lcd con un pote de 100k (que era el único que tenía) en serie con una resistencia de 180 ohms.
Lo que quiero decir, bajale la resistencia esa en serie y tenés que ver los cuadraditos si es que tu lcd funciona correctamente y seguis los pasos correctamente (sin pic) después es cuestion de conectar todo nuevamente.
 se me ocurren 3 cosas por las cuales no ves los cuadrados:

1- El contraste está muy bajo (hay que bajar la tensión vee).
2- La fuente que estas utilizando no es buena y no puede entregar la corriente para alimentar todo el circuito y la consume todo el backlight (muy improbable).
3- LCD muerto en combate (no creo, yo lo herejie mucho al mio también  :D)...  
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: elnina en 02 de Junio de 2009, 05:33:36
El contraste lo muevo con el pot a 10k, a 20k o menos, hay que poner mas de 20K??
EL lcd no creo, pq tengo dos distintos y no funciona ninguno
La fuente no es pq he probado con pila de 4.5v y transformador de 220/12v con lm7805  a 5v, la fuente da hasta 800mA

La libreria flex_lcd tampoco me fuciona, pero ya me pasa de la linea del init_lcd, a si q debe ser del hardware digo yo??

voy a probar lo del pdf
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: elnina en 02 de Junio de 2009, 05:43:06
CONSEGUIDO !!!!!!!!!!!!!!!!!!!!!!!!!!   :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/

El pin del contraste va a masa, y no al potenciometro

Gracias chicos me habeis ayudado a conseguirlo   :mrgreen: :mrgreen: :mrgreen: :mrgreen:

De echo pone que a veces hay que poner -7V, como consigo esto ????
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: cerebro en 02 de Junio de 2009, 09:51:57

:z) por que nunca me hacen caso  :8}.........

o que quiero decir, bajale la resistencia esa en serie y tenés que ver los cuadraditos si es que tu lcd funciona correctamente y seguis los pasos correctamente (sin pic) después es cuestion de conectar todo nuevamente.
 se me ocurren 3 cosas por las cuales no ves los cuadrados:

1- El contraste está muy bajo (hay que bajar la tensión vee).

Con Vee a masa vas a tener mucho constraste y no vas a ver los caracteres.... ese pin va al punto medio del potenciómetro a una tensión baja con resistencias mas bajas. Me alegro que lo consiguieses
 saludos!!
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: elnina en 03 de Junio de 2009, 18:57:13
He puesto un diodo y un pot de 100 K en serie, y ahora va de lujo.  :mrgreen:
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: jhozate en 05 de Agosto de 2009, 23:33:39
tengo problemas con el lcd, hace tiempo venia simulando en proteus con la libreria flex_lcd y  todo bien, pero ahora pruebo en hardware y no funciona el lcd, sale lleno de cuadros en la primera fila, el pin de contraste lo tengo a tierra (siempre lo he usado asi). decidi probar algo sencillo como poner un hola, el pic esta bueno y estoy probando en una entrenadora, monitoreo la actividad del puerto con leds y si esta sacando datos por el puerto q le asigno, me asegure de poner XT en el fuse para un cristal de 4Mhz+..pero no se que pasa..

saludos
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: ppyote en 06 de Agosto de 2009, 19:40:26
pon el programa para poder orientarte mejor, que libreria usas para el control del lcd? 4bits o 8 bits trabajando el lcd?
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: tinchogrosman en 08 de Agosto de 2009, 15:17:21
Estimados:
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: MLO__ en 09 de Agosto de 2009, 22:09:47
 :shock: :shock: :shock:

 :huh: :huh: :huh:
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: Suky en 09 de Agosto de 2009, 23:52:38
 :D :D :D

Como que falto algo!
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: MLO__ en 10 de Agosto de 2009, 13:00:00
Bueno ... eh ...... mhhh ...... Bienvenido al foro tinchogrosman.
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: pajaro en 19 de Agosto de 2009, 17:23:29
tengo problemas con el lcd, hace tiempo venia simulando en proteus con la libreria flex_lcd y  todo bien, pero ahora pruebo en hardware y no funciona el lcd, sale lleno de cuadros en la primera fila, el pin de contraste lo tengo a tierra (siempre lo he usado asi). decidi probar algo sencillo como poner un hola, el pic esta bueno y estoy probando en una entrenadora, monitoreo la actividad del puerto con leds y si esta sacando datos por el puerto q le asigno, me asegure de poner XT en el fuse para un cristal de 4Mhz+..pero no se que pasa..

saludos

Hola amigos
A mi me pasa lo mismo con un lcd nuevo, en la tienda me aseguraron que era compatible con el standar de hoy dia Hitachi.
El simulador de proteus se traga todo, pero en la realidad sobre placa entrenadora es otro cantar.

Se inicializa el LCD pero de forma erronea es decir la 1 y tercera linea, ya que el lcd es de 4 lineas.

El circuito lo montado varias veces y de formas diferntes, pero el resultado simpre fue el mismo.

pic16F877A +LCD4x20

en modo 4 lineas más altas, por el puerto b del pic, uso la libreia lcd420 de ccs.

que le ocurrira al dichoso montaje?ya no se que pude ser parece ilogico.

Un saludo.

Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: pajaro en 21 de Agosto de 2009, 12:02:01
hola pajaro

[me respondo a mi mismo]

Una vez más tiene que ver las lineas de control, y los despiste menudos, si en la libreria esta definida con el RW y tu no lo pones da esto, la primera linea y la tercera.  Si dentro de tu proyecto tu crees que estas usando tu propia libreria personalizada del LCD  y no es asi el ccs cogera la suya por defecto.

Moraleja cambiale el nombre a la libreria para que en caso de no encontrarla se queje y tu te enteres y no pierdas el tiempo volviendote loco .


(Solucionado)

Un saludo.
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: mrk992 en 23 de Agosto de 2009, 19:49:17
yo no soy capaz de utilizar el LCD del micropic trainer y he utilizado la libreria LCD.h y la Flexlcd y no me funciona ya puse un post y no me dijisteis nada esera que os le pongo haber que me podeis decir http://www.todopic.com.ar/foros/index.php?topic=27211.0
graciass
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: wichooox en 10 de Diciembre de 2010, 23:28:42
buenas amigos, tengo un problema parecido, estoi usando el pic18f2525, la cuestion es que realice un programa y en proteus corre perfecto, muestra la lcd y todo bien, (la lcd esta bien conectada, no es problema de conccion de lcd), el problema se presenta q al pasar el programa al pic simplemente no responde a nada, realice otro programa q solo encienda y apague un led para tratar de verificar en que parte del programa se queda la corrida, segun lo q hice se queda en alguna parte de la rutina de lcd que esta en la libreria de CCS, esto lo deduje porque al comentar en comando //lcd_init() el programa corre perfecto, es decir enciende y apaga el led sin problemas, al descomentarlo no hace absolutamente nada, aca le dejo el codigo de programa que uso para probar en q parte se queda el programa.

#include <18F2525.h>
#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES INTRC                    //Internal RC Osc
#FUSES NOPROTECT                //Code not protected from reading
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES NOSTVREN                 //Stack full/underflow will not 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 NOFCMEN                  //Fail-safe clock monitor disabled
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES MCLR                     //Master Clear pin enabled

#use delay(clock=4000000)
//#define LCD_DATA_PORT getenv("SFR:PORTB")


#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_TYPE 2
#define LCD_DATA4 PIN_B4                                   
#define LCD_DATA5 PIN_B5                                   
#define LCD_DATA6 PIN_B6                                   
#define LCD_DATA7 PIN_B7
#include <lcd.c>

int seguir;
void main()
{
   lcd_init();
   seguir=0;
   setup_adc_ports(AN0_TO_AN1|VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL|ADC_TAD_MUL_2);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(OSC_4MHZ|OSC_INTRC|OSC_PLL_OFF);
   set_tris_a(0x03);
do{
output_low(pin_a2);
delay_ms(300);
output_high(pin_a2);
delay_ms(300);
}
while (seguir==0);

}





Y la rutina de la lcd de la libreria es esta (es la que trae CCS) que al activar lcd_init() no corre el programa





typedef struct 
{                            // 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 LSB pin of that port.
  #if defined(__PCD__)       // The port used will be LCD_DATA_PORT.
   int    reserved: 8;
  #endif
} LCD_PIN_MAP;

#if defined(__PCB__)
   // these definitions only need to be modified for baseline PICs.
   // all other PICs use LCD_PIN_MAP or individual LCD_xxx pin definitions.
/*                                    EN, RS,   RW,   UNUSED,  DATA  */
 const LCD_PIN_MAP LCD_OUTPUT_MAP =  {0,  0,    0,    0,       0};
 const LCD_PIN_MAP LCD_INPUT_MAP =   {0,  0,    0,    0,       0xF};
#endif

////////////////////// END CONFIGURATION ///////////////////////////////////

#ifndef LCD_ENABLE_PIN
   #define lcd_output_enable(x) lcdlat.enable=x
   #define lcd_enable_tris()   lcdtris.enable=0
#else
   #define lcd_output_enable(x) output_bit(LCD_ENABLE_PIN, x)
   #define lcd_enable_tris()  output_drive(LCD_ENABLE_PIN)
#endif

#ifndef LCD_RS_PIN
   #define lcd_output_rs(x) lcdlat.rs=x
   #define lcd_rs_tris()   lcdtris.rs=0
#else
   #define lcd_output_rs(x) output_bit(LCD_RS_PIN, x)
   #define lcd_rs_tris()  output_drive(LCD_RS_PIN)
#endif

#ifndef LCD_RW_PIN
   #define lcd_output_rw(x) lcdlat.rw=x
   #define lcd_rw_tris()   lcdtris.rw=0
#else
   #define lcd_output_rw(x) output_bit(LCD_RW_PIN, x)
   #define lcd_rw_tris()  output_drive(LCD_RW_PIN)
#endif

#ifndef LCD_DATA_PORT
   #if defined(__PCB__)
      #define LCD_DATA_PORT      0x06     //portb
      #define set_tris_lcd(x)   set_tris_b(x)
   #elif defined(__PCM__)
      #define LCD_DATA_PORT      getenv("SFR:PORTB")     //portd
   #elif defined(__PCH__)
      #define LCD_DATA_PORT      getenv("SFR:PORTB")    //portd
   #elif defined(__PCD__)
      #define LCD_DATA_PORT      getenv("SFR:PORTB")    //portd
   #endif   
#endif

#if defined(__PCB__)
   LCD_PIN_MAP lcd, lcdlat;
   #byte lcd = LCD_DATA_PORT
   #byte lcdlat = LCD_DATA_PORT
#elif defined(__PCM__)
   LCD_PIN_MAP lcd, lcdlat, lcdtris;
   #byte lcd = LCD_DATA_PORT
   #byte lcdlat = LCD_DATA_PORT
   #byte lcdtris = LCD_DATA_PORT+0x80
#elif defined(__PCH__)
   LCD_PIN_MAP lcd, lcdlat, lcdtris;
   #byte lcd = LCD_DATA_PORT
   #byte lcdlat = LCD_DATA_PORT+9
   #byte lcdtris = LCD_DATA_PORT+0x12
#elif defined(__PCD__)
   LCD_PIN_MAP lcd, lcdlat, lcdtris;
   #word lcd = LCD_DATA_PORT
   #word lcdlat = LCD_DATA_PORT+2
   #word lcdtris = LCD_DATA_PORT-0x02
#endif

#ifndef LCD_TYPE
   #define LCD_TYPE 2           // 0=5x7, 1=5x10, 2=2 lines
#endif

#ifndef LCD_LINE_TWO
   #define LCD_LINE_TWO 0x40    // LCD RAM address for the second line
#endif

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.

// original version of this library incorrectly labeled LCD_DATA0 as LCD_DATA4,
// LCD_DATA1 as LCD_DATA5, and so on.  this block of code makes the driver
// compatible with any code written for the original library
#if (defined(LCD_DATA0) && defined(LCD_DATA1) && defined(LCD_DATA2) && defined(LCD_DATA3) && !defined(LCD_DATA4) && !defined(LCD_DATA5) && !defined(LCD_DATA6) && !defined(LCD_DATA7))
   #define  LCD_DATA4    LCD_DATA0
   #define  LCD_DATA5    LCD_DATA1
   #define  LCD_DATA6    LCD_DATA2
   #define  LCD_DATA7    LCD_DATA3
#endif

BYTE lcd_read_nibble(void);

BYTE lcd_read_byte(void)
{
   BYTE low,high;

 #if defined(__PCB__)
   set_tris_lcd(LCD_INPUT_MAP);
 #else
  #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
   output_float(LCD_DATA4);
   output_float(LCD_DATA5);
   output_float(LCD_DATA6);
   output_float(LCD_DATA7);
  #else
   lcdtris.data = 0xF;
  #endif
 #endif
       
   lcd_output_rw(1);
   delay_cycles(1);
   lcd_output_enable(1);
   delay_cycles(1);
   high = lcd_read_nibble();
     
   lcd_output_enable(0);
   delay_cycles(1);
   lcd_output_enable(1);
   delay_us(1);
   low = lcd_read_nibble();
     
   lcd_output_enable(0);

 #if defined(__PCB__)
   set_tris_lcd(LCD_INPUT_MAP);
 #else
  #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
   output_drive(LCD_DATA4);
   output_drive(LCD_DATA5);
   output_drive(LCD_DATA6);
   output_drive(LCD_DATA7);
  #else
   lcdtris.data = 0x0;
  #endif
 #endif

   return( (high<<4) | low);
}

BYTE lcd_read_nibble(void)
{
  #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
   BYTE n = 0x00;

   /* Read the data port */
   n |= input(LCD_DATA4);
   n |= input(LCD_DATA5) << 1;
   n |= input(LCD_DATA6) << 2;
   n |= input(LCD_DATA7) << 3;
   
   return(n);
  #else
   return(lcd.data);
  #endif
}

void lcd_send_nibble(BYTE n)
{
  #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
   /* Write to the data port */
   output_bit(LCD_DATA4, BIT_TEST(n, 0));
   output_bit(LCD_DATA5, BIT_TEST(n, 1));
   output_bit(LCD_DATA6, BIT_TEST(n, 2));
   output_bit(LCD_DATA7, BIT_TEST(n, 3));
  #else     
   lcdlat.data = n;
  #endif
     
   delay_cycles(1);
   lcd_output_enable(1);
   delay_us(2);
   lcd_output_enable(0);
}

void lcd_send_byte(BYTE address, BYTE n)
{
   lcd_output_rs(0);
   while ( bit_test(lcd_read_byte(),7) ) ;
   lcd_output_rs(address);
   delay_cycles(1);
   lcd_output_rw(0);
   delay_cycles(1);
   lcd_output_enable(0);
   lcd_send_nibble(n >> 4);
   lcd_send_nibble(n & 0xf);
}

void lcd_init(void)
{
   BYTE i;

 #if defined(__PCB__)
   set_tris_lcd(LCD_OUTPUT_MAP);
 #else
  #if (defined(LCD_DATA4) && defined(LCD_DATA5) && defined(LCD_DATA6) && defined(LCD_DATA7))
   output_drive(LCD_DATA4);
   output_drive(LCD_DATA5);
   output_drive(LCD_DATA6);
   output_drive(LCD_DATA7);
  #else
   lcdtris.data = 0x0;
  #endif
   lcd_enable_tris();
   lcd_rs_tris();
   lcd_rw_tris();
 #endif

   lcd_output_rs(0);
   lcd_output_rw(0);
   lcd_output_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 '\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_output_rs(1);
   value = lcd_read_byte();
   lcd_output_rs(0);
   
   return(value);
}


de ante mano gracias a todos, y espero q me puedan ayudar :)
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: bmb en 10 de Diciembre de 2010, 23:50:45
Hola wichooox, bienvenido al foro.  Está algo extenso el código, pero veo que tienes el lcd en el puerto B, entonces comienza por cambiar este fuse:

#FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET

por este:

#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET

Si veo algo más te cuento.

Saludos!

EDITO:  No me habia dado cuenta que lo extenso es la librería del lcd  :oops:
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: wichooox en 11 de Diciembre de 2010, 00:27:22
Hola wichooox, bienvenido al foro.  Está algo extenso el código, pero veo que tienes el lcd en el puerto B, entonces comienza por cambiar este fuse:

#FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET

por este:

#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET

Si veo algo más te cuento.

Saludos!

EDITO:  No me habia dado cuenta que lo extenso es la librería del lcd  :oops:



hola gracias por la bienvenida, pues te cuento que acomode ese detalle y nada :/ no se porque no quiere andar
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: bmb en 11 de Diciembre de 2010, 08:57:44
Hola wichooox, intenta compilar el programa asi:

Código: C
  1. #include <18F2525.h>
  2. #device adc=10
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  6. #FUSES INTRC                    //Internal RC Osc
  7. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  8. #FUSES NOIESO                   //Internal External Switch Over mode disabled
  9. #FUSES NOPUT                    //No Power Up Timer
  10. #FUSES NOBROWNOUT               //No brownout reset
  11. #FUSES BORV20                   //Brownout reset at 2.0V
  12. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
  13. #FUSES NOLPT1OSC                //Timer1 configured for higher power operation
  14. #FUSES MCLR                     //Master Clear pin enabled
  15. #FUSES NOSTVREN                 //Stack full/underflow will not cause reset
  16. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  17. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  18. #FUSES NODEBUG                  //No Debug mode for ICD
  19. #FUSES NOPROTECT                //Code not protected from reading
  20. #FUSES NOCPB                    //No Boot Block code protection
  21. #FUSES NOCPD                    //No EE protection
  22. #FUSES NOWRT                    //Program memory not write protected
  23. #FUSES NOWRTC                   //configuration not registers write protected
  24. #FUSES NOWRTB                   //Boot block not write protected
  25. #FUSES NOWRTD                   //Data EEPROM not write protected
  26. #FUSES NOEBTR                   //Memory not protected from table reads
  27. #FUSES NOEBTRB                  //Boot block not protected from table reads
  28.  
  29. #use delay(int=4000000)
  30.  
  31. #define ENABLE_PIN B0
  32. #define RS_PIN B1
  33. #define RW_PIN B2
  34. #define Data4 B4
  35. #define Data5 B5
  36. #define Data6 B6
  37. #define Data7 B7
  38. #define LCD_TYPE 2
  39.  
  40. #include <lcd.c>
  41.  
  42. int seguir;
  43.  
  44. void main()
  45. {
  46.    setup_adc_ports(AN0_TO_AN1|VSS_VDD);
  47.    setup_adc(ADC_CLOCK_INTERNAL|ADC_TAD_MUL_2);
  48.    setup_spi(SPI_SS_DISABLED);
  49.    setup_wdt(WDT_OFF);
  50.    setup_timer_0(RTCC_INTERNAL);
  51.    setup_timer_1(T1_DISABLED);
  52.    setup_timer_2(T2_DISABLED,0,1);
  53.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  54.    setup_comparator(NC_NC_NC_NC);
  55.    setup_vref(FALSE);
  56.    setup_oscillator(OSC_4MHZ|OSC_INTRC|OSC_PLL_OFF);
  57.    set_tris_a(0x03);
  58.    lcd_init();
  59.  
  60.    seguir=0;
  61.    
  62.    do
  63.    {
  64.       output_low(pin_a2);
  65.       delay_ms(300);
  66.       output_high(pin_a2);
  67.       delay_ms(300);
  68.    }
  69.    while (seguir==0);
  70. }

Saludos!
Título: Re: lcd_init() --> No me funciona, desesperado
Publicado por: wichooox en 11 de Diciembre de 2010, 14:36:26
Hola wichooox, intenta compilar el programa asi:

Código: C
  1. #include <18F2525.h>
  2. #device adc=10
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  6. #FUSES INTRC                    //Internal RC Osc
  7. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  8. #FUSES NOIESO                   //Internal External Switch Over mode disabled
  9. #FUSES NOPUT                    //No Power Up Timer
  10. #FUSES NOBROWNOUT               //No brownout reset
  11. #FUSES BORV20                   //Brownout reset at 2.0V
  12. #FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
  13. #FUSES NOLPT1OSC                //Timer1 configured for higher power operation
  14. #FUSES MCLR                     //Master Clear pin enabled
  15. #FUSES NOSTVREN                 //Stack full/underflow will not cause reset
  16. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  17. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  18. #FUSES NODEBUG                  //No Debug mode for ICD
  19. #FUSES NOPROTECT                //Code not protected from reading
  20. #FUSES NOCPB                    //No Boot Block code protection
  21. #FUSES NOCPD                    //No EE protection
  22. #FUSES NOWRT                    //Program memory not write protected
  23. #FUSES NOWRTC                   //configuration not registers write protected
  24. #FUSES NOWRTB                   //Boot block not write protected
  25. #FUSES NOWRTD                   //Data EEPROM not write protected
  26. #FUSES NOEBTR                   //Memory not protected from table reads
  27. #FUSES NOEBTRB                  //Boot block not protected from table reads
  28.  
  29. #use delay(int=4000000)
  30.  
  31. #define ENABLE_PIN B0
  32. #define RS_PIN B1
  33. #define RW_PIN B2
  34. #define Data4 B4
  35. #define Data5 B5
  36. #define Data6 B6
  37. #define Data7 B7
  38. #define LCD_TYPE 2
  39.  
  40. #include <lcd.c>
  41.  
  42. int seguir;
  43.  
  44. void main()
  45. {
  46.    setup_adc_ports(AN0_TO_AN1|VSS_VDD);
  47.    setup_adc(ADC_CLOCK_INTERNAL|ADC_TAD_MUL_2);
  48.    setup_spi(SPI_SS_DISABLED);
  49.    setup_wdt(WDT_OFF);
  50.    setup_timer_0(RTCC_INTERNAL);
  51.    setup_timer_1(T1_DISABLED);
  52.    setup_timer_2(T2_DISABLED,0,1);
  53.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  54.    setup_comparator(NC_NC_NC_NC);
  55.    setup_vref(FALSE);
  56.    setup_oscillator(OSC_4MHZ|OSC_INTRC|OSC_PLL_OFF);
  57.    set_tris_a(0x03);
  58.    lcd_init();
  59.  
  60.    seguir=0;
  61.    
  62.    do
  63.    {
  64.       output_low(pin_a2);
  65.       delay_ms(300);
  66.       output_high(pin_a2);
  67.       delay_ms(300);
  68.    }
  69.    while (seguir==0);
  70. }

Saludos!




RESUELTO
elimine
#define ENABLE_PIN B0
#define RS_PIN B1
#define RW_PIN B2
#define Data4 B4
#define Data5 B5
#define Data6 B6
#define Data7 B7
#define LCD_TYPE 2

deje la configuracion de la libreria como la pase y funciono :P gracias..¡