/////////////////////////interrupcion puerto B pic16F84////////////////////
// se detecta por interrupcion en RB0 un pulso por flanco ascendente de //
// la señal de clock (señal de pasos) //
// una vez detectado se le toma el tiempo, si el mismo exede 1segundo //
// RA0 se pone en 1, caso contrario RA0 se pone a 0 //
// (en el circuito, RA0 se conecta a la base de un transistor, //
// cuando RA0 exita la base del transistor este pone en paralelo a la //
// pata Vref del L297 una resistencia que reduce al %50 la tencion de //
// referencia //
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
// metodo usado para setear el timer0 y lograr medir 1 segundo //
// el maximo valor que puedo medir con el timer0 a 4MHz seria: //
// (4/FOSC) * 256 (valor maximo del contador) * 256(prescaler rate) //
// (el prescaler es un divisor de frecuencia, si por ejemplo aumento //
// su valor en 2, la frecuencia que se usara para medir el tiempo será //
// 2*4/FOSC, siendo el maximo permitido 256*4/FOSC) //
// 4/4000000 * 256 * 256 = 0,065536 seg = 65,536ms //
// con el prescaler a 1 el maximo valor a medir seria: //
// 4/4000000 * 256 * 1 = 0,000256 seg = 256µs //
// yo quiero contar 100µseg entonces: //
// 4/4000000Hz * (256 - x) = 100µs //
// 256 - x = 100µs / 1µs = 100 //
// x = 256 - 100 = 156 //
// de ahi el set_timer0(156) //
// 1 segundo son 10000µs con ajustar una variable que cuente 10000 //
// desbordes de timer0 logro medir 1 segundo //
///////////////////////////////////////////////////////////////////////////
#include <16F84.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT //fusibles (cristal, sin watch dog, sin proteccion)
#use delay(clock=4000000) //velocidad del cristal
#use fast_io(A) //el compilador no se asegura que los puertos esten asignados
//correctamente como entradas o salidas segun corresponda, esto evita
//codigo extra, pero se tiene que configurar correctamente los registros
//tris segun el uso que se le de a los puertos.
#use fast_io(B)
/////////////////////////////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() {
ticks=0; //variable que va a contar un segundo la
// pongo a cero
set_timer0(156); //inicializo el timer0 en 156
output_a(0b00000); //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 (de esta manera
//siempre cuento 100 microsegundos, por cada desborde de timer0)
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
output_a(0b00000); //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
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); //habilito timer0 como contador interno,
//cada cuatro ciclos de reloj se incrementa en 1
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
enable_interrupts(int_ext); //habilito la interrupcion externa
enable_interrupts(global); //habilito el uso de interrupciones
do {
if (ticks==10000) { //si ticks = 10000 paso un segundo (0,1mseg * 10000)
output_a(0b00001); //pongo a 1 RA0
}
} while (TRUE); //bucle infinito
}