Lectura de pulso y calculo de porcentaje con PIC16F

Hola.

He estado buscando en este y otros foros sobre la lectura de pulsos con PIC. Pero tengo que admitir que, aunque se manejar algo un serie 16F, no me aclaro mucho sobre el tema de los pulsos. Voy a intentar explicar mi caso:

Tengo un pulso de 0-12V con un periodo de un segundo. A su salida hay un led con el que se puede comprobar mas o menos cuanto tiempo esta en alto y en bajo el pulso durante un segundo.

PROBLEMA 1: Solo con el led, es imposible decir en porcentaje el tiempo que el pulso esta en positivo (a esto se le dice ciclo de trabajo?). Por ello, me gustaria leer el pulso con una entrada del pic y calcular el porcentaje de tiempo que esta en positivo para sacar el resultado por un LCD (Tampoco me hace falta tanta resolucion, con sacar un numero aproximado esta bien). El tema del calculo y del lcd creo que no hay problema, pero lo de leer el pulso....Por lo que he visto alguna gente utiliza una interrupcion con el pin RB1, pero ese pin ya le tengo usado para otra lectura. Es posible arreglar este problema por otra entrada?

PROBLEMA 2: Buscando por la red he encontrado algunas explicaciones y ejemplos, pero casi todos se refieren al lenguaje C y casi nada con ensamblador. Sin embargo, lo poco que conozco de programacion se refiere al ensamblador. El problema que he planteado arriba, es imposible sin no es con C?.

No quiero programas, pero agradeceria cualquier ayuda.

Saludos.
 
hola loudness, ten en cuenta que todo lo que se puede hacer en C u otros lenguajes de mediano y alto nivel se pueden hacer con asm, pero (dependiendo del caso) seria mas tedioso.

Para el caso que planteas y como la precisión no es muy critica, tambien asumiendo que tienes ocupado los puertos que tiene funciones especiales, te planteo esta solucion.

1) utilizar una interrupcion temporizada, por ejemplo de a 1ms.
2) cada vez que suceda la interrupcion verificar el estado del pin al que se le conectara el ancho de pulso a medir, si es 1 incrementa un contador y si es 0, termina la cuenta.
3) en la rutina principal (main()) mostrar en el LCD el valor del ancho de pulso.

claro que de este modo tendrías un error de +-1ms con respecto al valor verdadero.
 
Hola Loudness, mira a tu problema 1, sucede que no sos muy avezado de los PIC, resulta que disponen de un módulo de Captura/Comparación/PWM (CCP le dicen) que en conjunto con los temporizadores, permite realizar en forma sencilla las tareas de medición de tiempos, frecuencias y generación de señales digitales (PWM). Te doy una pista, en el buscador pone "pic + modulo CCP" y sale la info, también está tratado en la hoja de datos de los 16F, y hasta existe una "Nota de aplicacion" (application notes) de microchips, donde se explayan en el tema.
Sin éste módulo, no sería tan fácil programar un velocímetro o un frecuencímetro de baja periodicidad, así que apuntale por ahí a tu busqueda.
Entre los ejemplos del compilador CCS, existen un par de ejemplos donde se trata el tema, muy fácil de comprender.

Problema 2: también programo en ASM, pero reconozco que se le acaba su practicidad a la primer operación matemática de cierta complejidad que tengas que hacer, el asm, es especialmente indicado para la serie 12F y los 16F en operaciones donde la velocidad es primordial, después conviene emplear el "C".
Opino/creo que el "asm" te está limitando en tu conocimiento y aprovechamiento de los pics (te ralentiza), recomendación, aprende C, verás como le sacas ventaja a todas las herramientas que traen los pics y como se acelera la programación, no más quebraderos de cabeza, creeme.
 
Última edición:
Saint_ : Gracias por tu respuesta.

Veo esta solucion muy interesante. Desde cualquier entrada se puede realizar y con un error de 1ms es mas que suficiente para lo que estoy buscando.

El problema que le veo es que, ya estoy utilizando una interrupcion por cambio del pin RB1, un contador de tiempo que actua cada 6 minutos. Cuando este en plena interrupcion leyendo el pulso, si salta el RB1 el programa se va a volver loco?.

Saludos



AleSergi: Gracias por tu respuesta

Esta claro que no soy muy avezado en los pic!. Si fuera un experto no me haria falta consultar jajaja (y)

Buscando sobre este tema, lo que la gente primero me aconseja es el modulo CCP.
Ya he uilizado con anterioridad este modulo para la generacion de una senal PWM.

El problema que se me plantea en mi diseno es que, en el PIC16f877a que es el que estoy utilizando, las patillas de la entrada al comparador son 16 y 17 (40pin DIP). Esas patillas tambien se pueden utilizar como entradas digitales (RC1 y RC2) configurandolas desde el programa.
El circuito que estoy intentando modificar es un circuito ya existente, disenado por otra persona pero que necesita la modificacion del software. El caso es que el circuito ya esta utilizando las patillas 16 y 17 como entradas digitales para leer 2 switchs y asi tiene que seguir. La RB1 tambien esta utilizada asi que estoy buscando una manera de hacerlo sin necesidad de entradas "especiales" y hay esta el problema.

