Hola.
Acá escribi una version preliminar en C para el integrador. Se que le falta mucho aun, instrucciones que tal vez son necesarias y que no he considerado por inexperiencia, por ello no la he compilado (en PICC q es el que uso). Falta el como identificar los valores que definen un determinado nivel de voltaje que sirve de discriminacion en rutinas condicionales y eso no tengo idea como hacerlo (una alternativa es por prueba y error pero no se de donde empezar)... En el programa se describe mas detalladamente...
/////////////////////////////////////////////////////////////////////////////////////////////////////////
//// ////
//// integrador de voltaje entre 0 y 5 volts provenientes de ////
//// fototransistores. Los fototransistores se conectan al puerto A/D del ////
//// pic 16f877a. La integracion es por 10 segundos. la integracion es sobre ////
//// diferentes colores de papeles que daran a los fototransistores diferentes////
//// niveles de voltajes dependientes del color del papel. para cada color es ////
//// necsario fijar un valor de referencia para que el microprocesador ////
//// pueda identificar de que color se trata. ////
//// ////
////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT //no se si esto está bien
#use delay(clock=4000000)
short cont;
const int escala = 255;
#device adc=8
//#device adc=10
#define INTS_PER_SECOND 15 //numero de desbordes del tmr0 por segundo 4000/(256*256*4)
BYTE segundos; //almacena segundos transcurridos desde empieza la cuenta
BYTE int_count; // contador de interrupciones
#int_rtcc // Esta funcion es llamada cada vez
void clock_isr() { // que el timer0 se desborda (255->0).
// Para la frecuencia de 4MHz es aprox.
if(--int_count==0) { // 15 veces por segundo
++segundos;
int_count=INTS_PER_SECOND;
}
}
void main() {
long sensor1 = 0; // tres salidas fototransistores conectados al porta A/D
long sensor2 = 0;
long sensor3 = 0;
long suma1; //variables que acumulan la suma de voltajes
long suma2;
long suma3;
set_tris_b(0); //puerto b como entrada
set_tris_c(1); //puerto c como salida
setup_adc_ports(ALL_ANALOG); //configuracion de entradas analogas
setup_adc(ADC_CLOCK_INTERNAL);
while (1)
{
cont=input(PIN_B2); // entradas de activacion del contador
if(cont==0)
{
int_count=INTS_PER_SECOND;
set_rtcc(0);
setup_counters( RTCC_INTERNAL, RTCC_DIV_256);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
}
if(segundos<=10)
{
set_adc_channel(0);
valor1=read_adc();
suma1 = suma1 + valor1;
delay_ms(200);
set_adc_channel(1);
valor2=read_adc();
suma2 = suma2 + valor2;
delay_ms(200);
set_adc_channel(2);
valor3=read_adc();
suma3 = suma3 + valor3;
delay_ms(200);
}
if(suma1>x&&suma1<y) // x e y serian la suma de voltajes
{ // que definen los niveles en que debe encontrar
output_bit(PIN_C1,1); // suma 1 para que corresponda al color rojo por
} //ejemplo
else
{
output_bit(PIN_C1,0);
}
if(suma2>z&&suma2<w) // idem para otro color
{
output_bit(PIN_C2,1);
}
else
{
output_bit(PIN_C2,0);
}
if(suma3<a) // idem para otro color
{
output_bit(PIN_C3,1);
}
else
{
output_bit(PIN_C3,0);
}
}
}
-----------------------------------------------
Agradezco comentarios...