PIC16F877A (con LCD) no funciona

Diseñé un proyecto de microcontrolador PIC18F877A para leer la temperatura de un LM35 usando ADC, mostrarla en una pantalla LCD y transmitirla a un puerto serie.

Cuando se inicia el programa, a veces muestra un mensaje de inicio, a veces no muestra nada. Además, la conexión del puerto serie no funciona. ¿Alguien puede ayudar? ¿Me estoy perdiendo algo? ¿Falta alguna conexión a tierra?

Diagrama de circuito circuito soldado el circuito funciona pero se detuvo aquí circuito no funciona

Mi código:

#include <16F877A.h>
#device adc=10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232 (baud=9600,rcv=PIN_C7, xmit=PIN_C6)
#include <lcd.c>
float value;
float temp;
float temp2;
float temp3;
float temp4;
float temp5[14];
float count[14];
int c;
void main(void)
{
//setup_adc_ports( ALL_ANALOG );//Initialize and Configure ADC
//setup_adc(ADC_CLOCK_INTERNAL );
while(1)
{
lcd_init();
lcd_gotoxy (1,1);
delay_ms(1000);
printf(lcd_putc,"   WELCOME TO\n Micro Tech Sol.");
delay_ms(3000);
lcd_gotoxy (1,1);
printf(lcd_putc,"  Fuel Monitoring \n     PROJECT   ");
delay_ms(3000);
}

}
¿Tiene un retraso en el encendido antes de comenzar a inicializar la pantalla? De lo contrario, intente esperar 1 segundo antes de hacer algo con su uC. Esto se debe a que el VDD puede aumentar lentamente cuando se extrae mucha corriente (por una luz de fondo, por ejemplo).
Cada par de pines Vdd-Vss debe desacoplarse cerca del chip.
Tiene retardo de inicialización. Ahora ha colocado un condensador de 10 uf en los pines 11 y 12.
Debe ser de 100 nF, con 10 uF para desacoplamiento masivo.
muestre su código y los detalles del compilador. Si su código puede mostrar un mensaje de bienvenida, las posibilidades de que el hardware esté defectuoso son solo aproximadamente el 10%. Las principales posibilidades pueden estar en el error de lógica de codificación.
@AbdulRehman Está funcionando algunas veces, lo que puede significar que el código está funcionando. al lado estoy publicando código para ref.
@LeonHeller ¿Puedes decirme cómo? o puede darme una muestra ya que no soy ingeniero electrónico sino controladores de aprendizaje.
el pin 11 y el pin 32 son VDD, y el pin 12 y el pin 31 son de VSS. Su diagrama solo menciona el pin 11 y el pin 12, pero no el 32 y el 31. Asegúrese de que también estén conectados a los voltajes de alimentación adecuados.
@AbdulRehman Los conecté, lo siento por no mencionarlos en la publicación.
¿Dónde está el retraso de inicialización? no lo veo Además: lcd_init()está en el while(1)bucle. ¡Está inicializando la pantalla LCD continuamente!
¿Se han desacoplado ambos pines Vdd? ¡Esto es como sacar los dientes!

Respuestas (2)

  1. Su comentario "Funciona algunas veces, lo que puede significar que el código funciona". significa (para mí) que el hardware no está frito (de lo contrario, no funcionaría en absoluto) y que su software necesita ajustes.

  2. Es posible que desee utilizar un pin GPIO no utilizado como señal de "latido" y alternarlo en varios lugares de su bucle while. Esto le permite no solo asegurarse de que su código no se pierda (con su programa simple, no debería ser así), sino también si su tiempo general es válido o no. Por ejemplo, puede configurar el pin antes de uno de sus retrasos y luego borrarlo. Si ve que el pin cambia de estado durante 1 segundo, sabrá que su cristal está funcionando, que el oscilador PIC está configurado correctamente y que sus retrasos están funcionando.

  3. Puede haber alguna incompatibilidad entre el controlador de LCD que está utilizando y el LCD específico con el que está trabajando. Es posible que deba modificar ese código LCD: agregue demoras adicionales, etc. hasta que su LCD coopere.

  4. lcd_init()y la delay(1000)necesidad de salir del ciclo while, como han dicho otros. Necesita eso delay(1000)después de llamar lcd_init()antes de que se envíen los comandos; es posible que necesite un retraso un poco más largo dependiendo de su hardware LCD específico.

  5. Si ha agregado condensadores de desacoplamiento según los comentarios, actualice su esquema esquemático que muestre dónde los ha agregado. Si ha actualizado su código, actualice su sección de código.

También necesita un retraso antes lcd_init() para permitir que VDD alcance un nivel respetable.
... si el PIC no tiene detección de caída de tensión.
Un apagón es para cuando el PIC ya no puede funcionar. La pantalla LCD puede tener un voltaje de suministro mínimo más alto, por lo que siempre me recomendaron hacer un retraso antes de inicializar la pantalla. Sin embargo, cuando las pruebas muestren que para esa aplicación en particular no se necesita el retraso, puede omitirlo.
Lo que estoy acostumbrado a ver cuando BOR está habilitado es que el temporizador de encendido no comienza hasta después de que BOR se borra, incluso en el primer encendido, que es de alrededor de 4 V más o menos. Cuando no está habilitado, el temporizador se inicia con un voltaje más bajo. Esto le brinda una mejora de espacio libre "gratuito" en VDD sin un retraso explícito. Dicho esto, un retraso en el inicio es una práctica bastante estándar para aquellas partes que usan muchos periféricos adicionales y no pierden tiempo haciendo cosas como esperar a que el PLL se sincronice y el reloj cambie.
Bueno, probablemente sepas mucho más sobre esto que yo, así que probablemente tengas razón ;-)

Haz las siguientes cosas,

  • Función de llamada lcd_init()fuera del while(1)bucle,
  • Llame lcd_clear()antes de volver a escribir en la misma posición (por ejemplo xy(1,1), solo un caso de prueba, no es necesario, puede sobrescribir cualquier carácter de la pantalla LCD, pero al borrar la pantalla LCD solo puede ser un caso de prueba si su función gotoxy() funciona correctamente o no)
  • Lo más importante es verificar la frecuencia de tus cristales.

Intente quitar los condensadores a través del cristal, intente cambiar el cristal y, si puede, intente usar un cristal de 4Mhz. El uso de capacitores con cristal de alta frecuencia en algún momento causa problemas. Verifique la hoja de datos para conocer el valor adecuado de los capacitores para conectar, es mejor usar un cristal de baja frecuencia o quitar los capacitores con el mismo cristal.

  • También asegúrese de no cambiar los bits del fusible en el momento de la grabación del flash, hágalos igual que mencionó en su código, será preferible usar la detección de apagado y el temporizador de encendido.
¿Por qué deberías llamar lcd_clear()? Nunca hago eso. Simplemente puede sobrescribir caracteres.
lcd_clear() no funciona con el compilador Pic C que devuelve un error indefinido.
lcd_clear () significa intentar borrar la pantalla LCD, se puede hacer enviando el comando 0x01 a la pantalla LCD