TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: MGLSOFT en 23 de Agosto de 2011, 10:31:29
-
Alguien implemento 16 contadores rápidos (hasta 150 hz) en un PIC ??
Estoy viendo la posibilidad de usar las interfaces MCP para tener acceso a las interrupciones y evitar tener que hacerlo por software.
Si tienen ideas mejores por favor sugieranmelas !!
-
Estimado Mglsof:Alguna vez trate de hacer algo similar al menos en teoria funcionó,usé la interrupcion externa, para tu caso construye una "especie de puerta OR de 16 entradas (con 16 diodos switch tipo 1n4058 ??) y la salida de este la mandas a la interrupcion externa, cada vez que uno o mas de los 16 pines cambie, actua la interrupcion y lees los pines de tus puertas y trabajas el incremento de o los pines que cambiaron......no se que pasa con los tiempos y la precision que exije tu proyecto, me cuesta mucho el tema de las matematicas temporisadoras en los controladores.....por lo mismo al final trate de construir contadores por separado...y me quede solo en eso aun no he podido por falte de tiempo...la edad el trabajo y todos esos demonios que aparecen en chile despues de lo 50 cuando estas "cesante" seguire atento a tu tema y ojala pueda aportarte algo....Saludos.
Maxluis.
-
Puestos en esto, algun pic que tenga implementado interrupcion por cambio de estado de al menos 6 pines?
Se de los que tienen 4 pines, pero alguno tiene mas de eso?
-
Puede que, estableciendo un periodo de muestreo de 500us o 1ms, puedas llevar el conteo de las 16 señales sin problema :rolleyes:
-
El único problema es que el PIC deberá atender el canal de comunicación por CAN sin perder los conteos tampoco, eso lo convierte en malabarista, no?? :mrgreen: :mrgreen:
-
¿Estás pensando en algún PIC en concreto?, ¿quizás alguno con hardware CAN?
-
Se puede usar interrupción de alta prioridad, y un código en asm para que sea rápido. :undecided: Todas las demás interrupciones de baja prioridad-
Saludos!
-
¿Estás pensando en algún PIC en concreto?, ¿quizás alguno con hardware CAN?
Si Manolo, un PIC18F4685 podría ser el elegido...
-
Se puede usar interrupción de alta prioridad, y un código en asm para que sea rápido. :undecided: Todas las demás interrupciones de baja prioridad-
Saludos!
Es posible que esto que indicas sea mejor que recibir una interrupcion en un solo pin y ir a leer un MCP expander a ver cual fue el culpable.
Lo bueno de esa configuracion es que puedo detectar mas de un conteo a la vez, si bien sera mas lenta.
-
Se me ocurre que podrías ingresar las 16 entradas en sendos pines, y a la vez desde cada una, un diodo hacia INT0. De esta manera, cada vez que llegase un pulso por cualquier pin, también llegaría a INT0 donde tendrías que chequear cuál de las 16 cambió de estado.
-
Se me ocurre que podrías ingresar las 16 entradas en sendos pines, y a la vez desde cada una, un diodo hacia INT0. De esta manera, cada vez que llegase un pulso por cualquier pin, también llegaría a INT0 donde tendrías que chequear cuál de las 16 cambió de estado.
Guarda que dependiendo de las señales puede que sea peor :tongue: El peor caso, 16 señales a 150Hz desfasadas 410us :? Cada 410us saltará la interrupción, en la cual tienes que identificar que señal la activo e incrementar el contador, lo mismo que la otra opción. Solo que se ejecuta casi de forma inmediata al ocurrir el flanco.
Saludos!
-
Manolo, creo que tu propuesta es similar a la de MaxLuis, solo que la entendí bien desde el principio, no se olviden que no soy electrónico y me cuesta mas entenderlos.
Tengo un MCP23016, creo que voy a armarlo y ver cual solución es la que mejor me va.
Me interesa lo del expansor porque actuaria de fusible ante descargas que pudieran entrar por una o varias de esas entradas, protegiendo al PIC.
Respecto a hacerlo con diodos ¿¿ cuales serian los diodos indicados para hacerlo bien y que no se pierdan pulsos ?? (tengo miedo que si elijo mal cause demoras y pierda pulsos).
-
Tienes razón, no había leído la respuesta de Maxluis pero se trata de lo mismo. Podrías optimizarla dividiendo las entradas entre varias interrupciones externas y así, en cada una de ellas, tendrás que chequear menos pines.
Sobre qué diodos usar, para una señal de 150Hz yo no me comería mucho el coco porque no es una frecuencia alta. Pero si quieres asegurar, ponle un Schottky, que tiene retardos de nanosegundos. Por cierto, ya somos dos los no-electrónicos :lol:
-
Como dice la canción:
Somos mas que dos...!! :D :D :D :D
-
:? :?
La verdad no te entiendo bien MGLSOFT.
Alguien implemento 16 contadores rápidos (hasta 150 hz) en un PIC ??
Estoy viendo la posibilidad de usar las interfaces MCP para tener acceso a las interrupciones y evitar tener que hacerlo por software.
Si tienen ideas mejores por favor sugieranmelas !!
¿Tienes que contar el cambio de estado en cada entrada independiente?
¿Tienes que contar el cambio de estado en cada cualquiera de las entradas?
¿Tienes que contar un pulso para cada entrada independiente?
Si respondes estas preguntas creo que te podremos ayudar mejor a sacar un circuito que te permita andar a esa velocidad que deseas.
Si e que io so mu burto em puden muler. KO?
Un saludo
Reinier
-
:? :?
La verdad no te entiendo bien MGLSOFT.
Alguien implemento 16 contadores rápidos (hasta 150 hz) en un PIC ??
Estoy viendo la posibilidad de usar las interfaces MCP para tener acceso a las interrupciones y evitar tener que hacerlo por software.
Si tienen ideas mejores por favor sugieranmelas !!
¿Tienes que contar el cambio de estado en cada entrada independiente?
¿Tienes que contar el cambio de estado en cada cualquiera de las entradas?
¿Tienes que contar un pulso para cada entrada independiente?
Si respondes estas preguntas creo que te podremos ayudar mejor a sacar un circuito que te permita andar a esa velocidad que deseas.
Si e que io so mu burto em puden muler. KO?
Un saludo
Reinier
Me conviene ver el cambio de estado, por que en el futuro alguna de esas entradas no sera usada para conteo.
Por supuesto que es por cada pin, en forma independiente.
Ora entinde vo ? :D
-
Yo me iría por un PIC con suficientes entradas con interrupción por cambio de pin, de otro modo se podría complicar la electrónica fuera del microcontrolador. Creo que esa solución sería la ideal, los PIC24 y dsPIC de muchos pines tienen unos cuantos dedicados a eso, creo que hasta 20 en elgunos diseños. Es sencillo, si hay cambio de pin, interrupción->captura del puerto y luego a procesar.
No sabría decirte si es posible que algunos dsPIC puedan leer y transferir por DMA el resultado, lo que aumenta la posibilidad de capturar eventos rápidos y luego procesar con más calma.
Saludos
Reinier
Todo claro y comprendido
-
El diagrama que dicen los amigos es el que te muestro mas abajo, pero el problema con los diodos es que si una de las señales se queda en el estado de detección por así decirlo, no te va a detectar las demás.
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=35792.0;attach=16521)
Lo que tienes que hacer es luego de encontrar un método para saber cuando ocurrió un cambio, en una interrupción tomar la muestra de los 16 bits y hacerle una XOR ( or exclusiva) bit a bit con la muestra anterior, donde solo te quedarán a 1 los bits que hayan cambiado, luego a este dato irlo rotando en algún sentido (contar la cantidad de rotaciones) y leyendo el primer bit, cuando detectas un uno en dicho bit según el número que tenga ese contador de rotaciones, incrementas el contador de la variable correspondiente a dicho pin. si lo haces en assembler puedes utilizar el direccionamiento indirecto, si lo haces en C con un arreglo. Ojo tenés que seguir rotando las 16 veces porque puede ocurrir que cambien dos o mas al mismo tiempo, por lo tanto deberías incrementar los respectivos contadores.
-
Capo!!
El unico problema es que me usaste los pines de programación por ICD / ICSP.
Pero capto muy bien la idea. Gracias por graficarlo tan prolijamente, Flaco. :-/ :-/
-
No debería importar que use los pines de programación; una vez programado esos pines son funcionales.
Y si no quieres usarlos, puedes meter esas señales en RB0, RB1 y RB2 usando interrupciones externas.
Pero no se me había ocurrido el problema que enuncia flaco, ya que pensé que los pulsos eran cortos. Efectivamente si un pulso se mantiene, "tapará" los otros que lleguen por el mismo pin.
-
Si, todos asumimos que los pulsos llegan sincronizados, pero si no es así, adiós conteo.
Voy a optar por el expansor nomas, de paso me ahorro los opto acopladores que aíslen mi circuito.
Usare la entrada de interrupción externa y cuando el expansor alcahuetee que hay interrupción leo sus dos puertos y comparo con los estados anteriores, si hay dos o mas a la vez, igual me entero, creo. :oops:
-
Ahora la cuestión es cual usar?
SPI o I2C ??
Una imagen con ambos modelos a ver que opinan...
Solo quedara uno de ellos, por supuesto.
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=35792.0;attach=16546)
Es la tercera vez que lo edito, y no me funciona la imagen...
-
Solo una idea con estos.... Alguien los uso?
(http://img59.imageshack.us/img59/9749/conteorap.png)
-
MGLSOFT, por cantidad de pines usaría el i2c, pero habría que ver el datasheet de cada uno, tal vez la diferencia en velocidades de transferencia sea un punto a tener en cuenta.
-
Yo he probado el SPI y va como un tiro. Supongo que el I2C también irá bien, pero sin duda el SPI es muy rápido.
-
Igual he usado el Modelo SPI a 10Mhz y ningun problema :)
-
Traducción realizada por Google.
MGLSOFT
No sé la cantidad de pines que necesita en su aplicación, además de una buena solución sería dsPIC33FJ128GP802, que tiene 21 pines con interrupción "CHANGE_NOTIFICATION", módulo "ENHANCED_CAN", funciona a 40MHz, es DIP28, y es también de 16 bits .........
Ivan
dsPIC33FJ128GP802 (http://ww1.microchip.com/downloads/en/DeviceDoc/70292F.pdf)
-
Obrigado Ivan !! :-/ :-/
Buen aporte !!