Contar pulsos en determinado tiempo

#1
Buenas...

Hace rato que pienso esto y no lo puedo sacar: ¿Cómo hago para contar la cantidad de pulsos que se producen en una entrada de un PIC 16F84a durante un determinado tiempo?

El valor registrado sería luego usado como base para un tacómetro.


De antemano, gracias por la ayuda!
 
#3
Si tienes el programa capáz puedo deducir alog! Gracias!!!

Solo faltaría el tiempo no? Porque ese cuenta pulsos, cantidad total o me equivoco?
 
#5
Es sencillo, para saber la cantidad de pulsos que entran al pic, deberias habilitar un contador, bueno no conozco ese pic, pero he trabajado con 16f877 y 18f4550, en estos se usan los llamados timer, timer 0 se configura como contador, y el timer 1 se deberia configurar como temporizador este es quien va a llevar el tiempo. si crees que esto quizas te puede ayudar dime y te lo explico con mas detalle
 
#6
Fianalemente lo pude lograr, pero tengo un problema en la entrada de la señal porque tiene rebotes, me dijeron hacer una báscula que active en los 4V y desactive en 1V así dejamos entre medio de estos valores todos los posibles rebotes, pero no tengo idea como hacerla. Sugerencias?
 
#8
Este trabajo no fue elaborado con este proposito, pero cumple la funcion aceptablemente.
Pulsos a RB4 e Interrupcion a RB0

hay dos maneras para que funcione :

1) Modificar el asm para que este actualizando continuamente
o
2) Hay que agregarle un resistencia y un pushbutton de la siguiente manera
………………………………………………RB0
………………………………………………/|\
………………………………10K…………|………_|_
Vcc o--------/\/\/\/\/-------o o---------|>GND
http://www.mikroe.com/en/books/picbook/2_chapter/2_22.gif
 

Adjuntos

#9
Encontré en este foro esta respuesta que diste "Es sencillo, para saber la cantidad de pulsos que entran al pic, deberias habilitar un contador, bueno no conozco ese pic, pero he trabajado con 16f877 y 18f4550, en estos se usan los llamados timer, timer 0 se configura como contador, y el timer 1 se deberia configurar como temporizador este es quien va a llevar el tiempo. si crees que esto quizas te puede ayudar dime y te lo explico con mas detalle", es por eso que te escribo.

La situacion es la siguiente:
Estoy trabajando con un 16f877 y un equipo que me da pulsos. El equipo me da un tren de N pulsos, con 250mS en alto y 50mS en bajo. Yo debo capturar la cantidad de pulsos.

Lo he intentado con el timer, con temporizacion de bucles anidados pero casi siempre tengo perdidas en la cantiadad de pulsos y lo peor es que no siempre da el mismo valor, es decir,el mejor resultado que he obtenido para un tren de 6 pulsos es una suma de 4 pero a veces incluso solo cuenta 2 o 3, por favor ayúdame.

Mil Gracias!

perdiendo 2 pulsos
 
#10
DIANAPYE

Dudo que el buen RJR te responda puesto que no ha posteado desde Enero. Así que me tomaré el atrevimiento de tratar de aconsejarte aunque tu pregunta no vaya dirigida específicamente a mi. como va dirigida a RJR :D

No se programar el 16F877 pero hasta donde yo ese microcontrolador tiene 3 Timers de los cuales 2 puedens ser usados como contadores (el TMRO y el TMR1)
La idea es que configures uno de ellos como contador y que conectes la salida de los pulsos al respectivo pin asociado. Entonces puedes dedicar el CPU del micro en otras cosas y el timer configurado como contador contará los pulsos que lleguen al pin asociado no importando el ancho que tengan estos. lo que hace es contar simplemente los flancos o bien de subida o bien de bajada (creo que eso se puede configurar también) y en cualquier momento tu puedes leer los registros de dicho timer para saber cuantos pulsos hasta ese momento han llegado.
El único limitante para contar pulsos es que estos vengan a mayor velocidad que la frecuencia del reloj del PIC pero por los datos que das no habrá problema 1/(250 ms +50 ms) = 3.33 Hz lo cual es una tortuga frente a cualquier cristal que uses.
Ahora si lo que desea es contar los pulsos para medir su frecuencia entonces además de usar el contador tienes que usar un timer más para que te marque la unidad de tiempo. para esto tienes q configurar otro timer como temporizador y colocarle un valor de inico en su registro de tal suerte que el tiempo que demore en desbordar sea la unidad de tiempo que vas a usar, eso se puede hacer automáticamente (por hardware) configurando el timer como temporizador con autorecarga. Como tu frecuencia es bien baja entonces tendrás que contar varios de esos ciclos para obtener una unidad d tiempo mas grande. Salvado eso la idea es que en cada desborde (o despues de cada N desbordes si haces lo q te mensiono al último) aprovechas la interrupción que se produce para leer el número de pulsos que se han acumulado. lo divides entre la unidad de tiempo que elegiste (que si eliges 1 seg no es necesario dividir) y ya tienes el valor de la frecuencia de los pulsos.

