Autor Tema: duda con a/d  (Leído 2026 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado martos_iii

  • PIC10
  • *
  • Mensajes: 26
duda con a/d
« en: 12 de Abril de 2005, 05:53:00 »
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 Giño )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