¿Por qué el archivo .Hex funciona en Proteus y no en Protoboard?

#1
Hola a Todos, Me uni hace unos meses, Soy nuevo en el foro.
Mi problema es el siguiente.. acabo de comprar una lista de materiales para realizar un proyecto: \'Medidor de Temperatura con el LM35 Y el Pic 16f877\'.
El programa y .DNS lo halle en internet. Es en lenguaje c. Nunca usé éste mencionado. Solo he practicado con el asemmbler.
Pero pude compilar el programa con ayuda de tutoriales.
Ahora que monto mi circuito en Protoboard, veo que el LCD 16x2 no funciona. Solo esta prendida TODA la parte superior de la columna y no me muestra ningun caracter. Además los LEDs que incluyen no encienden.
Verifiqué si hay una mala conexión, pero noto que esta bien.. Me preocupa mucho.
Al momento de grabar al PIC no me aparece ningun error, sí he conectado el sistema como debe ser.
Algo adicional que puedo detallar, seria la alimentacion de mi microcontrolador. Uso 5 volts.
Puedo decir que tambien me andaba fallando ese regulador, pero noto que el voltímetro marca algo menos de 5v al conectar el Circuito. Es algo de 4.5 - 4-7v.
Porfavor ayudenme. Gracias. .. :)
 
Última edición:
#2
Bienvenido al mundo real.
Que algo funcione en un simulador solo indica que a lo mejor, es probable que funcione en la realidad.

Puede que sea un mal contacto o cualquier otra cosa.
 
