/**************************************************************************
* 3_Phase Secuence Detector Version: 1.0
* PIC16F88
* Octubre, 2020
***************************************************************************/
#include <16f88.h>
#use delay(clock=4000000)
#use fast_io(A)
#use fast_io(B)
//////// Fuses: LP,XT,HS,EC_IO,NOWDT,WDT,NOPUT,PUT,MCLR,NOMCLR,BROWNOUT
//////// Fuses: NOBROWNOUT,LVP,NOLVP,CPD,NOCPD,WRT,NOWRT,DEBUG,NODEBUG,CCPB0
//////// Fuses: CCPB3,PROTECT,NOPROTECT,INTRC,INTRC_IO,RC,RC_IO,FCMEN
//////// Fuses: NOFCMEN,IESO,NOIESO
#fuses XT,PUT,BROWNOUT,NOPROTECT,NOLVP,CCPB3
#zero_ram
#byte PORTA = 0x05
#byte PORTB = 0x06
#bit LED1 = PORTB.1 //Rojo Secuencia Incorrecta
#bit LED2 = PORTB.2 //Verde Secuencia correcta
#byte ANSEL = 0x9b
#byte TMR1L = 0xE /* definitions for Timer1 module */
#byte TMR1H = 0xF
#define ALL_OUT 0
#define ALL_IN 0xff
/**************************************************************************
* Variables Globales
**************************************************************************/
int16 t;
/************************************************************************
* Interrupcion EXT
* Usada para detectar flanco de subida de señal R
**************************************************************************/
#INT_EXT
void EX_isr()
{
set_timer1(0);
}
/*********************************************************************************
* Interrupcion CCP1
* Usada para detectar tiempo que ocurre en flanco de subida de señal S
* De acuerdo tiempo transcurrida se sabe si la secuencia es correcta o incorecta
**********************************************************************************/
#INT_CCP1
void CCP1_isr()
{
t=CCP_1;
if(t>0 && t<6000) { //Secuencia Correcta (t en us)
LED2=1;
LED1=0;
}
if(t>6000 && t<12000) { // Secuencia Incorrecta (t en us)
LED2=0;
LED1=1;
}
}
/**************************************************************************
* Programa Principal
**************************************************************************/
void main()
{
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); // tick= 1useg a 4Mhz
setup_ccp1(CCP_CAPTURE_RE);
set_tris_b(0x9);
LED1=0;
LED2=0;
enable_interrupts(INT_EXT);
ext_int_edge(0,L_TO_H);
enable_interrupts(INT_CCP1);
enable_interrupts(GLOBAL);
while(1);
}