Puedes utilizar el tmr0 (timer). te lo escribo en pseudocodigo
(ojo es para medir el periodo y no la anchura de pulso, aunque seria similar con algunos cambios)
#interrupcion
guardo el acumulador,banderas y todo lo necesario
duracion = Timer0
pongo el tmr0 = 0
restauro todo
#
#principal
duracion=0
bucle
Si duracion !=0 entonces print(duracion)
medida=duracion;
duracion=0
miro pulsadores ,led y demas cosas
fin
una forma de mejorar el conteo de pulsadores es hacer la mediana
es tan sencillo como
bucle (n<8)
{
mediana=mediana+duracion
}
mediana>>3
Lo sumas y luego lo rotas a la izquierda con un RRL, cada rotacion es una potencia de dos
2,4,8,16,32...por eso cojo 8 datos
En microchip tienen algunas funciones interesantes
Es muy importante conocer el tiempo entre pulsos
Para administrar el TMR, puede ser necesario utilizar argucias para aumentar el numero de bits.
La precision, si con 8 bits te apañas por que complicarse la vida.
El numero de interrupciones por segundo, nos indica el tiempo que nos sobra para otras tareas como mirar pulsadores, pantallas, led cosas no criticas.
Finalmente se trabaja por valores promediados asi se evita el vailoteo de los numeros, se reduce el riesgo de valores erroneos o ruidosas