En cuanto a utilizar ASM o C, he encontrado opiniones para todos los gustos. Lo del PIC no lo he estudiado en ningun lado, lo estoy aprendiendo por mi cuenta y riesgo: leyendo libros, entrando en foros, escuchando opiniones...
Cuando empeze no sabia absolutamente nada de programacion y me parecio que el ASM era mas facil de entender que el C, por eso me fui a el. Pero, con los programas complicados veo que la gran mayoria de la gente utiliza C. Como bien dices, las operaciones parecen mas faciles.

Este programa que tengo en manos tengo que terminarle como sea en ASM, pero, cuando termine voy a seguir tu recomendacion y me voy a poner con el C

Saludos
 
Última edición:
Saint_ : Gracias por tu respuesta.

Veo esta solucion muy interesante. Desde cualquier entrada se puede realizar y con un error de 1ms es mas que suficiente para lo que estoy buscando.

El problema que le veo es que, ya estoy utilizando una interrupcion por cambio del pin RB1, un contador de tiempo que actua cada 6 minutos. Cuando este en plena interrupcion leyendo el pulso, si salta el RB1 el programa se va a volver loco?.

Saludos

... por lo que comentas me imagino que estas utilizando la interrupción de cambio de estado del puerto B para alguna otra tarea, si es asi, no hay problema, para el caso particular que comentas sucedera que:
1) mientras estés dentro de una interrupción es claro que no se puede atender a otra.
2) si se esta procesando una interrupción y se dispara otra, si bien esta no se atiende de inmediato queda activada su bandera de modo que cuando se termine de procesar la interrupción actual inmediatamente procesara la otra.
Asi que no hay lio.
Al utilizar la interrupción por cambio de estado, asumo que la señal que ingresa a ese pin esta bien acondicionada, lo mismo para la interrupción externa, ya que si no es asi tendrías una serie de disparos falsos de dicha interrupciones y eso si seria un caos.
 
Entendido lo de las interrupciones. Era un tema por el cual queria preguntar desde antes. Gracias por aclararmelo:apreton:

La senal que entra al RB1 no es que este muy bien acondicionada que digamos. Te explico.

El circuito del PIC esta instalado en una maquina controlada por un viejo circuito analogico, del cual no conozco casi-nada(ni siquiera tengo un circuito).
El objetivo del pic es cojer algunas senales de ese viejo circuito (temperatura, tiempo) y sacarlas por un display de 16x2. Es una especie de puente (chapuza) mientras se disena un nuevo circuito para sustituir al analogico.

Una de esas senales es la de un contador que, cada 6 minutos, saca un pulso instantaneo de 12V. La persona que diseno el hardware del PIC (que ya no sigue en la empresa) metio esos 12V directamente a un puente de resistencias para reducirla a 5V y la metio directamente al RB1.

Al funcionar la maquina de forma continuada, no se ve ningun problema con la interuupcion RB1. Pero he notado que al apagar la maquina y al encenderla de nuevo y mirar la memoria del pic, ha contado 1 a pesar de que el contador no ha saltado:eek:.

Un desastre que otro hizo y ahora yo tengo que arreglar a toda velocidad sin tener mucha idea de lo que estoy haciendo:facepalm:, pero mejor no me quejo.

Lo siento por alargarme tanto
 
... hay veces que eso pasa, algo parecido me paso y debido a la urgencia tuve que trabajar a toda maquina durante 3 dias(sab, dom y lun)...pero ya paso.

el problema que tienes podría deberse a que:
1) al momento de encender la maquina y como transitorio este envié un cambio de estado y eso sea lo que detecte el pic dando una lectura errónea.
2) al momento de alimentar al pic este en su estado interno de rb1 podría iniciar en 1 y la maquina iniciaria en 0 de modo que eso también dispararía la interrupción por cambio de estado...
En fin, esas me parecen los motivos mas probables para suceda el problema que tienes.
 
Perdon por tardar en contestar.

El problema del contador a desplazado en importancia al del pulso:cry:

He notado que el problema no es al encender la maquina sino al apagarla. Al quitar la alimentacion, el pic no se apaga de inmediato, sino que tarda casi un segundo (por lo menos el lcd tarda asi) y es en ese tiempo cuando escribe en la memoria sin desearlo.

He leido que para evitar una escritura erronea es conveniente activar BOREN y PWRTE en la palabra de configuracion pero ya lo he hecho y no ha solucionado el problema...

Que se puede hacer para evitar una escritura indeseada en la memoria EEPROOM?.

Gracias por su atencion.
 
Como poder, se pueden hacer nuchas cosas, la pregunta es cuales puedes hacer con minimos cambios.

Si la llave de apagado tiene un contacto auxiliar, puedes leer el estado de ese contacto y bloquear la escritura a memoria.

O analizar por que la tarjeta queda encendida tanto tiempo, con un contacto auxiliar de la llave principal, descargar el capacitor que alimenta a la tarjeta con el PIC.

Los problemas en el encendido y apagado son peliagudos, no te lo tomes como algo personal, el hecho de que hayas encontrado esa escritura a la memoria en el apagado es ya un gran avance.
 
chclau: Gracias por la respuesta.

Lo de encontrar el problema creo que ha sido mas suerte que otra cosa:rolleyes:

La llave de apagado no tiene contacto auxiliar y no veo manera de cambiarlo.

Por que queda encendida tanto tiempo no consigo entenderlo. Por software he conseguido que se rebaje el tiempo que se queda encendido a 1 segundo (mas o menos) pero no consigo hacer nada para que se descarge mas rapido...

Alguna idea por software?
 
Atrás
Arriba