Autor Tema: Pic se queda colgado en LCD_init()  (Leído 4543 veces)

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

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
Pic se queda colgado en LCD_init()
« en: 01 de Octubre de 2005, 11:48:00 »
Os dejo una simulación del circuito que tengo montado con un lcd 1x16 que me tiene loco.

Para probar si el pic funcionaba conecté a ra0 un diodo que se enciende como se ve en la simulacion en cada paso del bucle.

el tema es que he descubierto que el pic se queda colgado en el momento en el que intenta hacer un lcd_init(). Llegada a esa línea el pic no sigue adelante...


He usado dos tipos de librerias lcd.c la original y otra que encontré aqui supuestamente con los timings más amplios.

El pic que uso es el 16f628...

http://rapidshare.de/files/5752726/lcd.rar.html

// Conexiones: B0 -> E
// B1 -> RS
// B2 -> RW
// B4 -> D4
// B5 -> D5
// B6 -> D6
// B7 -> D7
//////////////////////////////////////////////////////////////////////////////////

#include <16f628.h> //pic a utilizar
#fuses NOWDT, INTRC_IO, PUT, NOPROTECT, NOMCLR, NOBROWNOUT, NOLVP
#use delay (clock=4000000) //Fosc=4Mhz
#define use_portb_lcd TRUE //definir portb lcd
#include<lcd.c> //libreria manejo lcd


