Autor Tema: LCD PC1602 y 16f876  (Leído 2580 veces)

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

Desconectado pdurden

  • PIC10
  • *
  • Mensajes: 21
LCD PC1602 y 16f876
« en: 20 de Septiembre de 2005, 17:03:00 »
Tengo 2 problemas con un proyecto en el q utilizo un 16f876 y un lcd(PC1602). El primer problema es q a pesar de haber repasado mil veces las conexiones el lcd no me funciona y no se donde puede estar el fallo. El lcd es de 16 pins y las conexiones las realizo de la sigueinte manera:
                E-->      RB0
                RW-->   RB1
                RS-->    RB2
                D7-->    RB7
                D6-->    RB6
                D5-->    RB5
                D4-->    RB4
El pin Vo de contraste lo pongoa un potenciometro de 10k y el de alimentacion y masa como corresponde. el 15 y 16 denominados A y K respectivamente los dejo al aire pues creo k no son necesarios(bendita ignorancia)
Utilizo osci de 4MHz y el archivo de cabezera del lcd es el siguiente(me lo tengo miradisimo y todo parece estar bien):


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


struct lcd_pin_map {                 // 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 pin B0.
        } lcd;


#if defined(__PCH__)
#if defined use_portb_lcd
   #byte lcd = 0xF81                   // 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_portb_lcd
   #define set_tris_lcd(x) set_tris_b(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


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


