Simulacion encoder en PIC16F877a

Buenas tardes a todos.

Tengo un problema, es que trato de simular un circuito con un PIC 16F877a que intenta ser una estación meteorológica. Tiene pulsadores para decidir lo que quiero medir, temperatura, humedad, presión atmosférica o velocidad y dirección del viento.
Todo se mostrará en un display.
Intento simular un encoder de 3 bits para dar la direccion del viento.
Para ello he creado una variable en la que meto el estado del pin ('1' o '0') multiplicado por 1, 10, 0 100 para conseguir un entero que me de visualmente la posición.
Después con un switch ... case le doy valores a las direcciones (N, S, E, W, NE, NW, SE, SW).

Hay que mejorar muchas cosas pero funciona a la perfección salvo en dos posiciones y no lo comprendo.

falla cuando entro en la funcoin de wind y dir0='1' dir1='1' y dir2='0' o bien cuando dir0='0' dir1='1' dir2='0', en estos dos casos el pic no responde, se queda como bloquedao y no envia nada a la pantalla y tampoco me deja entrar con los botones a otra función.

El codigo:

#include "F:\Weather Station\Prueba 5\Prueba 5.h"
#include <LCD.C>

// rutina de la interrupcion del timer0 ////////////////////////////////////////

#int_RTCC
RTCC_isr()
{

}
////////////////////////////////////////////////////////////////////////////////

// rutina de la interrupcion externa ///////////////////////////////////////////
#int_EXT
EXT_isr()
{

}
////////////////////////////////////////////////////////////////////////////////

// declaracion de funciones ////////////////////////////////////////////////////
void init(void);
void temperature(void);
void humidity(void);
void pressure(void);
void wind(void);
////////////////////////////////////////////////////////////////////////////////

// vriables globales ///////////////////////////////////////////////////////////
int temp, hum, press, wind_dir, wind_speed;
long direction;
int1 b_menu=1, b_temp=1, b_hum=1, b_press=1, b_wind=1;
int1 flag_menu=0, flag_temp=0, flag_hum=0, flag_press=0, flag_wind=0;
////////////////////////////////////////////////////////////////////////////////


void main()
{

setup_adc_ports(AN0_AN1_AN2_AN4_VSS_VREF);
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);

////////////////////////////////////////////////////////////////////////////////
lcd_init();
////////////////////////////////////////////////////////////////////////////////
enable_interrupts(INT_RTCC);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);

init();

while (1)
{
b_menu=input_state(pin_c0);
if (!b_menu)
{
init();
}
b_temp=input_state(pin_c1);
if (!b_temp)
{
flag_temp=1;
temperature();
}
b_hum=input_state(pin_c2);
if (!b_hum)
{
flag_hum=1;
humidity();
}
b_press=input_state(pin_c4);
if (!b_press)
{
flag_press=1;
pressure();
}
b_wind=input_state(pin_c6);
if (!b_wind)
{
flag_wind=1;
wind();
}
}

}

////////////////////////////////////////////////////////////////////////////////
// definicion de funciones /////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void init (void)
{
printf (lcd_putc, "\fWEATHER STATION\n WAITING...");
}

void temperature (void)
{
while(flag_temp==1)
{
set_adc_channel (0);
delay_us (10);
temp=read_adc();
printf (lcd_putc, "\fTemperature\n%u", temp);
b_menu=input_state(pin_c0);
if (!b_menu)
flag_temp=0;
b_hum=input_state(pin_c2);
if (!b_hum)
flag_temp=0;
b_press=input_state(pin_c4);
if (!b_press)
flag_temp=0;
b_wind=input_state(pin_c6);
if (!b_wind)
flag_temp=0;
}
}

void humidity (void)
{
while(flag_hum==1)
{
set_adc_channel(1);
delay_us(10);
hum=read_adc();
printf (lcd_putc, "\fHumidity\n%u", hum);
b_menu=input_state(pin_c0);
if (!b_menu)
flag_hum=0;
b_temp=input_state(pin_c1);
if (!b_temp)
flag_hum=0;
b_press=input_state(pin_c4);
if (!b_press)
flag_hum=0;
b_wind=input_state(pin_c6);
if (!b_wind)
flag_hum=0;
}
}


void pressure (void)
{
while(flag_press==1)
{
set_adc_channel(2);
delay_us(10);
press=read_adc();
printf (lcd_putc, "\fPressure\n%u", press);
b_menu=input_state(pin_c0);
if (!b_menu)
flag_press=0;
b_temp=input_state(pin_c1);
if (!b_temp)
flag_press=0;
b_hum=input_state(pin_c2);
if (!b_hum)
flag_press=0;
b_wind=input_state(pin_c6);
if (!b_wind)
flag_press=0;
}
}

void wind (void)
{
while(flag_wind==1)
{
delay_ms(10);
// printf (lcd_putc, "\fWind dir: N\n");

direction=(input_state(pin_d0)+10*input_state(pin_d1)+100*input_state(pin_d2));
//printf (lcd_putc, "\fdirection= %04lu", direction);

switch (direction)
{
case 111:
printf (lcd_putc, "\fWind dir: N\n");
break;

case 001:
printf (lcd_putc, "\fWind dir: S\n");
break;

case 010:
printf (lcd_putc, "\fWind dir: E\n");
break;

case 100:
printf (lcd_putc, "\fWind dir: W\n");
break;

case 011:
printf (lcd_putc, "\fWind dir: norteast\n");
break;

case 000:
printf (lcd_putc, "\fWind dir: SE\n");
break;

case 101:
printf (lcd_putc, "\fWind dir: SW\n");
break;

case 110:
printf (lcd_putc, "\fWind dir: NW\n");
break;

printf (lcd_putc, "\fWind dir: error\n");
}

}
}


HELP !!

Si se os ocurren mas cosas que mejorar, adelante, pero me urge lo de que se me quede pillado el pic

GRACIAS
Saludos a todoos

P.D. Siento el tostón
 

Adjuntos

  • circuito 1.jpg
    circuito 1.jpg
    193.5 KB · Visitas: 28
Atrás
Arriba