Modificar programa de un cronometro para microsegundos

Hola a todos, tengo un ejemplo de cronometro el cual intente modificar sin exito para que midiera microsegundos, no necesito que llegue ni a 1 segundo, con 2mS estoy de sobra.Veamos si me pueden dar una mano.
Saludos y gracias.
 

Adjuntos

  • cronometro.rar
    40.9 KB · Visitas: 21
Mira en tu archivo cronometro.c modifica el valor de la linea 47 [set_timer1(55573)] ajusta el valor para que la interrupcion ocurra a una frecuencia tal que te sea adecuada, asi mismo modifica la rutina increment() para que no se incremente en ms si no en uS, en realidad puedes omitir esa rutina e implementar un contador en la misma rutina de interrupcion de timer1 dado que tus valores de tiempo requerido son muy pequeños.
Saludos
 
Para mi es imposible que midas microsegundos con un microprocesador que funciona a unos cuantos MHz, no podes pretender atender interrupciones cada unos 10 a 20 ciclos de reloj.

Solamente la latencia de la interrupcion esta en ese orden, sin que hayas ejecutado ni una instruccion en tu rutina.
 
Última edición:
A pesar de que el codigo parece simple, nunca trabaje con el timer ni con interrupciones, por lo que no entiendo nada de sus consejos.
Chclau, si incremento la frecuencia tampoco seria posible?Gracias por su ayuda.
 
No, no hace gran diferencia que incrementes la frecuencia, ya que esos micros trabajan como maximo a unos 20MHz. Para mi con mucha suerte podes llegar a medir (por software) en resoluciones de varias decenas o centenas de us.

Desconozco si algun PIC tiene mecanismos de HW que permitan recibir señales rapidas. El MSP430 yo se que tiene pero tampoco llega a esas velocidades.

Para llegar a resoluciones de ese nivel yo usaria un contador externo de HW que el microprocesador puede leer. Ese contador lo podrias implementar con componentes TTL o CMOS o con un CPLD chiquito.
 
Hola Marcelo2112, si usas un cristal de 20MHz y programas en el "todo poderoso ASM", si se lograria lo que nesecitas, aun que probablemente el tiempo minimo de medida se de 5us o algo asi incluso quiza se pueda logran un un cristal de 4MHz.
 
yo tuve ese problema hace mucho , con PIC lo que dicen de tiempode latencia de la interrupcion y velocidad es cierto . recuerda que el rejoj de instruciones se divide entre cuatro , osea por mas que trabajes con un cristal a 20 MHZ , la velocidad es 5 MHz ; REcuerda que si quieres leer microsegundos y tener presicion tienes que usar mejor un cristal externo de reloj y utilizar un contador con interrupcion , el problema en mi caso es que el pic tambien controlaba un LCD y entradas de interrupcion por hardware para inicio/parada , simplemente el pic no me rendia , lo cambie por un ATMEGA 8 de AVR y listo ya que el reloj del atmega es 1 a 1 ( real).
 
Todo lo que me dicen, supera mis capacidades, nunca use atmega ni asm, asi que no tengo solucion a menos que encuentre un ejemplo de uso exerno como dice chclau.
Aunque midiendo de a 5uS me seria suficiente. Gracias a todos.

EDit: Ahora estoy trabajando con un medidor de pulso por ccp, pero tengo que hacer que se comience a medir con un pulso y termine con otro. Como lo puedo hacer?Gracias
 
Última edición:
Bueno no hagamos tanto irigote y vamos por partes, si sabemos que el ciclo de instruccion de un pic viene dado como Tins =( Fosc/4)*4 es decir para un clock de 4MHz cada instruccion se ejecuta en 1uS, veamos Tins = (1/4000000)*4 ----> Tins = 0.25us * 4 ---> Tins = 1uS por tanto no se tendria la capacidad de contar cada uS, pero..........si fosc = 20MHz entonces Tins = (1/20000000)*4 ---> Tins = 0.05uS * 4 ---> Tins = 0.2uS y con ello creo que podemos empezar a imaginar como contar.

