Te pongo el código completo, es el control de una incubadora, y desde un menu controlo la temperatura, humedad y volteo de los huevos. he cambiado las variables a int16 y ahora se queda siempre en low.
#include <16F876.h>
#include <internal_eeprom.c>
#use delay(clock=4000000)
#fuses xt,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT
#define use_portb_lcd TRUE
#include "LCD.c"
#include <sht11.h>
int16 contador;
#int_timer0
void INTERRUPTION()
{
contador ++;
set_timer0(0x06);
}
//#byte port_c=0x07
//******************************************************************************
// input(pin_C0) Pulsador de menu y ok
// input(pin_C1) Pulsador de flecha abajo (mas)
// input(pin_C2) Pulsador de flecha arriba (menos)
//******************************************************************************
short actualizar;
typedef union
{
int16 i;
float f;
} valor;
valor humedad, temperatura;
byte errorsht11,checksum;
unsigned test=1;//, i;
int8 testado;
float T, H, V;
int16 X, Y;
//int16 tiempo;
///LLAMADA FUNCION INTERRUPCION
//INTERRUPCION
void sonda(){
//while ( !input(PIN_A0) );//while(true)
// {
errorsht11=0;
errorsht11+=sht11_medicion((byte*) &humedad.i, &checksum, HUMI); //measure humidity
errorsht11+=sht11_medicion((byte*) &temperatura.i, &checksum, TEMP); //measure temperature
if(errorsht11!=0) //in case of an error: connection reset
{
printf(lcd_putc,"\n\rerror:%U", errorsht11);
sht11_hard_reset();
}
else
{
humedad.f=(float)humedad.i; //converts integer to float
temperatura.f=(float)temperatura.i; //converts integer to float
sht11_calculos(&humedad.f, &temperatura.f); //calculate humidity, temperature
}
lcd_gotoxy(1,1);
printf(lcd_putc," Temp. Humedad");
lcd_gotoxy(0,2);
printf(lcd_putc," %2.2f",temperatura.f);
IF (temperatura.f < (read_float_eeprom(1)-2)) output_high(pin_A0);
IF (temperatura.f > (read_float_eeprom(1)+2)) output_low(pin_A0);
IF (humedad.f < (read_float_eeprom(10)-2)) output_high(pin_A1);
IF (humedad.f > (read_float_eeprom(10)+2)) output_low(pin_A1);
lcd_send_byte(1,0b11011111);
printf(lcd_putc,"C %2.2f%%HR",humedad.f);
actualizar=true;
delay_ms(100);
}
// pulsador();
// }
void menus()
{
switch (testado){
case 1:
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("1 Temperatura");
break;
case 2:
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("2 Humedad");
break;
case 3:
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("3 Volteo");
break;
case 4:
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("4 Salir");
break;
}
}
void menus2()
{
switch (testado){
case 1:
delay_ms(100);
T=read_float_eeprom(1);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Set Grados ");
lcd_putc(223);
//for(i=200;i!=255;i++)
//{
//lcd_gotoxy(1,1);
//lcd_putc(i);
//printf(lcd_putc,"%u",i);
//delay_ms(1000);
//};
lcd_putc("C");
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",T);
while(input(pin_C0))
{
if (!input(pin_C1)) //veo si se presiono xxxxx
{
while (!input(pin_C1)); //si es asi, espero a que se libere
T=T+0.10;
if (T>40) T=15.00;
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",T);
}
if (!input(pin_C2)) //veo si se presiono xxxxx
{
while (!input(pin_C2)); //si es asi, espero a que se libere
T=T-0.10;
if (T<15) T=40.00;
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",T);
}
}
while (!input(pin_C0));
write_float_eeprom(1,T);
break;
case 2:
delay_ms(100);
H=read_float_eeprom(10);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Set Humedad %");
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",H);
while(input(pin_C0))
{
if (!input(pin_C1)) //veo si se presiono xxxxx
{
while (!input(pin_C1)); //si es asi, espero a que se libere
H=H+0.10;
if (H>90) H=40.00;
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",H);
}
if (!input(pin_C2)) //veo si se presiono xxxxx
{
while (!input(pin_C2)); //si es asi, espero a que se libere
H=H-0.10;
if (H<40) H=90.00;
lcd_gotoxy(5,2);
printf(lcd_putc,"%1.1f",H);
}
}
while (!input(pin_C0));
write_float_eeprom(10,H);
break;
case 3:
delay_ms(100);
V=read_float_eeprom(20);
lcd_putc("\f");
lcd_gotoxy(1,1);
lcd_putc("Set Volteo minu-");
lcd_gotoxy(1,2);
lcd_putc("tos");
lcd_gotoxy(5,2);
printf(lcd_putc,"%3.0f",V);
while(input(pin_C0))
{
if (!input(pin_C1)) //veo si se presiono xxxxx
{
while (!input(pin_C1)); //si es asi, espero a que se libere
V=V+1;
if (V>120) V=0;
lcd_gotoxy(5,2);
printf(lcd_putc,"%3.0f",V);
}
if (!input(pin_C2)) //veo si se presiono xxxxx
{
while (!input(pin_C2)); //si es asi, espero a que se libere
V=V-1;
if (V<0) V=120;
lcd_gotoxy(5,2);
printf(lcd_putc,"%3.0f",V);
}
}
while (!input(pin_C0));
write_float_eeprom(20,V);
break;
case 4:
test=0;
break;
}
}
void pulsador()
{
//==================================================================================
//testado=1;
menus();
delay_ms(200);
while(input(pin_C0))
{
if (!input(pin_C1)) //veo si se presiono xxxxx
{
while (!input(pin_C1)); //si es asi, espero a que se libere
testado=testado+1;
if(testado>4){testado=1;}
menus();
}
if (!input(pin_C2)) //veo si se presiono xxxxx
{
while (!input(pin_C2)); //si es asi, espero a que se libere
testado=testado-1;
if(testado==0){testado=4;}
menus();
}
}
while (!input(pin_C0));
menus2();
//pulsador();
}
void main()
{
//*********************************
SETUP_COUNTERS(RTCC_INTERNAL,RTCC_DIV_16);
set_rtcc(0x06);
ENABLE_INTERRUPTS(GLOBAL);
ENABLE_INTERRUPTS(INT_TIMER0);
//OUTPUT_LOW(PIN_A2);
//DO {
// OUTPUT_HIGH(PIN_A2);
// }WHILE(TRUE);
//*********************************
port_b_pullups(true);
setup_adc_ports(NO_ANALOGS);
actualizar=true;
//write_eeprom(10,T);
//write_eeprom(20,H);
//write_eeprom(30,V);
lcd_init();
sht11_hard_reset();;
//V==read_float_eeprom(20);
//H==read_float_eeprom(10);
//T==read_float_eeprom(1);
testado=1;
// sonda();
while(true)
{
V=read_float_eeprom(20);
//X=V*60;
X=250;
Y=300;
IF (contador == X){
OUTPUT_HIGH(PIN_A2);
}
IF (contador == Y){
OUTPUT_LOW(PIN_A2);
contador = 0;
}
//SET_TIMER0(131);// RESET_TIMER0;
if (actualizar)
{
sonda();
// actualizar=false;
}
if (!input(pin_C0))
{
while (test){pulsador();}
}
test=1;
testado=1;
}
//lcd_putc("\f");
}