Mal codigo para termostato con display PIC16f87a

Buenas tardes estoy realizando este proyecto y estoy teniendo problemas con el código del programa me podrían ayudar a encontrar el error bueno a corregirlo, Resulta que cuando compara la entrada análoga del lm35 con el pre-set que establecí el micro se queda colgado al ejecutar ese fragmento de código, por hay estuve leyendo que podría ser por el manejo de interrupciones pero la verdad no tengo ni idea de como solucionarlo. Aquí pongo el código que manejo. soy novato en esto y también quería ponerle un pre-set con push buton me podrian orientar sobre esto?.


//Rango de 30 a 40 °C activa ventilador y buzzer a 50 °C
#include "16f877.h" // Pic a utilizar
#device adc=10 // Usa resolución de 10 bits
#use delay(clock=4000000) // Cristal a utilizar
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect // Fusibles
#include "lcd.c" // Libreria para utilizar LCD por el puerto D
#use standard_io (D)

void main (void)
{
float temper,medicion;
set_tris_b(0x00);
disable_interrupts(GLOBAL);
lcd_init(); // Inicia LCD
lcd_putc(" Termostato\n"); // Saca texto
lcd_putc(" Digital"); // Saca texto
delay_ms(3000);
lcd_putc("\f"); // Limpia pantalla
lcd_putc(" Transductor\n"); // Saca texto
lcd_putc(" lm35"); // Saca texto
delay_ms(2000);
lcd_putc("\f"); // Limpia pantalla
lcd_putc(" Especialidadl\n"); // Saca texto
lcd_putc(" Electronica"); // Saca texto
delay_ms(2000);
lcd_putc("\f"); // Limpia pantalla
lcd_putc("Temperatura\n"); // Saca texto
lcd_putc("actual"); // Saca texto
delay_ms(1000);
lcd_gotoxy(14,2); // Acomoda cursor LCD
lcd_putc("oC");

while (1)
{
lcd_gotoxy(8,2); // Acomoda cursor LCD
lcd_putc(" "); // Limpia ese sector de pantalla
lcd_gotoxy(8,2); // Acomoda cursor LCD

setup_adc (adc_clock_internal);
setup_adc_ports (all_analog);
set_adc_channel (0); // Elige canal a medir RA0
delay_us (20);
medicion=read_adc (); // Hace conversión AD
setup_adc (adc_off); // Apaga ADC
temper=medicion*(0.48875); // Pasa binario a °C

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// el "0.48875" sale de dividir 5/1023 y el resultado de eso multiplicarlo por 100
// el 5 sale de los 5 voltios aplicado a el voltage de referencia, los 1023 salen
// de los 10 bit de resolucion del conversor analogico digital que seleccionamos.
// Si utlizaramos la resolucion de 8 bits del conversor analogico digital, la
// formula fuera (5/255)*100 ya que con 8 bits el numero maximo posible es de 0-255
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if (temper >= 40) { // Si la temperatura es mayor 40
delay_ms(100);
output_high(PIN_b0); // Cambia de estado el relay
}
else{ // si es menor
output_low(PIN_b0); // Desactiva el relay
delay_ms(100);
}
while (temper <= 50){
output_high(PIN_b1); //activa buzzer
delay_ms(100);
output_low(PIN_b1);
delay_ms(50);
}

printf(lcd_putc,"%02.1f",temper); // xxx.x °C
delay_ms (1000);
}
}

bueno de antemano gracias y espero no publicar en zonas indevidas.
 
Cuando esto llega al bucle temper<=50, si entra, no sale nunca ya que temper no se actualiza mas. Es ahi donde se cuelga?
 
Sii :D! batallando un rato encontre la falla muchas gracias efectivamente es eso :p!, quite el while y puse como el anterior con if y ya enciende el buzzer :D!, para ponerle push buton serviria la secuencia switch o en picc no funciona ese comando?, todavia no se manejar las librerias y solo entiendo un poco c++.
 
Atrás
Arriba