Saludos
 
contar es contar...........
el tema es como pararlo .
yo hace mucho no hago .
pero supongamso el micro corre alegre con ASM.....

pregunta, pregunta y no sale por donde debe .
hasta que al final pregunta : if bit ?? y sale que si .

de ahi en mas se la debe pasar incrementando contadores a lo retonto y en cada cuenta solo prenguntar :
if bit ?? (para ver si se detiene ) ..........eso si ........estqa vez el micro no hace interrupciones y no hace absolutamente ninguna otra tarea , si hay displays o lo que sea que se apaguen .
el micro solo cuenta.
asi que cada cuenta sera un :
inc.....no se que registro
if bit .....
inc el mismo registro...

aunque .........unna vez que se lleno un registro de 8 bits debera darse cuenta y comenzar con otro ........

entonces el truco es :

la rutina mas corta de incrementar contadorES y mirar cuando parar .
no se cuantos ciclos ocupara eso .
y como dije : desatender TODO EL resto de lo que haya .

estoy errado ???
hace mucho que no hago micros
 
Última edición:
cuando uno quiere hacer algo tan rapido comparado con las capacidades del micro, no lo hace por SW, lo hace por HW. El PIC tiene HW incorporado para hacerlo, se llama modo capture y usa el pin CCP.

Ahora vi que ya estas usando el CCP pero no,entiendo tu pregunta. Si lo que tenes son dos entradas distintas lo que podrias hace es con una hacer set y con la otra reset a un flipflop y configurar el CCP para capturar la distancia entre un flanco de subida y uno de bajada
 
Última edición:
si , con ese modo no ocupas al micro PERO ......... que haces ??
el pin ese detecta cuando se inicia ....... y ??
como te pones a contar micros segundos ??
la cosa no es detectar un evento sin esta rpendiente de el , sino contar pulsos que practicamente son de la duracion de un ciclo de instruccion o unos pocos ciclos.

como haces para saber cuantos pasaron ??
el pin que mencionas podra detectar la señal de inicio y de parada, pero y en el medio ......... que ??

para mi esos pines son para No tener que esperar a que el programa pase por donde supervisas a ver como esta el pin , por que puede ser tarde, pero solo para eso .

ya te dije : estoy hace rato lejos de los micros, explicame en sencillo por que no lo veo .
un saludo y gracias

salvo que .........alguno de los timers que tiene pueda contar solo siguiendo al ck y avise cuando se llena ...y se pueda detener tambien por hard, sin necesidad de el programa .....es asi ??
 
Última edición:
Si no me equivoco ese pin sirve justamente para eso, le decis que desde que la senial sube a que baja, cuente pulsos del reloj. Lo hace automaticamente y te da el resultado en un registro, sin molestar al SW.
 
Tal como lo dice chclau se realiza un conteo de eventos rapidos pero para despejar completamente tu duda fernandob habria que tener muy claro la naturaleza del porque se desea contar los pulsos, es decir para que los voy a medir, si se trata de contar y saber cuantas personas, objetos o que se yo, activaron el pin ccp pues basta con fijar un limite de tiempo como quien mide una frecuencia, por ejemplo generar un retardo de 2mS (como lo plantea marcelo2112 y una vez que se a cumplido el tiempo verificar cuantos pulsos hubo, y respecto a lo que planteas
salvo que .........alguno de los timers que tiene pueda contar solo siguiendo al ck y avise cuando se llena ...y se pueda detener tambien por hard, sin necesidad de el programa .....es asi ??
efectivamente asi es una funcion de timers, como cuando en el 16f628 llegan pulsos por RA4 e incrementa TMR0 y una vez llegado al limite prefijado desborda y genera la INT notificando el evento.
 
Atrás
Arriba