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?
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);
}
}
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.
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.
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.
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.
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.
lcd_init()
para permitir que VDD alcance un nivel respetable.Haz las siguientes cosas,
lcd_init()
fuera del while(1)
bucle,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)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.
lcd_clear()
? Nunca hago eso. Simplemente puede sobrescribir caracteres.
usuario17592
leon heller
sharafjaffri
leon heller
Abdul Rehman
sharafjaffri
sharafjaffri
Abdul Rehman
sharafjaffri
usuario17592
lcd_init()
está en elwhile(1)
bucle. ¡Está inicializando la pantalla LCD continuamente!leon heller