Autor Tema: Contador de pulsaciones (temporizador)  (Leído 3449 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado berch

  • PIC10
  • *
  • Mensajes: 2
Contador de pulsaciones (temporizador)
« en: 16 de Noviembre de 2011, 13:18:47 »
Buenas. Estoy desarrollando un programa para medir la presión arterial, el tema de la presión lo tengo solucionado pero ahora quiero añadirle que me muestre las pulsaciones por minuto.

El número de pulsos lo tengo. Ya he estado mirando por el foro y he visto algún ejemplo de hacer un temporizador, incluso he probado a implementar uno de 1segundo y funciona correctamente.

El problema es el siguiente, yo estoy continuamente captando datos de presión y de pulsaciones por dos canales distintos y tengo que hacer que mientras cuente pulsos, cuente el tiempo también pero no soy capaz.

El código (parte de él) es el siguiente. En la etapa1, simplemente para mostrarlo aquí, he puesto la función que vi en este mismo foro para contar 1 segundo, y lo de la etapa2 es lo que quiero que haga mientras cuenta el tiempo. Entonces no sé como colocarlo, y supongo que tendré que reestructurar lo de las interrupciones para no perder datos de las mediciones durante 1 segundo entero.

#device ADC=10    //El convertidor del PIC16F876 tiene 10 bits

#fuses NOPROTECT  //El código no está protegido contra lectura
#fuses NOCPD      //La EEPROM no está protegida
#fuses NOLVP      //No hay programado Bajo Voltaje
#fuses NOWDT      //No activado el Watch Dog
#fuses XT         //Frecuencia de oscilación del cristal 4MHz

#use standard_io(A) //Con esto no se reprograma el pin antes de ser utilizado
#use fast_io(C) //Con esto no se reprograma el pin antes de ser utilizado
#use fast_io(B) //Con esto no se reprograma el pin antes de ser utilizado
#use delay(clock=4000000) //Fijamos la frecuencia de reloj en 4MHz

#use rs232(baud=14400,xmit=pin_c6,rcv=pin_c7,stream=HOSTPC,PARITY=N, bits=8) // Configuración del puerto serie


float pulsacion=0.0; //Variable para el cálculo de las pulsaciones por minuto
float tiempo=0.0; //Variable para ir acumulando los segundos
byte const NInts=30; // Numero de interrupciones para 1 segundo
char C_Ints=0; // Contador de Interrupciones ocurridas
char Flag=0; // Flag que cambia cada NInts interrupciones


#int_RTCC                              // Interrupción por desbordamiento del TIMER0 RTCC
RTCC_isr()
{
  if(C_Ints > NInts) // Si las interrupciones ocurridas son mayores que las interrupciones para 1 Seg.
  {                 
    if(Flag==0)
    {
      Flag=1;
    }
    else
    {
      Flag=0;
    }
    C_Ints=0;                          // Reinicializo Contador de Ints
  }
  ++C_Ints;                            // Incremento el número de interrupciones
}                                           // ocurridas



#separate
   void inicializar(); //Etapa usada para inicializar la pantalla LCD y mostrar un mensaje de inicio

#separate
   void etapa1(); //Etapa en la que captaremos y mostraremos por pantalla el valor de presión actual en el manguito
#separate
   void etapa2(); //Etapa donde calcularemos la presión sistólica (alta) y diastólica (baja)



void main() //Función principal en la que llamaremos a las distintas funciones

   inicializar();
   
   while(1) //Este 'while' nos permite que el programa funcione continuamente
   { 
      if(etapa==1)
      {
         etapa1();
      }
      if(etapa==2)
      {
         etapa2();
      }
 
   }
}


#separate
void inicializar()
{
   lcd_init(); //Se inicializa la pantalla LCD
   setup_adc(ADC_CLOCK_INTERNAL); //Ajuste de la frecuencia de trabajo
   
   setup_adc_ports(ALL_ANALOG); //Fijamos todas las entradas como analógicas
   set_tris_a(0xFF); //Fijamos todo lo correspondiente al registro 'A' como entradas
   set_tris_c(0b10111111);   //Configuración extra para el puerto serie: RC7/Rx entrada, RC6/Tx salida
     
   setup_counters(RTCC_INTERNAL,RTCC_DIV_128);// TIMER0: Clock Interno, Presescaler 128
   setup_timer_1(T1_DISABLED);                // para una RTCC cada 33.3 milisegundos
   setup_timer_2(T2_DISABLED,0,1);            // -> 1 Segundo = 30 RTCC
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_RTCC);               // Habilito Interrupción RTCC
   enable_interrupts(global);                 // Habilito Interrupciones

 
   etapa=1;
}


#separate
void etapa1()
{     
    do
  {
    if(Flag==K)
    {
    }
    else //Si ha cambiado Flag...
    {                                       
      tiempo=tiempo+1.0;
      k=Flag; //Se guarda el estado anterior del Flag
    }
  }While(1);

}


#separate
void etapa2()
{     
  aux = leer_pres();
  osc = leer_osc();
 
  if((aux<1400.0)&&(aux>600.0))
  {
 //CUENTA TIEMPO Y PICOS
  }
 
  if(aux<1600.0)
  {       
      //REALIZA UNA SERIE DE OPERACIONES
  }
}



Desconectado berch

  • PIC10
  • *
  • Mensajes: 2
Re: Contador de pulsaciones (temporizador)
« Respuesta #1 en: 16 de Noviembre de 2011, 20:06:54 »
Se puede cerrar el tema, ya está resuelto el problema. No lo he conseguido, pero como hago la comunicación con un PC mediante Labview, he acabado midiendo el tiempo con el propio Labview.

Gracias de todos modos y un saludo

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Contador de pulsaciones (temporizador)
« Respuesta #2 en: 16 de Noviembre de 2011, 20:40:33 »
aunq ya lo tengo resuelto te comento como hacerlo por si decides ponerlo algun dia, poner un timer con la entrada del pin como contador, poner otro timer a 1s, aunque tambien lo puedes colocar cada 500ms y multiplicar por 2, o cada 100ms y por 10 ya depende del ratio de actualizacion que quieras.

Cada vez que se ejecute el timer, lees el registro del otro timer (el contador) y con eso ya tienes cuantos pulsos por segundo.