Espero que te sirvan los datos. Si ya sabías todo esto. bueeeno pues le servirá a otro :D . si es que ya sabias todo esto pues te recomiendo que adjuntes tu código para que alguien que sepa programamar el 18F877 pueda verlo y quizá corregirlo. Muchos salu2.

BRAULIO.

PD: DIANA. lindo nombre.
 
#11
Braulio, gracias por escribirme.

Justamente esas recomendaciones son las que he probado pero el resultado no es el esperado. Como escribí anteriormente por alguna extraña razón hay perdidas en el conteo, incluso de 6 pulsos que hay solo contabiliza 3 o 4; será que tienes o has visto un código en asm que me puedas facilitar?
Sería de gran ayuda

Mil Gracias
 
#12
La frecuencia de lectura de un PIC, es lo suficiente mente alta como para que no me saltee estados? es decir, tengo un motor que por cada vuelta por ejemplo me marca un 1, si hago girar a este moto (por decir algo) a 1800 rpm, el PIC alcanza a leerlo?
 
#13
Hola dianapye

Los pulsos que te envia ese equipo que mencionas, ¿son pulsos puros o pueden tener rebotes (medio mecanico).

Mencionas que cuentas 6 pulsos, ¿cuentas los que llegan o durante un tiempo?. ¿Qué flanco empleas para contar, ascendente o descendente?.

Si cuentas los pulsos totales que llegan (no en determinado tiempo) al micro, ingresalos por la entrada del timer 0 (en modo contador) y acumúlalos en un contador.

Realiza la lectura del contador y envia la cuenta al display. Me parece que es lo quierres.

Saludos y suerte
 
#14
Hola amigo

ciri dijo:
La frecuencia de lectura de un PIC, es lo suficiente mente alta como para que no me saltee estados? es decir, tengo un motor que por cada vuelta por ejemplo me marca un 1, si hago girar a este moto (por decir algo) a 1800 rpm, el PIC alcanza a leerlo?
Contar 1800 RPM significa 1.8 kHz. Un PIC utiliza cristales de 4 MHz o mayores, suficientes para poder contar los 2 kHz que necesitas.

Cuanto mayor sea la frecuencia del cristal, mejor será. Si utilizas el 16F877, emplea 20 MHz y listo.
 
#17
Gracias. igual las 1800rpm, eran un ejemplo.

El tema es que estoy intentando censar los movimientos de un motor, y quiero controlarlo mediante un soft en la PC, y el puerto paralelo no tiene esa velocidad de lectura, por eso estaba pensando en pasarlo mediante un PIC, y que este me de cierta información a la PC.
 
#20
Hola gabrielg

Los pulsos que envia ese equipo se supone que son puros y por eso los estoy contando a través del tmr0 acumulandolos en un registro, no tomo en cuenta el tiempo porque el aparato me dice si está ocupado o no entonces el tiempo no es importante. he utilizado flanco ascendente y descendente y el resultado es el mismo y de hecho se que se estan perdiendo los pulsos porque los estoy visualizando a través de un lcd. qué mas hago?.

sin embargo después de que ha contado varias veces y he puesto el tmr0 a 0 el error en el conteo disminuye, como puedo estabilizar el pic?

hay alguna bandera para saber que el tmr0 esta contando?

Saludos y muchas gracias
 

Temas similares

Arriba