PIC16F877A (con LCD) no funciona

1

He diseñado un PIC18F877A proyecto de controlador para leer la temperatura de un LM35 utilizando ADC, visualícelo en una pantalla LCD y transmítalo 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 está funcionando. ¿Puede alguien ayudarme? ¿Me estoy perdiendo algo? ¿Falta alguna conexión a tierra?

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

}
    
pregunta sharafjaffri

2 respuestas

2
  1. Tu comentario "Es posible que funcione algunas veces, lo que significa que el código funciona". significa (para mí) que el hardware no está bloqueado (de lo contrario no funcionaría) y que su software necesita ajustes.

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

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

  4. lcd_init() y delay(1000) necesitan salir del bucle while, como han dicho otros. Necesita ese delay(1000) después de llamar a lcd_init() antes de enviar cualquier comando; es posible que necesite un retraso un poco más prolongado según el hardware específico de su LCD.

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

respondido por el Adam Lawrence
0

Haz lo siguiente,

  • función lcd_init() de llamada fuera del bucle while(1) ,
  • Llame a 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 del lcd, pero al borrar el lcd solo puede ser un caso de prueba si su función gotoxy () funciona correctamente o no)
  • Lo más importante es verificar su frecuencia de cristales

Intente quitar los capacitores a través del cristal, intente cambiar el cristal, y si puede intentar usar un cristal de 4Mhz. El uso de condensadores con cristal de alta frecuencia puede ocasionar problemas. Verifique la hoja de datos para saber cuál es el valor correcto de los condensadores, mejor utilizar un cristal de baja frecuencia o retirando los condensadores con el mismo cristal

  • También asegúrese de no cambiar los bits de fusible en el momento de quemar el flash, haga lo mismo que mencionó en su código, será preferible utilizar el temporizador de encendido y de encendido.
respondido por el Abdul Rehman

Lea otras preguntas en las etiquetas