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
}
}