#3
Algo así es extraño? Porque hice otro y tampoco me funciono. Pero es completamente ilógico para mí.
Puedo Escribir en el Pic, no me da ningún error, como dije antes.
Que hago :(
 
#5
Perdón por la resolución de la foto, es que no tengo cámara y la tome con mi celular.
Ese es el Circuito que estoy realizando. Y la conexión esta como en la de lapiz y papel. :(
 

Adjuntos

#6
si funciona en el simulador debe funcionar en el chip... seguro no estas configurando bien el programador del chip. te recomiendo que empieces con un programa mas simple, el led intermitente por ejemplo y el LCD se pone asi cuando no esta configurado solo hay tensión pero no hay comunicación.
 
#9
En realidad no hice el programa. Solo lo descargue de un link que redireccioné de un video de Youtube.
Ahí se detallaba algo de la programación en C. No entendí porque nunca lleve ese lenguaje. Esa es un excusa. Pero intentaré buscar información.. Muchas Gracias!
 
Última edición:
#11
intenta poner un delay_ms(1000); antes del primer LCD_init(); y checa los fuses ¿lo hiciste?

#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
 
Última edición:
#12
intenta poner un delay_ms(1000); antes del primer LCD_init(); y checa los fuses ¿lo hiciste?

#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
El Retardo de 1000ms. No es necesario y provocará cuadros negros antes de que se escriba algo, por inicialización tardía de la pantalla.
Usando la librería de PIC C Compiler ya no es necesario ese retardo, pero sí la palabra de configuración
 
Última edición:
#16
¿Algún link que pueda servirme de ayuda? Lo necesito.
Mira por aquí: Curso de programación en C para microcontroladores PIC
Aquí en el Foro existen muchos ejemplos que puedes ver para que tengas una idea.

Hubiera sido más fácil que adjuntaras el proyecto dentro de un archivo comprimido.
Así se podría editar y enviar el programa corregido.
Sin embargo, al parecer el problema que tienes, únicamente se debe a que el programa no tiene la palabra de configuración.
Coloca la que te mencionó papirrin y posiblemente tengas el problema solucionado.
Por simplicidad, yo inicio de esta sencilla manera:
Código:
#include <16f877a.h>
#fuses   nobrownout
#use     delay(crystal = 4MHz)
De esta forma ya no es necesario colocar fuses extra pues el compilador se encarga de colocar los fuses necesarios.

Sobre los fuses de la palabra de configuración y problemas con LCD en CCS, ya se ha tratado por aquí:
Problemas con Display LCD en CCS

Lee esos temas y encontrarás mucha información que te podrá servir.
 
#17
si funciona en el simulador debe funcionar en el chip... seguro no estas configurando bien el programador del chip. te recomiendo que empieces con un programa mas simple, el led intermitente por ejemplo y el LCD se pone asi cuando no esta configurado solo hay tensión pero no hay comunicación.

:no: :no: :no: :no: como se ve q no has lidiado con esos simuladores, personalmente NUNCA me han gustado, pq al final debes montar y correguir esos pequeños errores, por lo que veo, y me ha pasado estas teniendo problemas en la rutina de inicializacion del LCD, aumenta un poco los delay entre las instrucciones de configuracion del LCD, asi lo he solucionado yo, tambien puedes tener el LCD malo y o mal conectado/configurado. chaoooo
 
#19
Y como sabría si mi PIC anda funcionando perfectamente.
:unsure: no me habia fijado bien pero esas resistencias de 100R estan muy pesadas, I=5/100=50mA, cada puerto como maximo soporta 20mA, asi que es muy probable que este muerto.

y yo no conectaria asi esos motores.
 
#20
¿Y cómo sabría si mi PIC anda funcionando perfectamente?
Quizá se haya averiado.
Posiblemente por lo que menciona papirrin, pero puedes salir de dudas muy fácilmente.
Usa este programa de prueba para que veas si funcionan los puertos.
Hace algo similar a los focos del auto fantástico (K.I.T)
Código:
#include <16f877a.h>
#fuses   NOBROWNOUT
#use     delay(crystal = 4MHz)
#use     fast_io(b)

#byte    leds = getenv("SFR:PORTB")

void main (void)
{int8 i;
   
   set_tris_b(0x00);       // Puerto B como salidas.
   output_b(0x01);         // Iniciar con el bit 0 en 1
   
   while (true)
   {
      
      for(i=1;i<=7;++i)    // Bucle de 1 a 7
      {
         leds <<=1;        // Ir desplazando un bit hacia la izquierda. (LSB a MSB)
         delay_ms(150);    // Retardo de 150ms.
      }
      
      for(i=1;i<=7;++i)
      {
         leds >>=1;        // Ir desplazando un bit hacia la derecha. (MSB a LSB)
         delay_ms(150);
      }
   }
}
Para probar los puertos C y D, cambia la B de SFR:pORTB por la letra del puerto, en fast_io(b); en set_tris_b(0x00); y lo mismo con output_b(0x01);
Puedes realizar la prueba de los bits de cada puerto con LED's y su resistencia de 330Ω o con una punta lógica.

Como los puertos A y E no son de 8 bits externos, los puedes hacer cambiar de estado.
Código:
      for(i=1;i<=10;++i)
      {
         output_a(0x3F);
         output_e(0x07);
         delay_ms(150);
         output_a(0x00);
         output_e(0x00);
         delay_ms(150);
      }
Sobre la configuración como Digital I/O, no te preocupes, el compilador configura el registro ADCON1 por defecto para que sean digitales (ADCON1 = 0b00000111)

Esto no es una prueba completa, pero al menos sirve para verificar los puertos como salidas.

Para probar la pantalla, usa este sencillo programa: DSC00086.JPG
Código:
#include <16f877a.h>
#fuses   NOBROWNOUT
#use     delay(crystal = 4MHz)
#include <lcd.c>

void main (void)
{
   lcd_init();
   lcd_putc("\f Feliz Navidad");
   lcd_gotoxy(5,2);
   lcd_putc("FDE 2014");
   
   while (true);
}
Si no consigues que funcione con éstas pruebas, adiós PIC y/o pantalla.
 

Adjuntos

Última edición:
Arriba