Hola estimados...
Como este foro ha sido lo que mas me ha ayudado a aprender a programar en C, acá va un pedazo de una rutina más grande implementada, pero que da buena solución al problema de la integración de señales analógicas a la entrada del PIC. Con ejemplos es la forma mas facil de aprender a programar...Gracias por la ayuda...Ojalá esto le sirva a alguien...
#include <16F877A.H>
#fuses XT,NOWDT,NOPROTECT,NOLVP
//#device adc=8
#device adc=10
#use delay(clock=4000000)
#include <lcd.c>
#use standard_io(A)
#use standard_io(b)
#use standard_io(c)
#use standard_io(d)
#byte port_a=5
#byte port_b=6
#byte port_c=7
#byte port_d=8
short entrada; //detecta una entrada en el puerto b
short salida; // detecta salida en el puerto b
short cont; // inicializador del contador
#define INTS_PER_SECOND 15 //numero de desbordes del tmr0 por segundo 4000/(256*256*4)
int segundos; //almacena segundos transcurridos desde q empieza la cuenta
int int_count; // contador de interrupciones
#int_rtcc // Esta funcion es llamada cada vez que el timer0 se desborda (255->0).
void clock_isr()
{
// Para la frecuencia de 4MHz es aprox. 15 veces por segundo
if(--int_count==0) {
++segundos;
int_count=INTS_PER_SECOND;
}
}
void main()
{
long sensor1=0; // fototransistor conectado a traves de un seguidor de voltaje
long suma1=0; //variable que acumula la integracion
long sensor2=0;
long suma2=0;
long sensor3=0;
long suma3=0;
segundos=0;
int_count=INTS_PER_SECOND;
entrada=0;
salida=0;
cont=0;
setup_adc_ports(ALL_ANALOG); // A/D
setup_adc(ADC_CLOCK_INTERNAL);
setup_counters( RTCC_INTERNAL, RTCC_DIV_256);
// set_adc_channel(0);
set_rtcc(0);
disable_interrupts(INT_RTCC);
// enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
lcd_init();
printf(lcd_putc,"Ingrese
Billete"
;
while(1)
{
entrada=input(PIN_D1);
salida=input(PIN_D2);
cont=input(PIN_D0);
if(entrada==0||salida==0)
{
output_bit(pin_c0,1);
}
else
{
output_bit(pin_c0,0);
}
if(cont==0) // si entrada del contador se habilita, se hecha a andar el contador
{
enable_interrupts(INT_RTCC);
printf(lcd_putc,"fProcesan
do..."
;
delay_ms(10);
}
if(segundos>0&&segundos<=15) //integra dos señales de entrada en un
set_adc_channel(0); //intrvalo de tiempo de 15 seg
sensor1=read_adc();
suma1 = suma1 + sensor1;
delay_ms(1);
set_adc_channel(1);
sensor2=read_adc();
suma2 = suma2 + sensor2;
delay_ms(1);
}
if(segundos>0&&segundos<=16) //se ve en la pantalla el resultado de la integración
{ //cada medio segundo, pero no en volts (solo habría
printf(lcd_putc,"fA=%lu
V=%lu ",suma1,suma2);//que agregar un factor conversor)
delay_ms(500);
}
}
}