hola de nuevo a todos, estoy haciendo un proyecto en el que necesito medir una señal cuadrada de una frecuencia determinada que oscila entre +/- una tensión determinada. Para ello intento medir con el canal 1 del convertidor A/D del pic16f877 cuando el pulso esta en alto.
Dicha señal cuadrada la genero haciendo pasar una señal que produzco con el timer0 entre 0 y 5V de frecuencia aprox 1Khz (que genere gracias a nocturno66

)por un operacional trabajando en saturación, bueno esto lo explico pq aprovecho este hecho para medir cuando el pulso esta en alto, pero esto es lo de menos, al final lo que tengo a la entrada del canal 1 es un tren de pulsos entre +/-Vcc. Lo que hago realmente es poner la condicion de que cuando el timer0 se ha desbordado, y la señal q genera el pic esta en alto se conecte el canal 1 y mida, esto lo hago para aproximadamente 100 peridodos (tomando 1 muestra por periodo) y luego promedio. En ensamblador asi me funciona pero en c parece q no quiere funcionar. Bueno os pongo el codigo y espero q la explicacion sea mas o menos buena:
#include "D:FACULTADproyectoconductimetroprogramas cpantallabuena.h"
#include <lcdforo.c>
#define use_portb_lcd TRUE
#use delay(clock=4000000)
#byte INTCON=0x0b
unsigned int contador,sonda,suma_sonda,promedio;
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
output_low(pin_b3); /*lo ponemos a 0 inicialmente*/
setup_counters(RTCC_INTERNAL,RTCC_DIV_2|RTCC_8_BIT);
set_rtcc(6);
ENABLE_INTERRUPTS(INT_RTCC); /*para generar la señal con el timer0)
ENABLE_INTERRUPTS(GLOBAL);
contador=100; //inicializamos el contador para promediar a 10muestras
suma_sonda=0;
do
{
if(bit_test(INTCON,2)&&input(pin_b3)==1)
{
delay_us(3);
set_adc_channel(1);
sonda=read_adc();
// delay_us(10);
setup_adc(adc_off);
suma_sonda=suma_sonda+sonda;
contador--;
}
}while (contador!=0) ;
promedio=suma_sonda/100;
lcdinit(); //inicio el lcd
lcd_gotoxy(2,2); //me voy a la linea 2
printf(lcd_putc,"COND:%3.0u",promedio); //presento la cuenta en el lcd
while(1);
}
#int_TIMER0 //generación de señal cuadrada con timer0
void interrupcion_timer0()
{
if(input(pin_b3)==1) /* en esta línea es donde tenías el principal problema
el registro PIN_C3 no es de lectura, sólo de escritura, y para
leerlo
hace falta usar la función INPUT */
{
output_low(pin_b3);
}
else
{
output_high(pin_b3);
}
set_rtcc(6); /*vuelvo a cargar el tmr0
he cambiado el 6 por un 5 para que sea más preciso*/
}
bueno, yo pienso que el fallo puede estar en la condicion para comenzar a medir con el a/d. Muchas gracias a todos