Autor Tema: No me sale el primer caracter del lcd en proteus  (Leído 3385 veces)

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

Desconectado davempayo

  • PIC10
  • *
  • Mensajes: 7
No me sale el primer caracter del lcd en proteus
« en: 23 de Marzo de 2010, 08:15:53 »
Buenos dias,
Estoy iniciando en los lcd´s, y creando mi primer programa no me muestra todo el mensaje en proteus, no me sale el primer caracter de la primera linea. Estoy utilizando lcd con 4bits por el puerto_b del pic.
Os adjunto el programa y el diagrama en proteus.
Espero que me ayudeis, muchas gracias.
Un saludo.


Codigo en CCS:

 //PREPROCESO
#include <16f84A.h>
#fuses HS ,NOWDT
#use delay(clock=4000000)
#use fast_io(a)           //Optimizamos E/S del PORTA
#use fast_io(b)           //Optimizamos E/S del PORTB
#byte PORTA=0x05          // Dirección del PortA
#byte PORTB=0x06          // Dirección del PortB
#INCLUDE <lcd.c>

//MAIN
void main()

   set_tris_a(0b11111); //Entrada
   set_tris_b(0b00000000); //salida
   PORTA = 0x00;           // Limpiamos Puerto A
   PORTB = 0x00;           // Limpiamos Puerto B

   lcd_init();
   lcd_gotoxy(1,1);
   lcd_putc ("MI PRIMER");   //Escribo en la primera fila
   lcd_gotoxy(1,2);
   lcd_putc ("PROGRAMA");
}

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No me sale el primer caracter del lcd en proteus
« Respuesta #1 en: 23 de Marzo de 2010, 10:03:43 »
Hola davempayo casi mejor que uses:

 
Código: CSS
  1. cd_init();
  2.    lcd_gotoxy(1,1);
  3.    printf(lcd_putc,"MI PRIMER");   //Escribo en la primera fila
  4.    printf(lcd_putc "\nPROGRAMA");

al poner \n te ahorras una linea de codigo, ya que lo que hace es situar el cursor en la pimera posicion de la segunda linea.

De todos modos si usas el buscador hay un monton de ejemplos con lcd.

 Saludos
 Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No me sale el primer caracter del lcd en proteus
« Respuesta #2 en: 23 de Marzo de 2010, 10:05:52 »
Ojo con la primera linea que le falta la l eso pasa por copiar y pegar :mrgreen:
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado davempayo

  • PIC10
  • *
  • Mensajes: 7
Re: No me sale el primer caracter del lcd en proteus
« Respuesta #3 en: 23 de Marzo de 2010, 11:56:03 »
y que diferencia hay en utilizar printf(lcd_putc,"MI PRIMER");  o  lcd_putc ("MI PRIMER"); es mejor para el compilador?

he cambiado el codigo como tu me has dicho pero me sigue sin aparecer la primera letra de la frase. No se el porque es, llevo unos cuantos dias intentando averiguar el error. Aver si alguien me puede hechar una mano.

Muchas gracias

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: No me sale el primer caracter del lcd en proteus
« Respuesta #4 en: 23 de Marzo de 2010, 14:46:08 »
OJO, inicias el lcd a cada momento, deberia ser asi:
Código: C
  1. lcd_init();
  2. lcd_gotoxy(1,1);
  3. lcd_putc ("MI PRIMER");   //Escribo en la primera fila
  4. lcd_gotoxy(1,2);
  5. lcd_putc ("PROGRAMA");
  6. do
  7. {
  8.  
  9. }
  10. while(true);

como bucle infinito

Saludos.
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: No me sale el primer caracter del lcd en proteus
« Respuesta #5 en: 23 de Marzo de 2010, 15:06:49 »
Hay que hacer un borrado del lcd una vez entre lcd_init() y el resto del programa.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: No me sale el primer caracter del lcd en proteus
« Respuesta #6 en: 23 de Marzo de 2010, 15:07:00 »
Tal como esta no tiene bucle infinito.

Prueba con:

Código: C#
  1. printf(lcd_putc,"\fMI PRIMER");
  2. printf(lcd_putc,"\nPROGRAMA");

Saludos
El papel lo aguanta todo

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: No me sale el primer caracter del lcd en proteus
« Respuesta #7 en: 23 de Marzo de 2010, 16:24:11 »
Otra cosa en los fuses tienes puesto HS y al ser a 4MHz deberias de poner XT

  Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado davempayo

  • PIC10
  • *
  • Mensajes: 7
Re: No me sale el primer caracter del lcd en proteus
« Respuesta #8 en: 24 de Marzo de 2010, 05:57:52 »
Muchisimas gracias chicos, he solucionado el problema poniendo el bucle infinito y borrando el lcd despues de lcd_init().

Una ultima pregunta, que diferencia existe entre la funcion  printf(lcd_putc,"\fMI PRIMER");   y lcd_putc ("\fMI PRIMER");, es mejor la primera para para el compilador? aprovecha mejor los recursos? es que no se la diferencia, se que la mayoria utilizais printf.

Muchas gracias por todo.
Un saludo

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: No me sale el primer caracter del lcd en proteus
« Respuesta #9 en: 24 de Marzo de 2010, 14:14:54 »
La funcion printf permite utilizar los modificadores de texto y numericos, de forma tal que verias mezclados texto y numeros segun necesites.
Por ejemplo:
Si necesitas mostrar un texto acompañado de un numero que cambia segun una variable, se escribe asi.

Código: C
  1. lcd_gotoxy(1,1);
  2. printf(lcd_putc,"Nivel Tque 1:%03u",Nivel_Tanque_1); // LCD linea 1
  3. lcd_gotoxy(1,2);
  4. printf(lcd_putc,"LitrosT1:%07.1f",LitrosTque1); // LCD linea 2

