# No logro simular un LCD-4bit en Proteus



## silicon blood (Mar 13, 2011)

Que tal amigos, estoy ya agotado de tanto buscar en la web sin encontrar la respuesta a mi problema, y por eso acudo al mejor foro que conozco. Tengo un programa en asm que debe mostrar un simple "Hola" en un Modulo LCD LM016L (hitachi HD 44780) con un PIC 16F84A empleando solo 4 bits. Los otros bits disponibles los tengo ocupados en un contador (un par de displays 7-SEG), entonces la idea es que cuando el contador llegue a un numero (por ejemplo 11) aparezca el mensaje en el LCD.

Para no enrrollarlos mucho les adjunto el codigo y la simulacion. Ver el archivo adjunto LCD.rar

Ah una curiosidad es que con la frecuencia que trae el modulo en proteus (250KHz) me sale un error de "controller received data whilst busy" pero al cambiar la frecuencia en propiedades a 4MHz esto no sucede, pero igual no sale nada en el LCD.

Por cierto uso otro PIC como codificador para el 7-SEG por que en mi casa no tengo un 74LS47 pero si otro PIC jejeje...


----------



## Vick (Mar 13, 2011)

Cambio la pregunta al foro de simuladores ya que estamos hablando de Proteus...

Respecto a tu duda:

No debes cambiar la frecuencia del LCD es la frecuencia normal de funcionamiento.

El error que te da es por que el LCD esta ocupado cuando intentas mandar un dato, y así no puede recibirlo, debes tener algún error en los retardos para esperar a que el LCD este disponible chaca las temporizaciones.

En la simulación no coloques dos PICs, esto puede afectar (a la simulación)


----------



## silicon blood (Mar 13, 2011)

bueno lo de colocar 2 pic's se soluciona facil.. solo queria acercarme mas a la realidad, lo que pasa es que aun no he comprado el modulo LCD.

Respecto a cambiar la frecuencia, bueno la puedo revertir y volver a obtener el error, pero respecto al codigo... No se que hacer! no se donde esta el error.. creo que estoy haciendo todo bien, la inicializacion del modulo, los retardos, todo! y aun asi el proteus nada..!!

bueno agradeceria su ayuda por eso mismo colgué todos los archivos, asi tienen full acceso a lo que he hecho hasta ahora. Gracias.


----------



## donfructuoso (May 22, 2012)

Solucion al error "Controller received data whilst busy" en la simulacion con Proteus en lenguaje C del CCS y PIC 18F4550.


//------------------------------------------------MODIFICAR FUNCION EN LCD.C-------------------------------------------

Según mi experiencia modificando la funcion "void lcd_send_byte( BYTE address, BYTE n )" que vien en lcd.c se puede simular sin errores el LCD en Proteus



1.- La función modificada quedaría así:

//---
void lcd_send_byte( BYTE address, BYTE n ) {

      lcd.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ;  //Original
      delay_ms(10);    //Añado un retardo para que funcione la simulación en Proteus
      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);
}

//---

2.- Conclusión

Creo que el problema se debe a que se "pisan" los comandos o los datos en el envío y/o recepción. Añadiendo la línea "delay_ms(10);    //Añado un retardo para que funcione la simulación en Proteus" se soluciona.


3.- Ejecución en tiempo real

En la ejecución real del programa en el PIC (según mi experiencia) se visualiza correctamente tanto si hacemos los cambios en la función como si no.


4.- El programa completo básico

El programa en c bajo el que se simula correctamente el LCD es el siguiente:


//------------------------------------------------PROGRAMA MAIN-------------------------------------------

#include <18f4550.h>
#fuses hs,nowdt,noprotect,nolvp
#use delay(clock=20000000)
#use standard_io(B)
#define use_portB_lcd TRUE
#include <lcd.c>


/*


El sistema funciona correctamente.

Para las conexiones y la generación de código ver:





*/

void main()
{

      int x;
      lcd_init();

      while (1)
      {

            printf(lcd_putc, "\f Uno");
            delay_ms(100);

            printf(lcd_putc, "\f Dos");
            delay_ms(500);

            printf(lcd_putc, "\f Tres");  
            delay_ms(1000);

            printf(lcd_putc, "\f Cuatro");   
            delay_ms(2000);

            printf(lcd_putc, "\f Cinco");     
            delay_ms(3000);           


            x = 0;


      }
}


----------



## Arsenic (Ene 20, 2016)

¿Cuál sería la configuración para un PIC18F2550? Porque no estoy viendo que en el código hayas declarado pin a pin.


----------