///PROGRAMA
void main(void)
{


delay_ms(500);
set_tris_a(0xff);


lcd_init(); //inicializa lcd
lcd_putc("f" ); //borra pantalla lcd

while (true)
{
   printf(lcd_putc,"%s","Insoladora Ok"Giño;
   delay_ms(1000);
   lcd_putc("f" ); //borra pantalla lcd
   printf(lcd_putc,"%s","Insoladora off"Giño;
   delay_ms(1000);
   lcd_putc("f" ); //borra pantalla lcd
   output_bit(PIN_A0,1);
   delay_ms(500);
   output_bit(PIN_A0,0);

}

}

Desconectado vszener

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Pic se queda colgado en LCD_init()
« Respuesta #1 en: 01 de Octubre de 2005, 12:12:00 »
¿Donde no te funciona, en la vida real o en PROTEUS? porque ami tu simulacion si me funciona en PROTEUS.....por cierto no hace falta borrar la pantalla despues del lcd_init(); y recomiendo que ne vez de usar esto:
Codigo:

   lcd_printf(lcd_putc,"%s","Insoladora off" );



uses esto:
Codigo:

   lcd_putc("Insoladora off" );


Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Pic se queda colgado en LCD_init()
« Respuesta #2 en: 01 de Octubre de 2005, 12:26:00 »
Pues no me funciona en la vida real... el pic se queda colgado como digo en el lcd_init...

el caso es que no conseguía que funcionase con ninguno de los ejemplos... así que intenté ponerle un led de test que parpadeara para ver si el pic hacía bien el bucle. Como no lucía el led pues empecé desde cero.

hice un programa que hiciera un parpadeo del led... funcionaba ok...

posteriormente añadí al preprocesador

#define use_portb_lcd TRUE //definir portb lcd
#include<lcd.c> //libreria manejo lcd

y funcionaba el parpadeo del led igualmente

pero cuando metí

lcd_init();

ya dejó de funcionar el led... lo que indica o que el lcd_init desactiva la puerta A o que el pic se queda colgado...

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Pic se queda colgado en LCD_init()
« Respuesta #3 en: 02 de Octubre de 2005, 07:25:00 »
Nadie puede darme una idea¿?¿? ... es q no hay manera... yo venga a revisarlo pero es q nada...

Desconectado josemyzm

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 309
RE: Pic se queda colgado en LCD_init()
« Respuesta #4 en: 02 de Octubre de 2005, 08:47:00 »
No he trabajado en C, así que doy palos de ciego.
Por lo que veo usarás el LCD en modo de 4bits, pero en el ejemplo no configuras nada, solo el puertoB , y pregunto: la rutina LCDinit asume por defecto inicializar el LCD en modo de 4bits y con las conexiones que indicas???


Un saludo.
Saludos desde Logroño (España)

Desconectado olotill

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 249
RE: Pic se queda colgado en LCD_init()
« Respuesta #5 en: 02 de Octubre de 2005, 21:16:00 »
QUE TAL PANA ELMASVITAL...


LA VERDAD NO SE SI ESTO TE SIRVA, PERO EN UNO DE LOS EJEMPLAZOS DEL PANA VSZENER EXPLICA ALGO EN QUE SI EL LCD TRABAJA A 4 BITS O A 8 BITS, SI MAL NO RECUERDO AL TRABAJAR A 4 BITS EL PIN DE RW DEL LCD DEBE IR A TIERRA, NO HE REVISADO TU ESQUEMA EN PROTEUS PERO SI ESTAS TRABAJANDO CON 4 BITS Y CON EL RW A TIERRA, DEBERIAS PONER UNA SENTENCIA DE DELAY_MS(2) JUSTO DESPUES DEL LCD_INIT();

OSEA TENDRIAS

........

     LCD_INIT();
     DELAY_MS(2);

......


BUENO ESPERO QUE TE SIRVA Y QUE SOLUCIONES EL PROBLEMA, YA CUANDO LO TENGAS SOLUCIONADO PUES POSTEA CUAL FUE TU SOLUCION....

SALUDOS DESDE ECUADOR.....Sonrisa GiganteRebotado
"La imaginación es más importante que el conocimiento"  A. Einstein..

Desconectado olotill

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 249
RE: Pic se queda colgado en LCD_init()
« Respuesta #6 en: 02 de Octubre de 2005, 21:24:00 »
Sonrisa GiganteAHHHH POR CIERTO...

OTRO PUNTO A TENER EN CUENTA ES QUE TU ESTAS TRABAJANDO CON UN LCD DE 16X1 Y CON LA LIBRERIA LCD.C INCLUIDA EN EL CCS, Y PUES SEGUN YO TENGO ENTENDIDO LA LIBRERIA LDC.C ESTA CONFIGURADO PARA TRABAJAR CON LCD´S DE 16X2.... BUENO ESTO NO LO TENGO MUY CLARO PERO SI SE PROFUNDIZA EN ESTE PUNTO PODEMOS APRENDER BASTANTE.... Sonrisa Gigante


AHORA SI ME DESPIDO... UN ABRAZO DESDE ECUADOR Rebotado
"La imaginación es más importante que el conocimiento"  A. Einstein..

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Pic se queda colgado en LCD_init()
« Respuesta #7 en: 03 de Octubre de 2005, 04:58:00 »
Escrito originalmente por olotill
Sonrisa GiganteAHHHH POR CIERTO...

OTRO PUNTO A TENER EN CUENTA ES QUE TU ESTAS TRABAJANDO CON UN LCD DE 16X1 Y CON LA LIBRERIA LCD.C INCLUIDA EN EL CCS, Y PUES SEGUN YO TENGO ENTENDIDO LA LIBRERIA LDC.C ESTA CONFIGURADO PARA TRABAJAR CON LCD´S DE 16X2.... BUENO ESTO NO LO TENGO MUY CLARO PERO SI SE PROFUNDIZA EN ESTE PUNTO PODEMOS APRENDER BASTANTE.... Sonrisa Gigante


AHORA SI ME DESPIDO... UN ABRAZO DESDE ECUADOR Rebotado


De hecho es lo que barajo actualmente... debe ser por eso... el pic debe intentar leer alguna posición de memoria del lcd y se queda esperando.... y ahí se queda... voy a analizar el código del lcd.c porque hay partes que no entiendo bien... a ver si la entendemos entre todos...



Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Pic se queda colgado en LCD_init()
« Respuesta #8 en: 03 de Octubre de 2005, 06:11:00 »
Ahora que lo miro bien el proteus lanza el siguiente warning

Warning: [U1] at 531.229m (PC=0x0043): TRISB instruction is deprecated for PIC16628.

muchas veces... a que puede ser debido??? la configuración del trisb como deberia ser para el lcd.c?

es que el pic se queda frito despues de la linea lcd_init() no hace absolutamente nada de lo que le mandes...

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Pic se queda colgado en LCD_init()
« Respuesta #9 en: 05 de Octubre de 2005, 20:40:00 »
Bueno despues de estudiarme de cabo a rabo la rutina del lcd he conseguido que funcione....

finalmente creo que es una simple cuestion de timmings... o eso creo...
voy a seguir indagando a ver si doy con la tecla porque he tocado ya por todos lados

ya daré la respuesta para que quede para los que puedan venir


1 saludo y gracias por la ayuda en todo caso

Desconectado olotill

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 249
RE: Pic se queda colgado en LCD_init()
« Respuesta #10 en: 05 de Octubre de 2005, 23:38:00 »
Que tal pana elmasvital...

Pues bueno creo que si puede ser el problema ese de los timmings... si probaste ponerle un delay de 2 ms despues de lcd_init() verdad???...

Pues bueno... espero que pronto tengas la respuesta al problema para poder compartirla con todos...

SALUDOS desde ECUADOR RebotadoRebotado
"La imaginación es más importante que el conocimiento"  A. Einstein..

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Pic se queda colgado en LCD_init()
« Respuesta #11 en: 06 de Octubre de 2005, 05:01:00 »
Escrito originalmente por olotill
Que tal pana elmasvital...

Pues bueno creo que si puede ser el problema ese de los timmings... si probaste ponerle un delay de 2 ms despues de lcd_init() verdad???...

Pues bueno... espero que pronto tengas la respuesta al problema para poder compartirla con todos...

SALUDOS desde ECUADOR RebotadoRebotado


Bueno finalmente el problema está aqui


while ( bit_test(lcd_read_byte(),7) ) ;

el pic se queda eternamente esperando a que el bit 7 sea 1... Es el bit de espera que por alguna razón el lcd no llega a mandar nunca, o al menos es aqui donde se queda el pic.

lo he solucionado provisionalmente con un

delay_ms(100);

y comentando la susodicha línea, voy a estudiar cómo lo hace otra rutina que tengo para lcd 1x16 de proteus.

1 saludo

Desconectado elmasvital

  • Administrador
  • PIC24H
  • *******
  • Mensajes: 1713
RE: Pic se queda colgado en LCD_init()
« Respuesta #12 en: 06 de Octubre de 2005, 05:41:00 »
Bien ya he resuelto el problema

la rutina tiene un fallo bastante gordo... pero localizarlo me ha costado mas de un calenton... en fin segun el protocolo para consultar el BF (busy flag) hay que poner el bit rs a 0 rw a 1 y el D7 indicará con un 0 que está ocupado y con 1 que está listo para continuar


veamos la rutina lcd.d

void lcd_init() {
    byte i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(150);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(50);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING);
}


Cuando iniciamos el lcd se intentan introducir los ultimos comandos de inicio (que corresponden a su configuración) mediante el comando

lcd_send_byte(0,LCD_INIT_STRING);

veamos esta rutina

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);
}