Se entiende??

PD:
lcd_gotoxy(x,y) es una funcion añadida a mi libreria lcd y que si mal no recuerdo la hizo el Maestro Sispic
« Última modificación: 24 de Marzo de 2010, 14:17:21 por MGLSOFT »
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado davempayo

  • PIC10
  • *
  • Mensajes: 7
Re: No me sale el primer caracter del lcd en proteus
« Respuesta #10 en: 26 de Marzo de 2010, 17:17:23 »
Buenas tardes chicos,
Entendi todas las expicaciones que me disteis.
Pero ahora tengo otro problema al montar el circuito en mi protoboard. cuando cuado inicio el pic por el lcd me sale una linea oscura y en la otra nada, no se el motivo de ello, y no me sale ningun mensaje por el lcd. Le he puestos unos output_high al programa para ver si la libreria me carga bien y lanza las llamadas al lcd, y me doy cuenta que falla en la llamada de lcd_init. supongo que tengo mal modificada la libreria (utilizo el lcd por el puerto_b), la coji de google, para variar,jeje.
Espero que me podais ayudar. os adjunto la libreria y el programa.
Muchas gracias de antemano.



///////////////////////////////////////////////////////////////////////////
// LCD.C modificada por uControl.com.ar                                   
///////////////////////////////////////////////////////////////////////////
//     B0 
//     B1 
//     B2  E
//     B3  RS
//     B4  D4
//     B5  D5
//     B6  D6
//     B7  D7
//   (Sin 'RW')
//
// 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;
//
#byte lcd = 0xF81  // Direccion de la estructura "lcd".
#byte lcd = 6      // Direccion del puerto B.
#define set_tris_lcd(x) set_tris_b(x)
#define lcd_type 2           // Tipo de LCD: 0=5x7, 1=5x10, 2=2 lineas
#define lcd_line_two 0x40    // Dirección de la LCD RAM para la 2da. linea
//
//Defino la cadena de inicializacion del LCD.
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
//
//Configuro el estado de cada pin para lectura y escritura:
struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // Escribir.
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // Leer.
//
//Funciones:
BYTE lcd_read_byte() {
      BYTE low,high;
      set_tris_lcd(LCD_READ);
      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);
      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.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;
   }
}


 
Programa que grao en el pic:

#include <16f84a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#include<lcd.c> //libreria manejo lcd

///PROGRAMA
void main(void)
{
output_high(pin_b0);
delay_ms(300);
output_low(pin_b0);
delay_ms(300);

   lcd_init(); //inicializa lcd
   
   output_high(pin_b0);
delay_ms(300);
output_low(pin_b0);
delay_ms(300);
   
   printf(lcd_putc,"\fMI 1ER PROGRAMA" ); //...para borrar pantalla e iniciar contador
    printf(lcd_putc,"\nPROBANDO" ); //auto publicidad en la 2ºfila lcd
   
    output_high(pin_b0);
delay_ms(300);
output_low(pin_b0);
delay_ms(300);

  While(true){}
}



Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: No me sale el primer caracter del lcd en proteus
« Respuesta #11 en: 26 de Marzo de 2010, 17:31:29 »
Si no pegas una imagen del esquematico de tu circuito puede que nos lleve unas 40 preguntas hasta poder ayudarte.
Proteus no simula cortocircuitos, y si en el circuito real hay cortos de algun tipo, esto que dices suele suceder...

Lo que pones como error es tipico de que el lcd no recibe la inicializacion, pero las razones por las cuales puede ocurrir son multiples, aunque la mas comun es corto entre pistas.

Recomiendo que tomes un multimetro y revises pin a pin que no haya cortos y que las lineas comuniquen correctamente a donde deben hacerlo (verificacion de continuidad).

Mientras tanto si subes el esquema, vamos dandote otra idea.
No es necesario que sea un dibujo CAD, puede ser hecho a mano y escaneado...
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado davempayo

  • PIC10
  • *
  • Mensajes: 7
Re: No me sale el primer caracter del lcd en proteus
« Respuesta #12 en: 26 de Marzo de 2010, 18:57:46 »
Subo el diseño en proteus. En proteus me tira bien el fallo me da en el motaje. Tambien comentar que en el motaje en el pin vee de LCD tengo un potenciometro de 10k que el proteus no aparece.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: No me sale el primer caracter del lcd en proteus
« Respuesta #13 en: 26 de Marzo de 2010, 19:40:18 »
Mal, mal, chico malo!! :5] :5]

Esta libreria ni en Proteus pudo funcionarte antes!!

Esta linea:
#byte lcd = 0xF81  // Direccion de la estructura "lcd".  <<<<<<<< esto es para la linea 18F !!! borrarla o comentarla!!!
#byte lcd = 6      // Direccion del puerto B.   <<<<<<<<< Esta es la que sirve!!1

Para que poner esta instruccion si no usas el pin RW
while ( bit_test(lcd_read_byte(),7) ) ;  <<<<<<<<<<< el pic se queda eternamente preguntando por el bit ese, ahi reemplazar por una instruccion delay_ms(50)  o mas, segun la marca...

Que cosa esta conectada a los demas pines??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado davempayo

  • PIC10
  • *
  • Mensajes: 7
Re: No me sale el primer caracter del lcd en proteus
« Respuesta #14 en: 27 de Marzo de 2010, 08:43:19 »
Gracias MGLSOFT , he conseguido que me funcione el lcd. Lo he conseguido comentando la linea #byte lcd = 0xF81  
y comentando tambien la linea while ( bit_test(lcd_read_byte(),7) ) ;  
Esta web es impresionante gracias a todos.
Un saludo
« Última modificación: 27 de Marzo de 2010, 15:15:01 por davempayo »


 

anything