Skip to content

Instantly share code, notes, and snippets.

@chukitow
Last active August 29, 2015 14:00
Show Gist options
  • Select an option

  • Save chukitow/11387845 to your computer and use it in GitHub Desktop.

Select an option

Save chukitow/11387845 to your computer and use it in GitHub Desktop.
/************************************************/
/*PIN_B0 FOCO 1 */
/*PIN_B1 FOCO 2 */
/*PIN_B2 SENSADO FOCO 1 */
/*PIN_B3 SENSADO FOCO 2 */
/*PIN_B4 VENTANA 1 */
/*PIN_B5 VENTANA 2 */
/*PIN_B6 PUERTA 1 */
/*PIN_B6 PUERTA 2 */
/************************************************/
#include <18f4520.h>
#fuses XT, PUT, NODEBUG , NOBROWNOUT , NOPROTECT , NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, bits = 8 , parity = N ,xmit=PIN_C6,rcv=PIN_C7)
#use fast_io(B)
char trama[50]; //Contenedor de la trama
int index=0; //Indice del buffer;
char buffer; //auxiliar para almacenar el caracter tecleado
boolean cambioDeEstado = false; //Auxuliar para detectar cambios de estado
int estados; //Es la enmascaracion que recopila los estados de las ventanas y puertas
boolean foco1 = false; //Estado del Foco 1
boolean foco2 = false; //Estado del Foco 2
boolean ventana1 = false; //Estado de la Ventana 1
boolean ventana2 = false; //Estado de la Ventana 2
boolean puerta1 = false; //Estado de la puerta 1
boolean puerta2 = false; //Estado de la puerta 2;
void init(); //Funcion que se ejecuta al iniciar el programa que analiza el estado en el que se encuentran los componentes
void analizarTrama(); //Analiza la trama hasta encontrar los caracteres de inicio y cierre
void analyzeTokens(); //Analiza el contenido de la trama "PROTOCOLO"
void limpiarTrama(); //Vacia la trama
void analizarEstados();
boolean estadoFoco1();
boolean estadoFoco2();
boolean estadoVentana1();
boolean estadoVentana2();
boolean estadoPuerta1();
boolean estadoPuerta2();
/***********INTERRUPCIONES***************/
//Leer datos del serial
#INT_RDA
void ra_isr(void)
{
//Hay datos pendientes ??
if(kbhit())
{
//Si es el backspace borramos la trama
int asciiKEY;
buffer= getc();
asciiKEY = buffer;
if(asciiKEY == 8)
{
if(index>0)
{
trama[index] = ' ';
index--;
}
}
else
{
if(index>50)index=0;
trama[index] = buffer;
index++;
}
}
}
//Analizar cambios de estados
#INT_RB
void rb_isr(void)
{
/*VENTANA 1*/
if(input(PIN_B4))
{
if(ventana1==false)
{
ventana1=true;
printf("Se cerro V1");
}
}
else
{
if(ventana1==true)
{
ventana1= false;
printf("Se abrio V1");
}
}
/*VENTANA 2*/
if(input(PIN_B5))
{
if(ventana2==false)
{
ventana2=true;
printf("Se cerro V2");
}
}
else
{
if(ventana2==true)
{
ventana2= false;
printf("Se abrio V2");
}
}
/*PUERTA 1*/
if(input(PIN_B6))
{
if(puerta1==false)
{
puerta1=true;
printf("Se cerro P1");
}
}
else
{
if(puerta1==true)
{
puerta1= false;
printf("Se abrio P1");
}
}
/*PUERTA 2*/
if(input(PIN_B7))
{
if(puerta2==false)
{
puerta2=true;
printf("Se cerro P2");
}
}
else
{
if(puerta2==true)
{
puerta2= false;
printf("Se cerro P1");
}
}
}
void main(void)
{
set_tris_b(252);
enable_interrupts(INT_RDA);
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
init();
printf("************************************\r");
printf(" SISTEMA DOMOTICO UDC 1.0V \r");
printf("************************************\r");
while(true)
{
analizarTrama();
}
}
void init()
{
/*FOCO 1*/
if(input(PIN_B2))
{
foco1 = true;
}
/*FOCO 2*/
if(input(PIN_B3))
{
foco2 = true;
}
/*Ventana 1*/
if(input(PIN_B4))
{
ventana1 = true;
}
/*VENTANA 2*/
if(input(PIN_B5))
{
ventana2 = true;
}
/*PUERTA 1*/
if(input(PIN_B6))
{
puerta1 = true;
}
/*PUERTA 2*/
if(input(PIN_B7))
{
puerta2 = true;
}
}
void analizarTrama()
{
/* Analizamos si la trama esta completa */
int i;
//Analizar si esta completa
boolean inicioTrama = false;
boolean finalTrama = false;
for( i=0; i<=index;i++)
{
if(trama[i] == '<')
{
inicioTrama = true;
}
else if(trama[i] == '>')
{
finalTrama = true;
}
}
/*LA TRAMA ESTA COMPLETA*/
if(inicioTrama == true && finalTrama == true)
{
analyzeTokens();
limpiarTrama();
}
}
void analyzeTokens()
{
switch(trama[1])
{
/*PRENDER FOCOS*/
case 'A':
/*FOCO 1*/
if(trama[2]=='1')
{
output_high(PIN_B0);
if(estadoFoco1())
{
printf("Se apago F1");
foco1=true;
}
else
{
//printf("MENSAJE DE ERROR : ERROR AL ENCENDER EL FOCO 1 \r");
}
}
/*FOCO 2*/
else if(trama[2]=='2')
{
output_high(PIN_B1);
if(estadoFoco2())
{
printf("Se apago F2");
foco2=true;
}
else
{
//printf("MENSAJE DE ERROR: ERROR AL ENCENDER EL FOCO 2 \r");
}
}
else
{
printf("MENSAJE DE ERROR: NO SE DETECTO FOCO CUAL ENCENDER \r");
}
break;
/*APAGAR FOCOS*/
case 'P':
/*FOCO 1*/
if(trama[2]=='1')
{
output_low(PIN_B0);
if(estadoFoco1() == false)
{
printf("Se prendio F1");
foco1=false;
}
else
{
//printf("MENSAJE DE ERROR: ERROR AL APAGAR FOCO 1\r");
}
}
/*FOCO 2*/
else if(trama[2]=='2')
{
output_low(PIN_B1);
if(estadoFoco2() == false)
{
printf("Se prendio F1");
foco2=false;
}
else
{
//printf("MENSAJE DE ERROR: ERROR AL APAGAR FOCO 2\r");
}
}
else
{
//printf("MENSAJE DE ERROR: NO SE DETECTO EL FOCO EL CUAL APAGAR\r");
}
break;
case 'C':
if(trama[2]=='F')
{
if(trama[3]=='1')
{
if(foco1)
{
printf("Esta prendido F1");
}
else
{
printf("Esta apagado F1");
}
}
else if(trama[3]=='2')
{
if(foco2)
{
printf("Esta prendido F2");
}
else
{
printf("Esta apagado F1");
}
}
else
{
//printf("MENSAJE DE ERROR: NO SE DETECTO EL FOCO EL CUAL APAGAR\r");
}
}
else if(trama[2]=='V')
{
if(trama[3]=='1')
{
if(ventana1)
{
printf("Esta cerrada V1");
}
else
{
printf("Esta abierta V1");
}
}
else if(trama[3]=='2')
{
if(ventana2)
{
printf("Esta cerrada V2");
}
else
{
printf("Esta abierta V2");
}
}
else
{
//printf("MENSAJE DE ERROR: NO SE DETECTO EL FOCO EL CUAL APAGAR\r");
}
}
else if(trama[2]=='P')
{
if(trama[3]=='1')
{
if(puerta1)
{
printf("Esta abierta P1");
}
else
{
printf("Esta abierta P1");
}
}
else if(trama[3]=='2')
{
if(puerta2)
{
printf("Esta cerrada P2");
}
else
{
printf("Esta abierta P2");
}
}
else
{
//printf("MENSAJE DE ERROR: NO SE DETECTO EL FOCO EL CUAL APAGAR\r");
}
}
else
{
//printf("MENSAJE DE ERROR: NO SE DETECTO EL FOCO EL CUAL APAGAR\r");
}
break;
}
}
void limpiarTrama()
{
int i;
for(i=0; i<=index; i++)
{
trama[i] = ' ';
}
index=0;
}
boolean estadoFoco1()
{
boolean bandera = false;
if(input(PIN_B2))
{
bandera = true;
}
return bandera;
}
boolean estadoFoco2()
{
boolean bandera = false;
if(input(PIN_B3))
{
bandera = true;
}
return bandera;
}
boolean estadoVentana1()
{
boolean bandera = false;
if(input(PIN_B4))
{
bandera = true;
}
return bandera;
}
boolean estadoVentana2()
{
boolean bandera = false;
if(input(PIN_B5))
{
bandera = true;
}
return bandera;
}
boolean estadoPuerta1()
{
boolean bandera = false;
if(input(PIN_B6))
{
bandera = true;
}
return bandera;
}
boolean estadoPuerta2()
{
boolean bandera = false;
if(input(PIN_B7))
{
bandera = true;
}
return bandera;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment