# Contar pulsos en determinado tiempo



## Jorf (Ene 1, 2007)

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!


----------



## mabauti (Ene 2, 2007)

tengo un contador de pulsos basico basado en este circuito



https://www.forosdeelectronica.com/f24/contador-16f84-4550/

por si te interesa.  8)


----------



## Jorf (Ene 2, 2007)

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?


----------



## Braulio (Ene 2, 2007)

Aquí ejemplos de frecuencimetros: https://www.forosdeelectronica.com/f24/frecuencimetro-microcontrolador-3764/, los cuales no hacen otra cosa que contar pulsos durante un determinado periodo de tiempo, el ejemplo mio lo usé exactamente para un tacómetro. Salu2:

BRAULIO


----------



## RJR (Ene 10, 2007)

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


----------



## Jorf (Ene 11, 2007)

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?


----------



## pic-man (Ene 12, 2007)

mabauti podrías compartir el código de tu contador de pulsos? me interesa aprender y viendo códigos se aprende un montón


----------



## mabauti (Ene 12, 2007)

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


----------



## dianapye (Nov 13, 2007)

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


----------



## Braulio (Nov 13, 2007)

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 

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


----------



## dianapye (Nov 14, 2007)

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


----------



## ciri (Nov 15, 2007)

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?


----------



## gabrielg (Nov 17, 2007)

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


----------



## gabrielg (Nov 17, 2007)

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.


----------



## ciri (Nov 17, 2007)

Aaa. claro. la "velocidad de lectura", está dada por el cristal que utilice el PIC.

A bueno. así me quedo más tranquilo!:


----------



## Fogonazo (Nov 17, 2007)

1800 RPM a un pulso por vuelta son 30 Hz


----------



## ciri (Nov 17, 2007)

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.


----------



## gabrielg (Nov 17, 2007)

Fogonazo dijo:
			
		

> 1800 RPM a un pulso por vuelta son 30 Hz



Craso error el mio, gracias fogonazo. ops:


----------



## ciri (Nov 17, 2007)

igual, 30hz, con un cristal de 2mhz, sale como piña.

el ejemplo se entendió.


----------



## dianapye (Nov 19, 2007)

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


----------



## Fogonazo (Nov 19, 2007)

Tomaste lectura con un osciloscopio para ver la forma y amplitud del pulso, no sera que es debil y el PIC eventualmente no lo registra ?


----------



## dianapye (Nov 19, 2007)

la verdad, en osciloscopio no lo he chequeado. Lo vi en un simulador por software y ademas en el pin donde entrega los pulsos tengo un led, que los detecta perfectamente


----------



## gabrielg (Nov 19, 2007)

Hola diana

Deberías colocar el circuito para que podamos analizarlo. Es practicamente imposible que el PIC pierda los pulsos, salvo que pase lo que dice fogonazo.

Saludos


----------



## dianapye (Nov 23, 2007)

Hola Gabriel   

Este es el circuito:
Vcc del circuito 5V, voltaje de alimentación del equipo 12V, R1=100, R2=10K, R3=10K, R4=2.2K
LCD-> PORTD


----------



## andresnicolas (Nov 28, 2007)

hola se puede comandar varias acciones distintas cada vez que se acciona un pulsador gracias


----------



## dianapye (Nov 29, 2007)

Si se puede, utilizando varios registros o banderas, asignandole un contador y por cada número en el que se encuentre una acción o todas las diferentes acciones conectadas al mismo pin que active el pulsador.


----------



## isay (Oct 6, 2008)

mabauti dijo:
			
		

> tengo un contador de pulsos basico basado en este circuito
> 
> 
> 
> por si te interesa.  8)



Que onda que tal mira la vdd me interesa el circuito que hiciste quisiera ver si me podrias ayudar con la programacion o mandar el codigo de este circuito es un contador de 0-999

Te lo agradeceria la vdd me urge ok por favor 

Saludos


----------



## ricardo83 (Nov 6, 2008)

hola diana
no se si viene al caso pero quizas otra forma que pudieras utilizar para contar los pulsos es utilizando la entrada de interrupcion externa del pic (RB0/INT), lo que tienes que hacer entonces cuando se genere la interrupcion es incrementar una variable.
Lo otro que debes tener en cuenta es en que momento vas a resetear el conteo, en ese instante cuando se genere la interrupcion deberas poner la variable contadora a 0.

Saludos


----------



## jalpe (Feb 1, 2013)

RJR dijo:


> 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



Hola camarada, yo estoy trabajando con el PIC18f4550 y mi idea es tambien saber la cantidad de pulsos que entran al PIC, si me pudieras explicar un poco mas sobre los timer del PIC con un pequño ejemplo, te lo agradezco muchisimo....


----------



## nelcom (Sep 10, 2014)

Un saludo a todos, soy nuevo en el foro y quisiera contar con todo su apoyo e igualmente poder colaborarles en lo que más pueda.

Llevo un tiempo trabajando con pics y el programa mikroc.
Estoy en la tarea  de contar un tren de pulsos durante un tiempo especifico, lo he hecho   pero a veces da y otras no.

Esto es lo que tengo hecho, la idea es que el tempo sea exacto con el ingreso del primer pulso y al pasar los 8 segundos según la cantidad de pulsos guardado en la variable pulso hay donde utilizo sentencia switch.  en mis pruebas, creo que el problema  es con el tiempo, porque a veces espera los 8 segundos y a veces no.


----------

