Autor Tema: Problema con LCD y C CCS  (Leído 11725 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Ale_arzer

  • PIC10
  • *
  • Mensajes: 9
Problema con LCD y C CCS
« en: 07 de Marzo de 2011, 17:59:35 »
Hola a todos, bueno básicamente el problema que tengo es que estoy incursionando en el C y uso el compilador CCS y bueno, en la simulación de mi programa en Proteus, funciona, pero en la práctica no funciona el LCD que es un Winstar 1602B-YYH-ETK# y un PIC16F819, quizás haya algún error del que no me di cuenta, lo que si, modifique la librería para manejar el LCD con otros pines porque ya tenia una placa de pruebas con esas conexiones del LCD y porque leí en un post, que hay que cambiar los DELAY_CYCLES por DELAY_US, no sé si es correcto eso o no, por eso cuelgo primero la rutina mencionada y despues mi programa y si puedo la imagen de que la simulación funciona. También quiero decir que en assembler me funciona la pantallita .

///////////////////////////////////////////////////////////////////////////
////                             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                            ////
////                      \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.                               ////
///////////////////////////////////////////////////////////////////////////

// As defined in the following structure the pin connection is as follows:
//     D0  enable
//     D1  rs
//     D2  rw
//     D4  D4
//     D5  D5
//     D6  D6
//     D7  D7
//
//   LCD pins D0-D3 are not used and PIC D3 is not used.

// Un-comment the following define to use port B
#define use_portb_lcd TRUE

// Esta parte es la que modifiqué puse rw RB1, rs RB2, enable RB3
struct lcd_pin_map {                 // This structure is overlayed
           BOOLEAN unused;           // on to an I/O port to gain
           BOOLEAN rw;               // access to the LCD pins.
           BOOLEAN rs;               // The bits are allocated from
           BOOLEAN enable;           // low order up.  ENABLE will
           int     data : 4;         // be pin B0.
        } 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_us(1);
      lcd.enable = 1;
      delay_us(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_us(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_us(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_us(1);
      lcd.rw = 0;
      delay_us(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(60);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(30);
    }
    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);
}

Acá dejo el programa:

#include "16f819.h"                  // Pic a utilizar
#fuses INTRC_IO,NOWDT,NOMCLR       // Fusibles
#device adc=10                       // Usa resolución de 10 bits
#use delay (clock=4000000)           // Cristal a utilizar
#include <LCD.c>                  // Libreria para utilizar LCD por el puerto B
#use fast_io(B)


float Porcentaje, Medicion, Litros;

void main (void)
{
delay_ms(100); 
lcd_init();                          // Inicia LCD
delay_ms(100);
lcd_putc("Nafta\n");
lcd_gotoxy(10,2);
lcd_putc("Litros");
delay_ms(2000);
       

do{
output_high(PIN_B0);               //Led para verificar que el programa esta corriendo
delay_ms(500);
setup_adc (adc_clock_internal);
setup_adc_ports (all_analog);
set_adc_channel (0);                // Elige canal a medir RA0
delay_us (20);
Medicion=read_adc ();               // Hace conversión AD
setup_adc (adc_off);                // Apaga ADC
Porcentaje=(Medicion*100)/471;   // Conversion a Porcentaje
Litros=(Medicion*27)/471;   //Conversion a Litros
lcd_gotoxy(1,2);                    // Acomoda cursor LCD
printf(lcd_putc,"%02.1f",Litros);   // xxx.x Litros
output_low(PIN_B0);            //Led off 
delay_ms(500);

}while (TRUE);
}

Bueno no sé como adjuntar una imagen despues si me dicen lo hago pero simulado funciona tal cual, marque la parte que modifiqué en rojo, será por el controlador de la pantalla que no es un Hitachi y es un KS0066?? en la compilación no me tira ningún error. Bueno, muchas gracias, espero sus respuestas.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema con LCD y C CCS
« Respuesta #1 en: 07 de Marzo de 2011, 18:35:14 »
  Tendrías que mirar los datasheet de KS0066 y del HD44780. Yo estoy mirando la inicialización para bus de 4 bits y son diferentes entre ambos integrados.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Ale_arzer

  • PIC10
  • *
  • Mensajes: 9
Re: Problema con LCD y C CCS
« Respuesta #2 en: 07 de Marzo de 2011, 18:54:46 »
 Tendrías que mirar los datasheet de KS0066 y del HD44780. Yo estoy mirando la inicialización para bus de 4 bits y son diferentes entre ambos integrados.

Gracias por responder antes que nada. Pero el problema esta en otro lado, el PIC ni siquiera corre el programa, le he puesto el encendido del led conectado a RB0 al principio y al final del programa lo apago y no se apaga nunca, no sé cual es el problema en la simulación va perfecta, y en otro programa el PIC funciona, y en assembler la pantalla la manejo sin problemas. Intente agregando configuraciones del oscilador, también agregue la configuración del PORTB todo como salida, pero nada.
Dejo el programa que si corre:


#include <16f819.h>          
#fuses INTRC_IO,NOWDT,NOPROTECT,PUT  
#use delay (clock=4000000)    
#use fast_io(b)  

void main(void)
{
   set_tris_b(0xFE);  
   disable_interrupts(GLOBAL);  
   do{  
      output_low(PIN_B0);  
      delay_ms(500);            
      output_high(PIN_B0);  
      delay_ms(500);        
   }while(TRUE);            
}
« Última modificación: 07 de Marzo de 2011, 18:58:50 por Ale_arzer »

Desconectado Mando31

  • PIC10
  • *
  • Mensajes: 32
Re: Problema con LCD y C CCS
« Respuesta #3 en: 07 de Marzo de 2011, 19:03:29 »
Te sugiero uses la libreria llamada flex_lcd es más fácil asignar los pines que tu desees manejar para el lcd.

Link: Libreria Flex_LCD

Desconectado Ale_arzer

  • PIC10
  • *
  • Mensajes: 9
Re: Problema con LCD y C CCS
« Respuesta #4 en: 07 de Marzo de 2011, 19:10:44 »
Te sugiero uses la libreria llamada flex_lcd es más fácil asignar los pines que tu desees manejar para el lcd.

Link: Libreria Flex_LCD

Muchas gracias por tu respuesta. Le voy a echar un ojo a esa rutina y probar con eso, no sé cual será el valor de la simulación en Proteus, pero ahí corre perfecto el programa y mi modificación para usar otros pines parece ser correcta, pero como digo, no sé si es totalmente fiable una simulación. Muchas gracias.

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Problema con LCD y C CCS
« Respuesta #5 en: 07 de Marzo de 2011, 19:20:15 »
Hola Ale_arzer, en el último programita que pusiste de prueba no tienes el fuse NOMCLR.  En el circuito tienes el pin MCLR conectado a V+?  Por lo demás te debería funcionar.  Para esta prueba, no es necesario que pongas la instrucción #use fast_io(b) ni set_tris_b(0xFE);

Saludos!

Edito: Para el programa inicial, como tienes conectado el LCD? Puedes subir el circuito?
« Última modificación: 07 de Marzo de 2011, 19:22:20 por bmb »

Desconectado Ale_arzer

  • PIC10
  • *
  • Mensajes: 9
Re: Problema con LCD y C CCS
« Respuesta #6 en: 07 de Marzo de 2011, 19:28:59 »
Hola Ale_arzer, en el último programita que pusiste de prueba no tienes el fuse NOMCLR.  En el circuito tienes el pin MCLR conectado a V+?  Por lo demás te debería funcionar.  Para esta prueba, no es necesario que pongas la instrucción #use fast_io(b) ni set_tris_b(0xFE);

Saludos!

Edito: Como tienes conectado el LCD? Puedes subir el circuito?

Hola, gracias por responder, no uso en mi placa el MCLR, por eso le pongo el NOMCLR por si era eso, y ademas en el winpic800 elijo la opción de no usar el MCLR. De poder puedo subir el circuito pero no sé como adjuntar una imagen aquí, el LCD lo tengo conectado, RW a gnd no lo uso, RS a RB2, ENABLE a RB3, D4-D7 conectado RB4-RB7.

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Problema con LCD y C CCS
« Respuesta #7 en: 07 de Marzo de 2011, 19:49:54 »
Hola, gracias por responder, no uso en mi placa el MCLR, por eso le pongo el NOMCLR por si era eso, y ademas en el winpic800 elijo la opción de no usar el MCLR. De poder puedo subir el circuito pero no sé como adjuntar una imagen aquí, el LCD lo tengo conectado, RW a gnd no lo uso, RS a RB2, ENABLE a RB3, D4-D7 conectado RB4-RB7.

Hola, eso es justamente lo que te preguntaba, porque no pusiste NOMCLR en el último programita.  También creo que te hace falta el fuse NOLVP.  Poniéndole esos fuses ya te debería funcionar, de lo contrario tendrías que ver que no sea un problema de hardware.
Haces muy bien en intentar que te funcione primero con un LED. Luego que logres hacer funcionar el LED, para que funcione con un LCD, veo que tienes una versión vieja de la librería del LCD de CCS.  Que versión de CCS estás usando?  En las últimas versiones, puedes configurar los pines del LCD como te convengan.

Saludos!

Desconectado Ale_arzer

  • PIC10
  • *
  • Mensajes: 9
Re: Problema con LCD y C CCS
« Respuesta #8 en: 07 de Marzo de 2011, 20:48:20 »
Hola, gracias por responder, no uso en mi placa el MCLR, por eso le pongo el NOMCLR por si era eso, y ademas en el winpic800 elijo la opción de no usar el MCLR. De poder puedo subir el circuito pero no sé como adjuntar una imagen aquí, el LCD lo tengo conectado, RW a gnd no lo uso, RS a RB2, ENABLE a RB3, D4-D7 conectado RB4-RB7.

Hola, eso es justamente lo que te preguntaba, porque no pusiste NOMCLR en el último programita.  También creo que te hace falta el fuse NOLVP.  Poniéndole esos fuses ya te debería funcionar, de lo contrario tendrías que ver que no sea un problema de hardware.
Haces muy bien en intentar que te funcione primero con un LED. Luego que logres hacer funcionar el LED, para que funcione con un LCD, veo que tienes una versión vieja de la librería del LCD de CCS.  Que versión de CCS estás usando?  En las últimas versiones, puedes configurar los pines del LCD como te convengan.

Saludos!

Poner o no el NOMCLR me da el mismo resultado, el programita del led funciona perfectamente, porque la configuración también puedo modificarla en el entorno del winpic800, pero el programa de la LCD no corre. No puede ser problema de hardware ya que usando la misma LCD con el mismo PIC y placa, con un programa que hice en assembler funciona perfecto, que es lenguaje que use siempre pero me demoraba mucho entonces me pasé al CCS porque programaba en C en la PC, pero me da problemas en la práctica en las simulaciones no, es raro. Mi version de CCS es 4.068. Saludos

LCD funcionando con PIC16F819 en .ASM:
« Última modificación: 07 de Marzo de 2011, 21:21:31 por Ale_arzer »

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Problema con LCD y C CCS
« Respuesta #9 en: 07 de Marzo de 2011, 21:26:36 »
Poner o no el NOMCLR me da el mismo resultado, el programita del led funciona perfectamente, porque la configuración también puedo modificarla en el entorno del winpic800, pero el programa de la LCD no corre.

Hola, te aseguro que no es para nada lo mismo poner o no poner el NOMCLR en el circuito físico y por eso te pregunto: ya te funciona el programita del LED en el circuito real?  Pusiste el fuse NOLVP? Por otro lado, veo que tu versión de CCS es algo vieja.  La última versión del compilador CCS está en V4.119, sin embargo te debería funcionar con la librería LCD de esa versión.  Del winpic800 te comento que no lo conozco.  Creo que de momento lo importante es que hagas funcionar el LED en el circuito real y luego puedes ver lo del LCD.

Saludos!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema con LCD y C CCS
« Respuesta #10 en: 07 de Marzo de 2011, 21:52:49 »
Poner o no el NOMCLR me da el mismo resultado, el programita del led funciona perfectamente, porque la configuración también puedo modificarla en el entorno del winpic800, pero el programa de la LCD no corre.

Hola, te aseguro que no es para nada lo mismo poner o no poner el NOMCLR en el circuito físico y por eso te pregunto: ya te funciona el programita del LED en el circuito real?  Pusiste el fuse NOLVP? Por otro lado, veo que tu versión de CCS es algo vieja.  La última versión del compilador CCS está en V4.119, sin embargo te debería funcionar con la librería LCD de esa versión.  Del winpic800 te comento que no lo conozco.  Creo que de momento lo importante es que hagas funcionar el LED en el circuito real y luego puedes ver lo del LCD.

Saludos!

  bmb, Ale_arzer quiere decir que le da lo mismo ponerlo o no en el código, porque después lo especifica manualmente en el WinPic800
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado bmb

  • PIC18
  • ****
  • Mensajes: 423
Re: Problema con LCD y C CCS
« Respuesta #11 en: 07 de Marzo de 2011, 22:13:22 »
bmb, Ale_arzer quiere decir que le da lo mismo ponerlo o no en el código, porque después lo especifica manualmente en el WinPic800

Hola AngelGris, la verdad ni siquiera se lo que es el WinPic800  :oops:, yo utilizo el MPLab para editar y compilar y programo con un ICD2; los fuses que escribo en el código de CCS al compilar son los que realmente pasan al PIC al programarlo, a menos que especifique (al menos en el caso del MPLab) que quiero usar los fuses de la configuración del MPLab (configuration bits).  No se si será a eso a lo que se refieren con el WinPic800.  

Saludos!

Edito: En todo caso, el asunto es que bien sea en el código o manualmente el fuse si se debe usar.
« Última modificación: 07 de Marzo de 2011, 22:17:19 por bmb »

Desconectado Ale_arzer

  • PIC10
  • *
  • Mensajes: 9
Re: Problema con LCD y C CCS
« Respuesta #12 en: 07 de Marzo de 2011, 22:31:33 »
Poner o no el NOMCLR me da el mismo resultado, el programita del led funciona perfectamente, porque la configuración también puedo modificarla en el entorno del winpic800, pero el programa de la LCD no corre.

Hola, te aseguro que no es para nada lo mismo poner o no poner el NOMCLR en el circuito físico y por eso te pregunto: ya te funciona el programita del LED en el circuito real?  Pusiste el fuse NOLVP? Por otro lado, veo que tu versión de CCS es algo vieja.  La última versión del compilador CCS está en V4.119, sin embargo te debería funcionar con la librería LCD de esa versión.  Del winpic800 te comento que no lo conozco.  Creo que de momento lo importante es que hagas funcionar el LED en el circuito real y luego puedes ver lo del LCD.

Saludos!

El circuito del led me funcionó del principio y hace mucho que lo había realizado y probado, nunca tuve problema con eso, porque no conoces el winpic800 es que no me entendés, porque por mas que configure los fuses en el Mplab, después lo puedo cambiar a mi gusto en el winpic800 que es un programa para cargar el .hex al micro, entonces no afecta por que ahí elijo que no uso el MCLR y ya esta, siempre lo hice así y en .asm también y no uso LVP, no uso nada de eso, el problema es con el programa del LCD amigo, o sea con el programa en general, no corre, no hace nada, y no es un problema físico en hardware porque todo igual sin tocar nada solo cargando el programa hecho .ASM anda de diez y uso la misma configuración de pines. Estoy por adquirir un ICD3 después si tendremos el mismo proceso ;), Por el momento sigo intentando y ver que es el problema, espero poder encontrarlo. Muchas gracias por tu ayuda

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema con LCD y C CCS
« Respuesta #13 en: 08 de Marzo de 2011, 00:35:05 »
  bmb, creo que con la respuesta de Ale_arzer se entiende.  WinPic800 es un soft para grabar los PICs, en dicho soft podés configurar manualmente los bits de configuración (valga la redundancia) o fuses, por lo tanto no es imprescindible que estén especificados en el código. Pero sí sería conveniente que estén, por que de esa manera al compilarlo ya quedarían almacenados en el .hex

  Ale_arzer, hace la prueba de dejar el bloque do-while sin ninguna instrucción. Como al comienzo estás imprimiendo la palabra "Litros", al menos deberías poder ver eso en el LCD.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Ale_arzer

  • PIC10
  • *
  • Mensajes: 9
Re: Problema con LCD y C CCS
« Respuesta #14 en: 08 de Marzo de 2011, 02:09:21 »
  bmb, creo que con la respuesta de Ale_arzer se entiende.  WinPic800 es un soft para grabar los PICs, en dicho soft podés configurar manualmente los bits de configuración (valga la redundancia) o fuses, por lo tanto no es imprescindible que estén especificados en el código. Pero sí sería conveniente que estén, por que de esa manera al compilarlo ya quedarían almacenados en el .hex

  Ale_arzer, hace la prueba de dejar el bloque do-while sin ninguna instrucción. Como al comienzo estás imprimiendo la palabra "Litros", al menos deberías poder ver eso en el LCD.

Probé lo que me decís, pero no, no hace nada, y también probé de comentar todas las instrucciones, y puse el ejemplo del led y corre el programa, después saque las instrucciones para escribir el LCD y dejé nada mas que el lcd_init(); y antes de esto puse un  delay_ms(500); y después también y el led encendió y se apago, por lo que deduzco que hay algo en la librería que no anda bien, porque no inicializa el LCD y cuando le mando para que escriba en ella se queda colgado el PIC. Estoy bajando una versión mas nueva del CCS a ver que tiene de distinto la librería... Muchas gracias por tu ayuda, seguiré intentando y comentando algún resultado por acá. Saludos