Ante este problema decidi probar con el proteus pero ahi me encontre con el segundo problme. Para realizar la compilacion me baso en el manual de proteus k hay en conket ( akeste: http://www.conket.com/modules.php?name=Sections&op=viewarticle&artid=33), para el k se debe recurrir a un archivo .cof k mi compilador no genera(utilizo ccs), y no se ni porq ni como podria  obtenerlo. Pense k kizas fuese la version k tengo del ccs(3.190) o k dios me esta castigando. bueno, si alguien tiene alguna idea de por donde puedo tirar, lo cierto es k ahora estoy jodidamente perdido y no se k mas probar

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: LCD PC1602 y 16f876
« Respuesta #1 en: 21 de Septiembre de 2005, 01:59:00 »
Para probarlo en PROTEUS simplemente introduce el .hex en el PIC

Si quieres simulación paso a paso se usa el .cof

Yo la única manera que he encontrado de que se genere el .cof es compilando desde el IDE de CCS. Si disparas el compilador desde PROTEUS no se genera.

Prueba y cuentas.

Un saludo.

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: LCD PC1602 y 16f876
« Respuesta #2 en: 21 de Septiembre de 2005, 05:00:00 »
No se si las versiones anteriores del CCS generan el archivito .coff necesario para la simulacion en PROTEUS, la version CCS 3.227 si lo genera...de todas formas como a indicado pocher, el fichero .coff es simplemente para el paso a paso, si no te interesa depurar el programa paso a paso en PROTEUS simplemente carga el archivito .HEX que ese seguro que lo genera tu compilador....sobre la libreria que usas es la lcd.c de CCS que es compatible con la Hitachi 44780...aqui te dejo un enlace sobre ejemplitos en c trabajando con la libreria que usas y su simulacion en PROTEUS:
http://miarroba.com/foros/ver.php?foroid=46840&temaid=4061462&pag=4
Y si tienes problemas....pon tu codigo haber si el fallo esta ahi...suerte!!!Giño
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: LCD PC1602 y 16f876
« Respuesta #3 en: 21 de Septiembre de 2005, 06:22:00 »
Me extraña araña que no sepan habilitar la generacion de archivos coff desde el CCS....Sonrisa GiganteSonrisa GiganteSonrisa Gigante

Hay que entrar al menu OPTIONS > File Formats y en la pestaña Compiler hay varios cuadros de opciones, en el titulado Debug File deben clickear sobre la opcion .COFF y ya esta listo para generar ese archivo.RebotadoRebotadoRebotadoRebotado

Suerte !!!NavidadNavidad
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado pdurden

  • PIC10
  • *
  • Mensajes: 21
RE: LCD PC1602 y 16f876
« Respuesta #4 en: 21 de Septiembre de 2005, 14:40:00 »
Pues lo hare con el archivo .hex pues la simulacion paso a paso ya la realizo con el ccs, pero queria saber de donde obtener el dichoso archivo coff. probe a señalar la pestaña q me indica mglsoft pero parece q en la version q tengo(3.190) no esta. bueno lo dicho, me da lo mismo.
Con respecto al programa y el lcd el codigo es el siguiente:

#include<16f876.h>
#use delay(clock=4000000)
#include<lcd.c>
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP
#use fast_io(B)



void main()
{

   lcd_init();
   lcd_putc("       Hola     "Giño;
   delay_ms(5000);

   lcd_putc("f"Giño;
   delay_ms(5000);

   lcd_putc("
"Giño;
   lcd_putc("       Adios    "Giño;

   delay_ms(5000);
   lcd_putc("f"Giño;
}

 q como podeis ver es una gran parida o mas... y bajo mi humilde opinion le veo nada malo
Probare con los ejemplos q me poneis y haber si acaba funcionando. ya os contare. gracias por la ayuda y felicidades por este bendito foro

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: LCD PC1602 y 16f876
« Respuesta #5 en: 21 de Septiembre de 2005, 15:21:00 »
Sonrisa GiganteSonrisa Giganteprimero saca el delay_Cicles y cambialo por el mismo valor en Delay_us, aunque a 4 mhz anda bien si simulas a otra frecuencia seguro ya no es lo mismo.

Despues comenta la linea #use fast_io(B), para evitar que influya eso en la libreria LCD...

Luego comenta que te pasa.

Y para esa version puede que haya cositas diferentes, como lo de simular el coff...Sonrisa Gigante
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado pdurden

  • PIC10
  • *
  • Mensajes: 21
RE: LCD PC1602 y 16f876
« Respuesta #6 en: 22 de Septiembre de 2005, 13:40:00 »
He probado a cambiar cicles por us y tb a poner en fuses PUT en vez de NOPUT (por cierto se  q las siglas significan power up timer, pero lo cierto es q no se cual es la utilidad) y a comentar lo de use fast. Todo lo poco q llevo trabajado con el micro lo aprendi de este foro, de conket y de los datasheets y todavia tengo muchas lagunas en ciertos temas. Lo unico q ahora se me ocurra q pueda ser el fallo, es la carga del programa con el ic-prog en un te-20. Escribi ese sencillo programa q deje colgado en este tema y lo guarde en una carpeta con el nombre de pruebaled.c. Mi pregunta, q no se si sera ridicula o no, pues es lo unico k ahora se me ocurre, es si al abrir y cargar en el icprog el archivo pruebaled.hex tb se incluye el 16f876.h y el lcd.c en el mismo. Espero q sea eso porq sino no se por donde seguir Llorando

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: LCD PC1602 y 16f876
« Respuesta #7 en: 22 de Septiembre de 2005, 14:48:00 »
Quedate tranquilo, que cuando compilas se incluyen los archivos asociados, sino no funciona el hex.
Cuando lo grabas te muestra el PIC16f876 en el software??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado pdurden

  • PIC10
  • *
  • Mensajes: 21
RE: LCD PC1602 y 16f876
« Respuesta #8 en: 22 de Septiembre de 2005, 16:00:00 »
probe a grabarlo con el icprog y con el winpic800 y parece q todo da correcto.El icprog esta bien configurado y el winpic ya hace la deteccion del pic. he probado otros programas sobre el pic,(sencillos de leds y demas chorradas) q no usan el lcd y tb parece q la grabacion es buena pues sale todo bien. El lcd es nuevo pero tiene q ser de su conexion o es k esta jodido. Al soldar las pistas tuve mucho cuidado de no estar mucho rato por si se fastidiaba algo. No se. Hay alguna manera de probaar el lcd sin micro y sin nada? comprobar si se enciende algo? mire la alimentacion y esta a 5v exactos y el contraste a 4 y pico pero el bicho no hace nada(no se si al iniciarlo se comprueban las lineas o algo).El caso es q este pc1602 no da señales de vida. Estoy por llevarlo al rastro...Llorica

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: LCD PC1602 y 16f876
« Respuesta #9 en: 22 de Septiembre de 2005, 16:19:00 »
Puedes poner el esquematico para ayudarte mejor!!

Dices que probaste el circuito y con otros programas el LCD anda??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado pdurden

  • PIC10
  • *
  • Mensajes: 21
RE: LCD PC1602 y 16f876
« Respuesta #10 en: 22 de Septiembre de 2005, 17:22:00 »
Lo q probe, lo hice sin el lcd y me funcionaba, lo q significa q el fallo no es del pic sino del lcd o de la conexion. El esquema intento colgarlo pero me da espacio insuficiente  ??? son 12Kb. Te lo envio por e-mail? tb te puedo mandar el datasheet del lcdPC1602 aunk es unamiserable carilla y es igual q cualkier otro modelo. Yo en el esquema no veo ningun error pero... no tengo ni puñetera idea

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: LCD PC1602 y 16f876
« Respuesta #11 en: 23 de Septiembre de 2005, 07:18:00 »
Envialo por el privado, vas directamente por el boton debajo de mi mensaje, y el adjunto recuerda colgarlo del mismo, debajo del mensaje por defecto se pone adjunto > ninguno, pones la cantidad y los agregas (peso menor a 256Kb).

MarcosSonrisa GiganteSonrisa Gigante
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado pdurden

  • PIC10
  • *
  • Mensajes: 21
RE: LCD PC1602 y 16f876
« Respuesta #12 en: 23 de Septiembre de 2005, 14:31:00 »
Por fiiiiiiiiiiiiiiiiiiiiiiiiiiiiiin. Resulta q el problema estaba en la alimentacion del contraste con Vo. Estuve mirando en foros en internet y me entere q para este lcd el contraste adecuado se consigue poniendo a masa dicho pin. gracias por toda la ayuda prestada MGLSOFT

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: LCD PC1602 y 16f876
« Respuesta #13 en: 23 de Septiembre de 2005, 15:51:00 »
Je..je..
De nada, y agradece a los demas que colaboraron, yo solo te obligue a salir del circulo, que es lo mas dificil.
Llega un momento en que empiezas a tratar de morderte la cola como hacen los perros, y caes extenuado.
Felicidades!!

Igual voy a husmear los archivos, si no te importa, siempre se aprende algo.Sonrisa GiganteSonrisa Gigante
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.


 

anything