/*
PROGRAMA PARA LOS 3 PICS ESCLAVOS, ESTOS SOLO LEEN LOS SENSORES EN LOS PUERTOS A,B,C y D.
SI LA LECTURA ES IGUAL A LO GUARDADO SE PRENDE EL PIN E0 PARA INDICAR QUE SE PUEDE CONTINUAR CON EL ESCANEO
*/
#include <16f1939.h>
#DEVICE ADC=10;
#FUSES INTRC_IO,NOWDT,NOPUT,NOMCLR,PROTECT,NOCLKOUT,PLL,NOLVP
#USE DELAY(clock=32M, INT=8M)
//#USE RS232(BAUD=115200,XMIT=PIN_C6,RCV=PIN_C7)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
#define ok_led pin_e0//bit para indicar que la lectura fue correcta(output)
#define enable pin_e1//bit para continuar con las lecturas(input)
#define save pin_e2//bit para guardar los datos leidos(input)
#define reset pin_e3//bit para reiniciar el la variable n_lectura y empezar un nuevo escaneo
#define muestras 150
#define t1_2ms 49500//valor del timer 1 para generar interrupcion cada 2ms
unsigned int datos_a[muestras],datos_b[muestras],datos_c[muestras],datos_d[muestras];//vectores para guardar todos los datos
unsigned int cont=0,n_lectura=0;//contador para saber el numero de interrupciones ocurridas y variable para saber el numero de lecturas en las que se encuentra
unsigned int leds[4];
int1 pol_f=0;//bandera para enviar a la funcion para polarizar los leds en inversa
int1 rs_f=0;//bandera para enviar a la funcion para leer y guardar los datos
int1 rc_f=0;//bandera para enviar a la funcion para leer y comparar los datos
int1 pause_f=1;//bandera para poner en pausa las lecturas, se inicia en 1 para que el pic este parado hasta recibir las instrucciones de incio
void polarizar()//funcion para polarizar en inversa los leds y para
{
pol_f=0;
//se ponen como salidas todos los puertos
set_tris_a(0);
set_tris_b(0);
set_tris_c(0);
set_tris_d(0);
//se polarizan todos los leds en inversa
output_a(0xFF);
output_b(0xFF);
output_c(0xFF);
output_d(0xFF);
}
void read_save()//funcion para leer y guardar los datos de los pixeles
{
rs_f=0;
datos_a[n_lectura]=input_a();
datos_b[n_lectura]=input_b();
datos_c[n_lectura]=input_c();
datos_d[n_lectura]=input_d();
output_high(ok_led);
//n_lectura=0;//tambien se inicializa el valor del conteo
}
void read_compare()//funcion para leer y comparar los estados de las entradas con los guardados
{
rc_f=0;
leds[0]=input_a();
leds[1]=input_b();
leds[2]=input_c();
leds[3]=input_d();
//cuando hay incidencia de luz se descargan mas rapido, por lo que los que esten en cero estan detectando luz
//se compara el valor leido contra el numero de lectura correspondiente
if(//si todos son iguales
leds[0]==datos_a[n_lectura]&&
leds[1]==datos_b[n_lectura]&&
leds[2]==datos_c[n_lectura]&&
leds[3]==datos_d[n_lectura]
)output_high(ok_led);//se prende un led para indicar que se puede continuar
else output_low(ok_led);
}
/*
case 1
case 12
case 13
*/
#int_timer1
void change()
{
cont++;
set_timer1(t1_2ms);//valor del timer para que la interrupcion sea cada 2 ms
switch(cont)
{
case 1://en la primera interrupcion
pol_f=1;
output_low(ok_led);//se apaga el led de la comparacion
break;
case 2:
//se ponen como entrada todos los puertos
set_tris_a(0xFF);
set_tris_b(0xFF);
set_tris_c(0xFF);
set_tris_d(0xFF);
break;
case 3://despues de 11 interrupciones(22 ms despues) se leen los puertos para saber si hay o no incidencia de luz
if(input(save))rs_f=1;//si esta activo el boton para guardar se envia a la funcion de guardar
else rc_f=1;//si no, entonces se vana a comparar los datos
break;
case 4:
cont=0;//se hace 0 el contador
n_lectura++;//se incrementa el contador
disable_interrupts(int_timer1);//se deshabilitan las interrupciones hasta que se indique que se puede continuar
pause_f=1;//se habilita la bandera de pausa para
break;
}
}
void config()
{
int i;
setup_adc(adc_off);
setup_adc_ports(no_analogs);//ningun puerto analogigo
set_tris_a(0);//puertos A:D como salidas
set_tris_b(0);
set_tris_c(0);
set_tris_d(0);
set_tris_e(0b00001110);//solo se pone como salida el pin e0
output_a(0);//todos los pines en 0
output_b(0);
output_c(0);
output_d(0);
set_tris_e(0b00001110);//solo se pone como salida el pin e0
for(i=0;i<muestras;i++)
{
datos_a[i]=0x00;
datos_b[i]=0x00;
datos_c[i]=0x00;
datos_d[i]=0x00;
}
}
void main()
{
config();
setup_timer_1(t1_internal|t1_div_by_1);
enable_interrupts(global);
disable_interrupts(int_timer1);//al prender el pic no hara nada hasta que no reciba las instrucciones de "enable" y de "reset" al mismo tiempo
while(true)
{
if(pol_f)polarizar();//se envia a polarizar los leds
if(rs_f)read_save();//se lee y se guarda
if(rc_f)read_compare();//se lee y se compara
if(pause_f && input(enable))//el pic esta en pausa hasta que reciba la instruccion de enable
{
pause_f=0;//se borra la bandera
if(input(reset))n_lectura=0;//si se recibe la señal de reset se reinicia n_lectura para hacer un nuevo escaneo
set_timer1(t1_2ms);//se inicializa el timer para que genere interrupcion cada 2[ms]
enable_interrupts(int_timer1); //se habilitan las interrupciones de nuevo
}
}
}
ese es mi codigo, como veraz, en la funcion de
config inicializo mis vectores, y en la funcion
read_compare hago la comparacion y no funciona, en cambio si pongo
if(//si todos son iguales
leds[0]==0x00&&
leds[1]==0x00&&
leds[2]==0x00&&
leds[3]==0x00
)output_high(ok_led);//se prende un led para indicar que se puede continuar
funciona bien, no se porque.
lo nombres son muy largos, se borra la ram estando con alimentacion?
, el motor me borra la ram pero no resetea el pic?
, no las inicializo bien?, no se