/////////////////////////interrupcion puerto B pic16F84////////////////////
// se detecta por interrupcion en RB0 un pulso por flanco ascendente //
// una vez detectado se le toma el tiempo, si el mismo exede 1segundo //
// RA0 se pone en 1 //
// cuando se detecta un flanco negativo si RA0 estaba en 1 vuelve a 0 //
///////////////////////////////////////////////////////////////////////////
#include <16F84.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT //fusibles
#use delay(clock=4000000) //velocidad del cristal
#use fast_io(A)
#use fast_io(B)
#byte port_a=5 //puerto A
/////////////////////////////variables/////////////////////////////////////
int1 flanco=0; //flanco es una variable de un bit
int16 ticks=0; //ticks es una variable de 16 bits
///////////////////////////////////////////////////////////////////////////
#INT_EXT //interrupcion externa en RB0
void interrupcionRB0() {
if (flanco==0){ //se detecto flanco ascendente
set_timer0(156); //pongo el valor 156 en el timer, le quedan por contar
//100 microsegundos
enable_interrupts(INT_TIMER0); //habilito la interrupcion por desborde del timer0
ext_int_edge(0,H_TO_L); //configuro para que detecte flancos descendentes
ticks=0; //inicializo el contador en cero
flanco=1; //indico que el proximo flanco es descendente
} else { //se detecto flanco descendente
ext_int_edge(0,L_TO_H); //configuro para que detecte flancos ascendentes
flanco=0; //indico que el proximo flanco es ascendente
disable_interrupts(INT_TIMER0); //desabilito la interrupcion por desborde de timer0
ticks=0; //elimino el valor anterior (menor a 10000) vuelvo a inicializarlo
port_a=0; //pongo a cero el puerto A
}
}
#INT_TIMER0 //interrupcion por desborde de timer0
void int_timer() { //desborda cada 0.1mS
set_timer0(156); //despues del desvorde le vuelvo a signar el vlaor 156
ticks++; // ticks se incrementa en 1 cada 0.1mS (100 microsegundos)
}
void main () {
delay_ms(333); //pausa mientras se estabiliza el pic
disable_interrupts(global); //desabilito todas las instrucciones que voy a usar
disable_interrupts(int_ext);
disable_interrupts(INT_TIMER0);
delay_ms(333); //estabilizo y pongo a "cero" el pic
///////////////inicializo las partes a usar del pic///////////////////////
set_tris_a(0b00000); //todo el puero a como salidas
port_a=0; //pongo a cero todo el puerto A
set_tris_b(0b00000001); //selecciono RB0 como entrada
ext_int_edge(0,L_TO_H); //configuro para que detecte flancos ascendentes
flanco=0; //indico que el flanco detectado es ascendente
enable_interrupts(int_ext); //habilito la interrupcion externa
enable_interrupts(global); //habilito el uso de interrupciones
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); //habilito timer0 como contador interno,
//cada cuatro ciclos de reloj se incrementa en 1
do {
if (ticks==10000) { //si ticks = 10000 paso un segundo (0,1mseg * 10000)
port_a=0b00001; //pongo a 1 RA0
}
} while (TRUE);
}