#include <16F877A.h> //pic a utilizar
#device ADC=8;
#fuses XT,WDT,NOPROTECT,PUT,NOLVP //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#use fast_io(b)
#include <lcd.c>
#include <stdio.h>
#include <string.h>
char setpoint,setviejo;
char BM=2,s1=0,s2=0,s3=0,pant=0;
float valor1=0;
float t1=0,t2=0,t3=0,tp=0;
#INT_EXT
void interrupcion(char causa)
{
restart_wdt();
output_high (PIN_C2); //ALARMA ACUSTICA ON
output_low (PIN_C3);
output_low (PIN_C4);
lcd_putc('\f');
lcd_gotoxy(2,1);
lcd_putc("FALLA GENERAL");
if(causa==0)
{
lcd_gotoxy(1,2);
lcd_putc("DISPARO EXTERNO");
}
if(causa==1)
{
lcd_gotoxy(1,2);
lcd_putc("SENSORES DISCO");
}
if(causa==2)
{
lcd_gotoxy(3,2);
lcd_putc("TEMP >> MAX");
}
while (input(PIN_B4)==0)
{
restart_wdt();
}
output_low (PIN_C2); //ALARMA ACUSTICA OFF
lcd_putc('\f');
while (input(PIN_B3)==0)
{
restart_wdt();
lcd_gotoxy(1,1);
lcd_putc("RECONOCER?");
while (input(PIN_C1)==1)
{
restart_wdt();
lcd_gotoxy(1,2);
lcd_putc("BLOQUEADA!");
}
lcd_gotoxy(3,2);
lcd_putc(" ");
}
delay_ms(500);
lcd_putc('\f');
causa=0;
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void leeradc()
{
int d12=0,d13=0,d23=0;
int dif1=1;
s1=0;
s2=0;
s3=0;
set_adc_channel(0);
delay_us(10);
restart_wdt();
valor1=read_adc();
delay_us(100);
t1=(valor1*391)/1000;
set_adc_channel(1);
delay_us(10);
restart_wdt();
valor1=read_adc();
delay_us(100);
t2=(valor1*391)/1000;
set_adc_channel(2);
delay_us(10);
restart_wdt();
valor1=read_adc();
delay_us(100);
t3=(valor1*391)/1000;
d12 = Abs(t1-t2);
d13 = Abs(t1-t3);
d23 = Abs(t2-t3);
tp=(t1+t2+t3)/3; //Promedio de Temperatura
if (d12 > dif1)
{
if (d13 > dif1)
{
s1=1;
tp = (t2 + t3)/2; //Falla de Sensor 1 -> Promedio de S2 y S3
}
if (d23 > dif1)
{
s2=1;
tp = (t1 + t3)/2; //Falla de Sensor 2 -> Promedio de S1 y S3
}
}
if (d23 > dif1)
{
if (d13 > dif1)
{
s3=1;
tp = (t1 + t2)/2; //Falla de Sensor 3 -> Promedio de S1 y S2
}
}
}
//------------------------------------------------------------------------------
void proceso()
{
leeradc();
lcd_gotoxy(1,1);
lcd_putc("TP:");
printf(lcd_putc,"%2.1f",tp);
if (pant==0)
{
lcd_gotoxy(9,1);
lcd_putc("T1:");
printf(lcd_putc,"%2.1f",t1);
lcd_gotoxy(1,2);
lcd_putc("T2:");
printf(lcd_putc,"%2.1f",t2);
lcd_gotoxy(9,2);
lcd_putc("T3:");
printf(lcd_putc,"%2.1f",t3);
if(s1!=0)
{
lcd_gotoxy(16,1);
lcd_putc("F");
}
else
{
lcd_gotoxy(16,1);
lcd_putc(" ");
}
if(s2!=0)
{
lcd_gotoxy(8,2);
lcd_putc("F");
}
else
{
lcd_gotoxy(8,2);
lcd_putc(" ");
}
if(s3!=0)
{
lcd_gotoxy(16,2);
lcd_putc("F");
}
else
{
lcd_gotoxy(16,2);
lcd_putc(" ");
}
}
if (pant==1)
{
lcd_gotoxy(9,1);
lcd_putc(" ");
lcd_gotoxy(1,2);
lcd_putc("SP:");
printf(lcd_putc,"%2u C",setpoint);
lcd_gotoxy(9,2);
lcd_putc(" ");
lcd_gotoxy(12,2);
lcd_putc("BM:");
printf(lcd_putc,"%1u",BM);
lcd_gotoxy(16,2);
lcd_putc(" ");
}
if (s1+s2+s3>2) interrupcion(1);
if (input(PIN_C1)==1) interrupcion(2);
if (tp>setpoint+BM) output_low (PIN_C3);
if (tp<setpoint-BM) output_high (PIN_C3);
}
//------------------------------------------------------------------------------
void ajuste(int a)
{
setviejo=setpoint;
while (input(PIN_B3)==0)
{
restart_wdt();
lcd_gotoxy(1,1);
lcd_putc("Nuevo SetPoint:");
if (input(PIN_B1))setpoint++;
delay_ms(50);
if (input(PIN_B2))setpoint--;
delay_ms(50);
if(setpoint<0) setpoint=0;
lcd_gotoxy(1,2);
lcd_putc("SP: ");
lcd_gotoxy(4,2);
printf(lcd_putc,"%2u C",setpoint);
if (a==1)
{
leeradc();
if (tp>setviejo+BM) output_low (PIN_C3);
if (tp<setviejo-BM) output_high (PIN_C3);
}
}
delay_ms(500);
while (input(PIN_B3)==0)
{
restart_wdt();
lcd_gotoxy(1,1);
lcd_putc("NUEVA BM: ");
if (input(PIN_B1))BM++;
delay_ms(50);
if (input(PIN_B2))BM--;
delay_ms(50);
if(BM<1) BM=1;
if(BM>5) BM=5;
lcd_gotoxy(12,2);
lcd_putc("BM:");
printf(lcd_putc,"%1u",BM);
if (a==1)
{
leeradc();
if (tp>setviejo+BM) output_low (PIN_C3);
if (tp<setviejo-BM) output_high (PIN_C3);
if (s1+s2+s3>2); //CUANDO PONGO ESTA LINEA COMIENZA A SALIR EL ERROR DE COMPILACION.
} //SI NO FUNCIONA CORRECTAMENTE
}
lcd_gotoxy(1,1);
lcd_putc(" ");
}
//------------------------------------------------------------------------------
void pilotos()
{
lcd_putc('\f');
delay_ms(1000);
while (input(PIN_B3)==0)
{
restart_wdt();
lcd_gotoxy(1,1);
lcd_putc("Pilotos Ok?");
}
}
//------------------------------------------------------------------------------
void bienvenido()
{
lcd_putc('\f');
delay_ms(500);
while (input(PIN_B3)==0)
{
restart_wdt();
lcd_gotoxy(3,1);
lcd_putc("Bienvenido!");
lcd_gotoxy(2,2);
lcd_putc("Nixie-Proc '09");
}
delay_ms(500);
lcd_putc('\f');
}
setup_adc (ADC_CLOCK_INTERNAL);
setup_adc_ports (ALL_ANALOG);
///PROGRAMA
void main(void)
{
set_tris_b(0b11111111); //portb como salida(RB5,las demas desactivadas)
set_tris_c(0b00000010); //portc como salida menos pin1
output_low (PIN_C3);
lcd_init();
enable_interrupts (INT_EXT);
ext_int_edge(L_TO_H);
enable_interrupts(GLOBAL); //todas las interrupciones activadas
output_low (PIN_C3);
output_low (PIN_C2); //ALARMA ACUSTICA OFF
setup_wdt(WDT_2304MS);
setup_adc_ports(ANALOG_RA3_REF);
bienvenido();
setpoint=25;
ajuste(0);
pilotos();
do{
while (input(PIN_B4)==0)
{
restart_wdt();
proceso();
if (input(PIN_B5)==1)
{
restart_wdt();
pant++;
delay_ms(200);
if (pant>1) pant=0;
}
}
ajuste(1); //Funcion para ajustar el setpoint.
}while(true); //bucle infinito
}