falta la línea

      lcd.rw = 1;

antes del while para cumplir con el comando busy flag. Sin esta línea los pic"s estarían en un bucle infinito.

pero es que tampoco tiene sentido alguno esta otra

      lcd.rs = address;

lleva a una confusión total primero porque la declara como byte cuando lcd.rs es un boolean, segundo es que su funcion no tiene nada que ver con address que lleva a pensar más bien en una dirección de memoria y nada más alejado de su función.

por lo que yo escribiría tal rutina de esta forma

void lcd_send_byte( boolean comando, byte n ) {

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

Bien esa era la solución... de hecho no entiendo como a vosotros os había funcionado los lcd"s porque llevaba a los pic"s a un bucle infinito... es más no se como simulaba en proteus.  Por ello comprobad si lo teneis así en vuestra rutina lcd.c situada en el directorio devices del ccs, normamente en c:archivos de programapiccdeviceslcd.c

Si sois tan amable alguno de probadlo en un lcd real de más de 1x16 y me comentais que tal?...

Por cierto para los 1x16 tambien hay que hacer un cambio en esta linea

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

por esta otra

#define lcd_type 0           // 0=5x7(1 línea) , 1=5x10, 2=2 lines

Desconectado Kurtxxx

  • PIC10
  • *
  • Mensajes: 5
Re: Pic se queda colgado en LCD_init()
« Respuesta #13 en: 10 de Agosto de 2015, 20:42:59 »
Tú explicación del código no me queda muy clara. Por lo que varios tenemos entendidos el pin #RW se puede conectar a 0V y ahorrarse un pin del pic. Ahora parece que no se podría porque mencionas que es necesario poner #RW = 1 en un momento dado. Ahora tu interpretación de la siguiente línea de código es errónea: while ( bit_test(lcd_read_byte(),7) ) ;
El pic se queda esperando a que el bit más alto se ponga en LOW, con lo cual se rompe el bucle del while el cual se mantiene mientras dicho bit sea HIGH. Efectivamente tienes razón en cuanto a que se trata de un bit de estado busy.
 

Desconectado Kurtxxx

  • PIC10
  • *
  • Mensajes: 5
Re: Pic se queda colgado en LCD_init()
« Respuesta #14 en: 10 de Agosto de 2015, 20:48:28 »
Pon el pin #RW del lcd a LOW y verás que funciona perfectamente.