TODOPIC

Mecatrónica => DMX512 - Diseños y Proyectos => Mensaje iniciado por: Nocturno en 14 de Diciembre de 2007, 04:14:21

Título: Receptor DMX (DMX512)
Publicado por: Nocturno en 14 de Diciembre de 2007, 04:14:21
El ReceptorDMX que os presento tiene un objetivo puramente experimental, y sólo sirve para eso, para probar a interpretar el protocolo DMX512 y mostrar en su display el valor del canal seleccionado en cada momento.

(http://www.micropic.es/images/imagenes/ReceptorDMXpartes.jpg)

DISEÑO
El circuito está compuesto por un PIC como corazón, un ULN2003 para los displays y un MAX485 para el bus DMX. He elegido un 18F2550 porque es el que tenía a mano, pero el software podría modificarse para entrar en un micro mucho más peque porque ocupa muy poquito.

El PIC almacena en su RAM los 512 valores de todos los canales DMX, lo que le permite “absorber” la información de la trama completa.

El canal DMX se selecciona mediante el teclado matricial.

Hay otro dispositivo de salida: el led. Ese led está gestionado por PWM y su Duty cicle viene dado por el dato DMX del canal seleccionado. En este caso, no hay esperas: la información se muestra en tiempo real a la vez que se está escribiendo el canal seleccionado.

El conector DMX sólo necesita tres señales: DMX+, DMX- y GND. Yo he añadido Vdd porque me permite también alimentar algún circuito auxiliar que pueda conectar al bus, aunque no es imprescindible.

(http://www.micropic.es/images/imagenes/ReceptorDMX.jpg)

USO
Utilizar el dispositivo es muy fácil. Al encender el dispositivo ya se pone internamente a capturar toda la trama que le llegue por el conector DMX. En el display aparece la palabra "OFF" mientras el usuario no seleccione ningún canal con el teclado matricial.

A medida que se va pulsando el teclado, el display va mostrando el canal seleccionado.

Mientras se toca el teclado, parpadean los puntos decimales de los displays para advertir que estamos viendo el selector de canal, en lugar del dato DMX. Al cabo de unos segundos la información aparece en los displays.

El valor del canal seleccionado también se representa en el led, cuya intensidad es regulada mediante PWM.

Puesto que el dispositivo memoriza toda la trama (512 bytes) puede ser desconectado del bus y examinado a posteriori como si estuviera físicamente conectado.

En cuanto lo tenga medianamente visible pondré por aquí el esquema y el código del PIC. De momento, os dejo un vídeo del funcionamiento para ir abriendo boca.

Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 14 de Diciembre de 2007, 04:47:57
 :-/ :-/ :-/ super genial maestros  :-/ :-/ :-/
venga ya sube los planos que me pongo a eso  :D :D
Guao manolo  :-/ :-/ :-/ :-/
yo ya decia que eres un Genio  :-/ :-/ :-/
Título: Re: Receptor DMX (DMX512)
Publicado por: LABmouse en 14 de Diciembre de 2007, 09:12:06
Pues se ve muy muy bonito!  :-/
Título: Re: Receptor DMX (DMX512)
Publicado por: Algec en 14 de Diciembre de 2007, 09:28:12
Muy interesante el proyecto, cuando lo subes?
Título: Re: Receptor DMX (DMX512)
Publicado por: ESTECA55 en 14 de Diciembre de 2007, 09:33:10
Muy bueno el Proyecto!

Saludos
Título: Re: Receptor DMX (DMX512)
Publicado por: AKENAFAB en 14 de Diciembre de 2007, 09:33:40
Que bien ha quedado  !!

¿En que software has creado la aplicacion de la pc?



Espero tener tiempo para dedicarle a este protocolo, muy padre te ha quedado.
 
Me han gustado tambien las superpilas. :D se han pasado con el nombre  :D
No las he visto por aca.

Hasta luego



Título: Re: Receptor DMX (DMX512)
Publicado por: jfh900 en 14 de Diciembre de 2007, 13:27:22
(http://www.micropic.es/images/imagenes/ReceptorDMX.jpg)

¿Donde has comprado ese maravilloso conector con soporte para serigrafía?  :D :D :D :D

Un saludo
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 15 de Diciembre de 2007, 03:00:23
Gracias por vuestras palabras. (Akenafab, esas pilas son las que venden en la cadena de supermercados Mercadona, seguro que muchos de mis compatriotas las conocen. Jesús, el conector no lo venden en Mercadona :D)

Ya he subido el código fuente y el esquemático, que podéis descargar aquí: Descargas de ReceptorDMX (http://www.micropic.es/index.php?option=com_remository&Itemid=27&func=select&id=48)

(http://img512.imageshack.us/img512/9342/receptordmxqf9.th.jpg) (http://img512.imageshack.us/my.php?image=receptordmxqf9.jpg)

Del código fuente pegaré aquí sólo la rutina de atención a la interrupción de la USART, que es donde está el meollo de la cuestión. El programa completo está disponible para descargar en el link que puse antes. El código está comentado, así que me ahorro explicarlo.

Si necesitáis algo más, no tenéis más que decirlo.

Código: C
  1. /************************************************************************
  2. *  Interrupción RDA: dato recibido por la USART                         *
  3. *  Esta interrupción se activa cada vez que se recibe un dato en la     *
  4. *  USART. Mediante el control de una máquina de estados se determina    *
  5. *  la validez y el significado del dato recibido, y se obra en          *
  6. *  consecuencia.                                                        *
  7. ************************************************************************/
  8.  
  9. #int_rda
  10. void Dato_Recibido_USART(void)
  11. {
  12.         while (RCIF) // ejecutamos mientras haya un dato pendiente de procesar
  13.         {
  14.          // Hacemos una copia del registro RCSTA porque sus bits cambian de valor
  15.          // al leer RCREG y modificar CREN
  16.          Copia_RCSTA.registro = RCSTA;
  17.  
  18.          // En RCREG está el dato que acaba de recibir la USART
  19.          DatoRX = RCREG;
  20.  
  21.          // Si se reciben más de 3 bytes sin haberlos procesado, se produce un error
  22.          // de Overrun. En este caso, se borra el error reiniciando CREN y dejamos
  23.          // la interrupción preparada para procesar la siguiente trama DMX
  24.          if (Copia_RCSTA.bits.OERR)
  25.          {
  26.            CREN=0;
  27.            CREN=1;
  28.            DMX_Estado = DMX_ESPERA_BYTE;
  29.            return;
  30.          }
  31.  
  32.          // Máquina de estados
  33.          switch (DMX_Estado)
  34.          {
  35.            case DMX_ESPERA_BYTE:        // si estamos en este estado y hay error FRAME
  36.                 // es que nos ha pillado en medio de un Byte. Hay que seguir esperando
  37.                 // hasta que desaparezca el error.
  38.              if (!Copia_RCSTA.bits.FERR)
  39.                                 // Ha llegado un byte. Ahora esperaremos la señal Break
  40.                DMX_Estado = DMX_ESPERA_BREAK;
  41.              break;
  42.  
  43.  
  44.            case DMX_ESPERA_BREAK:       // estamos esperando la señal Break
  45.              // Esta señal se identifica porque aparece el error de Frame
  46.              if (Copia_RCSTA.bits.FERR)
  47.                // Tras recibir el error de Break, hay que esperar un byte de valor 0
  48.                if (!DatoRX)
  49.                  DMX_Estado = DMX_ESPERA_START;
  50.              break;
  51.            case DMX_ESPERA_START: // ya hemos recibido el Break y ahora hay que
  52.                  // esperar un Byte con valor 0, que será la señal de Start
  53.              // Mientras tanto, si recibimos un error de Frame, hay que volver a
  54.              // empezar para recibir la señal de comienzo de trama.
  55.              if (Copia_RCSTA.bits.FERR)
  56.                  DMX_Estado = DMX_ESPERA_BYTE;
  57.              else {
  58.                if (!DatoRX)
  59.                {
  60.                  // Llegados a este punto, ya hemos recibido el Byte Start=0
  61.                  // y comenzamos la trama de valores DMX.
  62.                  DMX_Indice = 0;
  63.                  DMX_Estado = DMX_RECEPCION_DATOS;
  64.                } else
  65.             // Si el dato recibido no es 0, volvemos a empezar
  66.                  DMX_Estado = DMX_ESPERA_BREAK;
  67.              }
  68.              break;
  69.            case DMX_RECEPCION_DATOS:
  70.              // En este estado estamos recibiendo la trama de datos DMX
  71.         // Si se detecta un error de Frame es que ha habido un error y estamos
  72.         // al principio
  73.              if (Copia_RCSTA.bits.FERR)
  74.                if (!DatoRX)
  75.                  DMX_Estado = DMX_ESPERA_START;
  76.                else
  77.                  DMX_Estado = DMX_ESPERA_BYTE;
  78.              else
  79.              {
  80.                // Almacenamos el dato recibido en nuestro array
  81.                TramaDMX[DMX_Indice++] = DatoRX;
  82.  
  83.                // Si ha llegado al final de la capacidad, cambiamos al estado de espera
  84.           // de nueva trama
  85.                if (DMX_Indice >= TotalCanales)
  86.                  DMX_Estado = DMX_ESPERA_BREAK;
  87.              }
  88.              break;
  89.    }
  90. }
  91. return;
  92. }
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 16 de Diciembre de 2007, 04:03:22
El protocolo DMX es muy utilizado en sistemas de iluminación y efectos especiales para eventos, discotecas, escenarios, ...

Consiste en un sistema de muy fácil instalación, ya que permite encadenar muchos dispositivos esclavos a un cable de sólo 3 hilos:
- DMX+
- DMX-
- GND

La información se divide en 512 canales. Cada canal contiene un byte. Los dispositivos que están conectados al bus, están identificados con uno o más canales, y sólo atenderán a las instrucciones que les lleguen en esos canales. Lo habitual es que un dispositivo utilice varios de ellos, y se identifique físicamente con el código del canal de inicio. De esta manera, si un cabezal proyector utiliza, por ejemplo, 16 canales, y está identificado con el código 128, automáticamente reservará los canales 128 a 143 para sí mismo.

La información se transmite siguiendo este diagrama de tiempos:
(http://www.theater-technisch-lab.nl/dmxsign.gif)

Como se observa, la trama completa tiene varias partes:
- señal BREAK: es un nivel bajo con un mínimo de 88us
- marca tras BREAK: nivel alto con un mínimo de 8us
- byte Start: el byte Start siempre vale 0
- tiempo entre bytes: es un nivel alto que puede llegar hasta 1 s
- trama de 512 bytes: aquí aparecen los datos de los 512 canales

Cada byte se transmite con:
- un bit de start a nivel bajo
- los 8 bits de datos
- dos bits de stop a nivel alto

De esta manera, algunas consideraciones de tiempo respecto al protocolo son las siguientes:
- duración mínima para una trama completa: 22,7ms
- máxima velocidad de refresco de la información: 44 veces por segundo
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 16 de Diciembre de 2007, 04:30:03
Obviamente, para la realización del proyecto, es conveniente contar con un emisor DMX para las pruebas. En mi caso no me comí mucho el coco y busqué algo que fuera simple y que ya estuviera hecho.

Encontré esta web www.freedmx.com y monté su proyecto Manolator 256 (sí, el autor también se llama Manolo y ha tenido los santos cojones de llamar Manolator a su proyecto  :D )
El Manolator 256 es un circuito sencillo, basado en un PIC 16F88 y un MAX485 que se conectan al puerto paralelo y nos generan las señales adecuadas:
(http://www.freedmx.com/Magnulator_archivos/image008.jpg)

Es una interface bastante estandarizada y se encuentra disponible en muchas aplicaciones comerciales y gratuitas. Por cierto, hay verdaderas virguerías en interfaces para DMX; recomiendo echar un vistazo a este link: MORE (http://www.freedmx.com/MORE!.htm)

Yo preferí utilizar esta, porque es simple pero perfectamente válida, y es la que se observa en el vídeo:
(http://www.freedmx.com/MORE!_archivos/image005.jpg)

Hay alguna que enamora:
(http://www.freedmx.com/MORE!_archivos/image010.jpg)

Y sin duda la más potente y recomendable para usos complejos: FreeStyler (http://www.freestylerdmx.be/)
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 18 de Diciembre de 2007, 17:20:01
Hola Manolo!
Estoy compilando el Receptor com el Mplab y CCS y claro use el Asistente para eso pero me da este error donde yo pensba que era el
 setup_mplab_plugin la cual lo instale, yo uso la Version CCS 4,58  aqui te pongo lo que me sale
Clean: Deleting intermediary and output files.
Clean Warning: File "C:\Manolo_receptor\ReceptorDMX.o" doesn't exist.
Clean: Deleted file "ReceptorDMX.ERR".
Clean: Deleted file "C:\Manolo_receptor\ReceptorDMX.mcs".
Clean: Done.
Executing: "C:\Programme\Microchip\Third Party\PICC\CCSC.EXE" +FH "ReceptorDMX.c" +DF +LN +T +A +M +Z +Y=9 +EA
Error: The selected compiler: "PCH" is not installed on this PC
Halting build on first failure as requested.
BUILD FAILED: Tue Dec 18 20:55:13 2007

una ayudita se agradece  :mrgreen:
Título: Re: Receptor DMX (DMX512)
Publicado por: Duende_Azul en 18 de Diciembre de 2007, 19:47:34
Revisa si tienes bien asignada la ruta al ejecutable del compilador en "Project/set language tool locations"
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 19 de Diciembre de 2007, 02:16:29
Revisa si tienes bien asignada la ruta al ejecutable del compilador en "Project/set language tool locations"
Gracias Amigo Duende_azul!
he estado mirando y probando y nada!en Project/Set Language tengo la opcion CCS C Compilier for Pic etc,etc aqui me salen todos Tipo de Soportes, siendo asi cuando los compilo con CCS solo no me da ningun Error :5] Quizas sea algo que no he visto en la Configuracion Tools?
Clean: Deleting intermediary and output files.
Clean: Done.
Executing: "C:\Programme\Microchip\Third Party\PICC\CCSC.EXE" +FH "ReceptorDMX.c" +DF +LN +T +A +M +Z +Y=9 +EA
Error: The selected compiler: "PCH" is not installed on this PC
Halting build on first failure as requested.
BUILD FAILED: Wed Dec 19 06:18:39 2007
ya no se donde buscar  :8} :8} :8}

Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 19 de Diciembre de 2007, 02:37:28
Todavía no ha salido ninguna versión de CCS mejor que la 3.249, así que compila con ella y verás como va fino, fino.
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 19 de Diciembre de 2007, 03:38:43
Todavía no ha salido ninguna versión de CCS mejor que la 3.249, así que compila con ella y verás como va fino, fino.

Gracias manolo por tu respuesta! que rapido reacionan qui  :D :D
bien buscando en el Baul de mis recuerdo de mi otras pc :D encontre esta version, pero ya ni se como funciona :shock:
claro es que como es vieja me pide la version 6.00 de Mplab, siendo asi cuando activo el Mplab no me aprece en el Tools de lenguaje ninguna Version de CCS  :shock: :shock: osea que esta licencia de CCS son tremenda   :D :D con tantas que me han mandados el Soport de CCS y debo instalar una vieja para esto :D :D :D :D
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 19 de Diciembre de 2007, 07:38:14
 :-/ :-/ :-/ :-/ Manolo ahora si que me Compila :-/ :-/ mira


Clean: Deleting intermediary and output files.
Clean: Deleted file "C:\Manolo_receptor\ReceptorDMX.mcs".
Clean: Done.
Executing: "C:\ARCHIV~1\PICC\CCSC.EXE" "ReceptorDMX.c" +FH +DF +LN +T -A +M +Z +Y=9 +EA
>>> Warning 208 "ReceptorDMX.c" Line 160(205,223): Function not void and does not return a value  MultiplexaDisplays
>>> Warning 203 "ReceptorDMX.c" Line 420(1,1): Condition always TRUE
      Memory usage:   ROM=5%      RAM=27% - 28%
      0 Errors,  2 Warnings.
Loaded C:\Manolo_receptor\ReceptorDMX.cof.
BUILD SUCCEEDED: Wed Dec 19 11:34:23 2007
 :-/ :-/
pero con la version nueva :D :D y mi otras PC :D :D
 :D :D
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 19 de Diciembre de 2007, 08:43:25
Ea, pues ya sólo falta que nos pongas las fotos de tu cacharro
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 19 de Diciembre de 2007, 08:59:16
Ea, pues ya sólo falta que nos pongas las fotos de tu cacharro
Sorry manolo!
yo solo queria saber si me compilaba tu programa y asi saber la configuracion en CCS, no sea abusador  :D :D que eso son solos uns pasos.
Una pregunta? yo no tengo el 18F2550 en mi baul de los recuerdos  :D pero tengo estos 16f870,16f628,16f876,18f248 el 16f84A lo decarto :mrgreen: Dime por favor cual hiria bien para estos ante de poner a buscar? ya que el 18F2550 no se comparan en ninguno de los que tengo. 8)
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 19 de Diciembre de 2007, 09:12:41
Cualquiera que tenga 28 pines te servirá. Realmente el programa utiliza muy pocos recursos: sólo la interrupción del timer y la de la usart.
Tendrás que adaptar algunas cosas, porque está pensado para usar oscilador interno a 8MHz, pero seguro que lo consigues fácilmente.
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 19 de Diciembre de 2007, 14:46:49
Cualquiera que tenga 28 pines te servirá. Realmente el programa utiliza muy pocos recursos: sólo la interrupción del timer y la de la usart.
Tendrás que adaptar algunas cosas, porque está pensado para usar oscilador interno a 8MHz, pero seguro que lo consigues fácilmente.
Gracias Manolo!
Pero me lo veo complicado para mi ya que empiezo en CCS, yo todavia no lo veo claro la USART, y ya comente en algun Tema del Sr Diego
sobre diferente protocologo Serial, que muchos Forero y amigos entra aqui preguntando y se quedan igual porque veo no se parte de una Base de como implementarlo paso por paso, encender y apagar un Led es facil dificil seria enviar eso datos via Serial. mis amigos Forero que tengo en mi lista ya me pregunta! y tu comprende la USART? digo no! y tu tampoco! esas son las respuesta!
yo quiero aprender en CCS  :-/ :-/ y nadie se atreve  :-/ :-/ :-/ :-/
Título: Re: Receptor DMX (DMX512)
Publicado por: Marttyn en 29 de Diciembre de 2007, 20:35:10
si te digo la verdad, estaba pensando en gastarme un dineral en una mesa de iluminacion... pero visto todo esto, me parece que lo invertire en otra cosa... la verdad que es una pasada!!! con lo que a mi me gustaria llegar a mis actuaciones con un portatil y poder manejar videoproyecciones, audio y luz todo desde alli... un verdadero sueño! y cada vez veo que se hace mas realidad... ya tenia las videoproyecciones y parte del sonido controladas desde el, ahora intentare tambien la luz.
el unico problema que veo por ahora es el puerto paralelo. mi portatil o es muy moderno o es una mierda, pero no lo trae. ya me tocaba la moral el no poder usar mi programador de pics, pero ahora me va a incordiar bastante mas! todo esto se podra adaptar a usb?
me gustaria saber, si no es mucho preguntar, por que se intereso nuestro amigo manolo en la interface dmx? acaso es el productor musical de camela? o dedica el tiempo libre a tocar con un coro eclesiastico satanico?  :D
sea como sea, cosa que a el le interesa, a mi tambien me interesa!.... leds rgb, libreria para display de 7 seg, dmx... manolo, el dia que hagas un proyecto con servos, sabes que tambien estare ahi, no?  :mrgreen:
salu2
Título: Re: Receptor DMX (DMX512)
Publicado por: poseidon20 en 29 de Diciembre de 2007, 21:05:36
Muy buene trabajo Manolo, pero ahora tengos un cerro de dudas(quien te madna a entrarle al DMX512  :D :D). Comencemos por una basica ¿como sabe cada dispositivo que valor le corresponde  acada uno?. Por que en ningun lado veo que la trama diga adress byte, algo asi como I2C, solo veo que mandas los byte de control pero ¿la direccion?. Esa es mi primera duda.
Título: Re: Receptor DMX (DMX512)
Publicado por: poseidon20 en 29 de Diciembre de 2007, 23:46:00
JCC40, gracias por la respuesta. Lo que entendi es que, el receptor debe saber la posicion del byte dentro de las tramas sucesivas. Es decir el Byte 1 es para el receptor 1, el byte 2 es para el receptor 2 y asi hasta 512, Es asi o me equivoco?
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 30 de Diciembre de 2007, 02:14:38
si te digo la verdad, estaba pensando en gastarme un dineral en una mesa de iluminacion... pero visto todo esto, me parece que lo invertire en otra cosa... la verdad que es una pasada!!! con lo que a mi me gustaria llegar a mis actuaciones con un portatil y poder manejar videoproyecciones, audio y luz todo desde alli... un verdadero sueño! y cada vez veo que se hace mas realidad... ya tenia las videoproyecciones y parte del sonido controladas desde el, ahora intentare tambien la luz.
el unico problema que veo por ahora es el puerto paralelo. mi portatil o es muy moderno o es una mierda, pero no lo trae. ya me tocaba la moral el no poder usar mi programador de pics, pero ahora me va a incordiar bastante mas! todo esto se podra adaptar a usb?
me gustaria saber, si no es mucho preguntar, por que se intereso nuestro amigo manolo en la interface dmx? acaso es el productor musical de camela? o dedica el tiempo libre a tocar con un coro eclesiastico satanico?  :D
sea como sea, cosa que a el le interesa, a mi tambien me interesa!.... leds rgb, libreria para display de 7 seg, dmx... manolo, el dia que hagas un proyecto con servos, sabes que tambien estare ahi, no?  :mrgreen:
salu2
Hola amigo Marttyn!
Püerto paralelo para ese projecto de manolo debe tenerlo, pero si busca en Google sobre DMX USB encontrara diversos, claro es que con microchip hay muy poco que tenga muchas ventanjas, la ventajas es! que la mayoria baratos solo transmite Señales DMX, sin embargo yo uso uno este
http://www.todopic.com.ar/foros/index.php?topic=18862.20  que me hice 2, con la ventaja que puedo usar 1024 canales, claro mientras mas modulo tenga de este tipo mas canales puede usar ya que cada modulo llevan su unica direcion USB preprogramada  :lol: este modulo , por degracia hasta ahora no he visto con pic un modulo como este aqui te dejo uno con pic http://www.usbdmx.com/usb_dmx_interface.html lee y mira la diferencia de los dos,
ahora bien mi amigo manolo hizo este projecto porque yo lo motive muchos   :D :D dandole la Lata :D :D y gracia a Manolo se despierta el interes a muchos Foreros de aqui que no solo quieran Comandar luces sino un sin fin de Periferico a larga Distancia inclusive Dmx Wireless



Bien Como dice el amigo JCC40 la direcion no existe sino que son 512 canales de envio y pensar que son 2 Modulos para esta operacion donde el recibidor preprogramado para recibir solo los canales que se necesita para operar con el, Ej. un Dimmer de 6 canales o mas o un Movie Light que pueda ocupar X cantidad de canales etc.
y dando contesta a la Pregunta del Amigo Poseidon20,
Es decir el Byte 1 es para el receptor 1, el byte 2 es para el receptor 2 y asi hasta 512, Es asi o me equivoco?
El receptor tu lo programa para recibir la trama que te interesa o canales que te interesa recibir como explique yo arriba
Normalmente cuando se programa un Receptor se usa un DIP SWICHT para direcional los canales que quiera usar para tu operacion, donde puede Seleccionar este entre 1channel y 512channel,

Título: Re: Receptor DMX (DMX512)
Publicado por: poseidon20 en 30 de Diciembre de 2007, 03:55:39
Muchas Gracias STK500 por la explicacion, ahora me esta entrando mas ganas de hecharle una mano a esto de los DMX512, ummmm.  :D :D :D. Si sigo asi me va a faltar manos para todo lo que quiero hacer  :D :D :D :D
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 30 de Diciembre de 2007, 04:15:03
Me alegro que os haya picado el gusanillo con este proyecto. También me alegro que a mí me picase el gusanillo Rafael con el mismo, porque me he divertido mucho montándolo y porque he adquirido una experiencia que espero sea útil en el futuro.

Marttyn, si lo que quieres es lo que me imagino, este es tu protocolo. Y claro, con servos también podrás usarlo.
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 30 de Diciembre de 2007, 04:17:02
Muchas Gracias STK500 por la explicacion, ahora me esta entrando mas ganas de hecharle una mano a esto de los DMX512, ummmm.  :D :D :D. Si sigo asi me va a faltar manos para todo lo que quiero hacer  :D :D :D :D
:D :D Te lo creo Amigo ! :D :D
ese es mi trabajo de cada dia amigo, tanto en sonido,luces y efectos especiale que me encargan, pero por desgracia debo comprar los modulo ya hecho
y nunca tengo tiempo para programar, con decirte mi ultimo projecto en un Estudio de Television aqui en Alemania que se llama VIVA-1 fue hacer
un Podium con plataforma de plastico, donde meti 4 Neon .Azul,Verde,Rojo y Blanco y asi hacer una gamas de mas de 1500 Colores, la idea fue del Realizador y yo hice todos el conecionado, los modulo Recibidores vienen en 4channel direcionable cada uno y montamos 60 modulo en una plataforma de 10Metro x 8Metro, eso fue algo muy lindo ver el Colorido ecenico con su variante, ahora yo te recomiendo que te haga el Manolator para experimentar ya que es muy facil de hacer, claro esta que los canales son limitado a 256, leete como se monta, el prototipo de Recibidor que nuestros amigo Manolo aqui nos presenta es un Monitor que asi puede ver la funcion de casa canales independiente.
otras Informacion que quiero poner aqui es, que cada fabricante que Diseña un aparato para recibir Señales DMX lo hace ocupando diferente canales con diferente funcion por canales, pues imaginaste, un canal para controlar un motor, segundo canale para la direcion del motor y mas canales etc funcion que tu lo preprograma, en la Web encontrara una gran cantidad de aparatos DMX con muchas utilidades, dale un vistazo y vera los bellos que es el mundo DMX.
Título: Re: Receptor DMX (DMX512)
Publicado por: poseidon20 en 30 de Diciembre de 2007, 19:19:51
asi es asmigo STK500, es algo que tambien me inquieta eso de la luminotecnia. Ahora me salto otra duda: Segun e visto la trama, entre byte y byte se pone un tiempo de espera que sea <=1s, pero lei en una revista que este tiempo no es necesrio ya que frenaria la velocidad o algo asi. Entonces la duda que me entra es ¿La mayoria de equipos que generan la trama, incorporan este tiempo o solo les basta con los 2bits de stop?
Título: Re: Receptor DMX (DMX512)
Publicado por: poseidon20 en 30 de Diciembre de 2007, 20:57:01
 :shock: :shock: :shock: :shock: :shock: :shock:
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 30 de Diciembre de 2007, 22:06:30

Ojalá que así sea. El DMX es uno de esos protocolos "úsese u olvídese". Quiero decir que por ejemplo para los que trabajamos en esto diariamente de forma profesional (como stk500 también) el DMX ya es una forma natural del trabajo, pero si alguien no lo necesita o no trabaja en ello a veces sólo queda el aprendizaje, la curiosidad, pero al final del día se da uno cuenta de que ¡no hay nada que controlar! El campo es amplísimo así ue siempre habrá una aplicación por ahí para encontrarle.


Si, pero lo use o no en el futuro, me he divertido mucho haciéndolo y eso, eso no se olvida aunque no lo use.
Título: Re: Receptor DMX (DMX512)
Publicado por: Marttyn en 31 de Diciembre de 2007, 12:53:59
Marttyn, si lo que quieres es lo que me imagino, este es tu protocolo. Y claro, con servos también podrás usarlo.

no se lo que te imaginas... lo que quiero es poder controlar TODO desde el portatil, y luego memorizar macros con diferentes escenas y musicas para el espectaculo, asi dado el caso podria "disparar" una serie de cosas para cada numero sin tener que contar con un tecnico muy especializado, ya que los juegos de luces, la musica y todo seria casi automatico.

lo que dices de los servos no lo habia pensado... pero la verdad es una GRAN idea!!! como podria hacer un receptor dmx para uno o varios servos?

estuve mirando tu codigo, pero el tema de la usart me parecio chino  :(
bueno, un saludo y a seguir con proyectos interesantes como estos!
Título: Re: Receptor DMX (DMX512)
Publicado por: Marttyn en 31 de Diciembre de 2007, 13:04:19
por cierto, en ebay (http://cgi.ebay.es/USB2DMX-JMS-USB-Interface-para-512-DMX-canales-para-PC_W0QQitemZ150198902474QQihZ005QQcategoryZ4785QQssPageNameZWDVWQQrdZ1QQcmdZViewItem) vi un controlador dmx usb por unos 70€ muy similar a este (http://www.dj-online.co.uk/acatalog/Afterglow_Magic.html) y la verdad no se si me valdra la pena comprarlo hecho, porque estuve buscando alguno para hacer, y si bien no puede ser muy dificil, o no te permiten 512 canales, sino la mitad o menos, y los que te dan todos los canales no te de el firmware para el micro, hay que comprarles el micro ya programado.... con lo cual, a fin de cuentas terminas gastando al menos la mitad de lo que cuesta uno hecho, y sin garantias de que vaya a funcionar...
por cierto... lo que veo mucho es que algunos tienen las lineas "optoisolated" (so sabria dar una traduccion fidedigna a eso  :mrgreen:). es realmente importante que este aislado mi puerto usb? puede ocurrirle algo? no veo que puede fallar para que reciba una descarga
salu2
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 31 de Diciembre de 2007, 14:48:24
Hola amigo Martyyn!
Veo que no ha leido todas las respuesta de estos mensaje!
en ellos se describe todos!
con ese dinero que invierte te podria comprar un programador hecho y hacerte un USB DMX, la pagina que te puse funciona todas y los Code Assembler, y si lee en mis projecto sabra muchos mas cosas ante que invierta dinero.
http://www.todopic.com.ar/foros/index.php?topic=18862.0
Feliz años nuevos 2008
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 31 de Diciembre de 2007, 15:00:52
Si tienes prisa por tenerlo hecho y probarlo, y no quieres perder mucho tiempo en montártelo tú mismo, a mí me parece una buena elección comprarlo por ese dinero. Realmente me parece barato.
Si no, cualquier opción de las que te indica Rafael es buena. Están superprobadas y te van a funcionar seguro.

No sé si será una traducción correcta para "Optoisolated" pero yo diría que significa "optoaislado" u "optoacoplado". En definitiva, significa que si hubiera una derivación eléctrica al bus desde un dispositivo, este no se vería afectado porque la señal pasa por optoacopladores que sólo permiten el paso de la información, pero no de la electricidad.
Título: Re: Receptor DMX (DMX512)
Publicado por: dakman en 04 de Enero de 2008, 15:41:47
conoceis algun otro interface de PC  a  DMX mediante el usb?  No soy capaz de encontrar los integrados de www.usbdmx.com :(
muchas gracias. y feliz año
Título: Re: Receptor DMX (DMX512)
Publicado por: Marttyn en 04 de Enero de 2008, 16:54:57
yo personalmente veo que por el precio y el trabajo que me dara, mejor lo compro hecho, estando probado, acabado profesional y con software y todo... por unos 70€ ya lo hay, con envio incluido. yo lo busque en ebay, pones "usb dmx" y en las preferencias de busqueda pon que quieres buscar en articulos de todo el mundo. te lo envian de alemania.
ahora... si lo quieres como aficionado, y como proyecto, puede ser interesante y aprenderas cosas...
salu2
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 06 de Enero de 2008, 09:13:53
yo personalmente veo que por el precio y el trabajo que me dara, mejor lo compro hecho, estando probado, acabado profesional y con software y todo... por unos 70€ ya lo hay, con envio incluido. yo lo busque en ebay, pones "usb dmx" y en las preferencias de busqueda pon que quieres buscar en articulos de todo el mundo. te lo envian de alemania.
ahora... si lo quieres como aficionado, y como proyecto, puede ser interesante y aprenderas cosas...
salu2
Hola marttyn!
OK Marttyn pero piensa la compartibidad con los Software porque no todos van, el ART NET es el mas standard profesional,
aqui te dejo un Super alucinannte efectos  vale la pena verlo DEMO soft para que vea la posibilidad
http://www.innovateshowcontrols.com/tutorial/sniffer_content.html
Título: Re: Receptor DMX (DMX512)
Publicado por: poseidon20 en 06 de Enero de 2008, 19:43:37
Ese video que pusisted STK500, es muy bueno. Cada vez esta comenzando a llamar mas mi atencion en esto de  los DMX512  :D :D
Título: Re: Receptor DMX (DMX512)
Publicado por: J1M en 15 de Enero de 2008, 11:40:10
Aquí una de esas cosas 'que se puede hacer' y que gracias a ejemplos como los que nos propone Manolo se nos hace más fácil pensar en 'el como hacerlo' ;)

http://forums.parallax.com/forums/default.aspx?f=25&p=1&m=236431

Título: Re: Receptor DMX (DMX512)
Publicado por: Marttyn en 20 de Enero de 2008, 21:13:42
buenisimo!
la verdad que me parece una idea genial para algo que tengo en mente...
me gustaria hacer algo asi, pero mas reducido... por ejemplo, 2 columnas de 10 leds rgb cada una... pero claro, cada led rgb necesita 3 pines del micro.., es decir 30 pines para 10 leds  :shock:
es la unica menera de conseguirlo? y sobre todo, necesitare generar 30 PWM... es eso posible con algun PIC 16?
salu2
Título: Re: Receptor DMX (DMX512)
Publicado por: JCC40 en 20 de Enero de 2008, 21:22:06
Citar
pero claro, cada led rgb necesita 3 pines del micro.., es decir 30 pines para 10 leds 
es la unica menera de conseguirlo? y sobre todo, necesitare generar 30 PWM... es eso posible con algun PIC 16?

Si utilizas drivers para leds sólo ocupas tres pines (DATA, CLOCK, y LATCH) independientemente del número de leds que vayas a manejar. El PWM lo haces pero en software volcando en cada actualización los valores para todos los leds. Con un PIC 16 es más que suficiente.

Aquí te muestro 216 leds, pero siguen siendo sólo 3 pines.

(http://www.geocities.com/jcarlosmor/temporal/rota1.JPG)

Título: Re: Receptor DMX (DMX512)
Publicado por: todopic en 20 de Enero de 2008, 22:20:47
Hola Amigos!, para los que le interese la lectura DMX pero en ensamblador, pueden mirar aquí http://www.todopic.com.ar/foros/index.php?topic=12494.0 (http://www.todopic.com.ar/foros/index.php?topic=12494.0)
está probado y actualmente lo estoy empleando... normalmente, la consola de sonido y luces esta a unos 30 metros del escenario, y las maquinas de humo que tengo, no son DMX (y estan en el escenario) , asi que las adapté, y las disparo de la misma consola de luces,....  ahora una pregunta, o necesidad, que realmente no se si existe en el mercado...  hay algun dispositivo, que "reuna" 2 o mas señales DMX, y obtener una unica salida?
Les digo esto, porque actualmente empleo 3 lineas DMX, y que es engorroso por el cableado ( a veces empleo canales disponibles de la manguera de microfonos o envios de audio)
La idea seria leer cada dato, almacenarlos en memoria, verificando que sean distintas direcciones (logicamente) para luego "retransmitirlas" por una sola salida...
lo que no sé, es como "sincronizar" las velocidades... creo que necesitaria un dspic  :?

Un abrazo

Norberto
Título: Re: Receptor DMX (DMX512)
Publicado por: Marttyn en 20 de Enero de 2008, 23:39:40
Si utilizas drivers para leds sólo ocupas tres pines (DATA, CLOCK, y LATCH) independientemente del número de leds que vayas a manejar. El PWM lo haces pero en software volcando en cada actualización los valores para todos los leds. Con un PIC 16 es más que suficiente.

a que te refieres con drivers para leds? nunca use uno de esos, son integrados que se encangan del PWM de cada led? los hay para RGB? o es indiferente?
salu2 y gracias por la info!
Título: Re: Receptor DMX (DMX512)
Publicado por: JCC40 en 21 de Enero de 2008, 00:32:33
Citar
a que te refieres con drivers para leds? nunca use uno de esos, son integrados que se encangan del PWM de cada led? los hay para RGB? o es indiferente?
salu2 y gracias por la info!

 
En efecto son circuitos integrados que tienen entradas a nivel lógico con funcionamiento serial y salidas paralelas de corriente constante independientemente del voltaje (generalmente desde 3 V hasta 17 V). Estos circuitos no se encargan del PWM de cada led, eso lo tiene que hacer uno, aunque claro si utilizas la entrada OE con una señal PWM harás el mismo efecto pero en todos los leds (generlamente vienen para 8 y 16 canales). Es indiferente para qué tipos de leds los uses, ya que por ejemplo para asignar una corriente constante en las 16 salidas lo haces con una simple resistencia a 1/8 de watt. No importa si tienes leds rojos, verdes, azules, blancos, etc. la corriente que asignes ésa será independientemente de la caída del voltaje de los leds.
 
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 21 de Enero de 2008, 03:43:57
Jefe, yo creo que con un 18F daría para hacer esa aplicación.

Lo que tengo dudas es cómo funciona. Si en un canal determinado aparece un dato en un universo, y en el mismo canal, pero en otro universo aparece otro dato, ¿con cual te quedas?

Al fin y al cabo, todos los canales aparecen siempre con dato, aunque sea 0.
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 21 de Enero de 2008, 03:49:00
Pues suena interesante.
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 21 de Enero de 2008, 09:15:10
Hola  :lol: mira esta pagina los productos y asi sabra lo que es el DMX Merger  :mrgreen:
http://www.enttec.com/index.php?main_menu=Products&prod=70014&show=description&name=dmxplaybackmk2
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 21 de Enero de 2008, 09:21:28
Pues sí que se cotizan caros. Dan ganas de montarlos y ponerlos a la venta, macho.
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 22 de Enero de 2008, 04:37:08
Hola Amigos!, para los que le interese la lectura DMX pero en ensamblador, pueden mirar aquí http://www.todopic.com.ar/foros/index.php?topic=12494.0 (http://www.todopic.com.ar/foros/index.php?topic=12494.0)
está probado y actualmente lo estoy empleando... normalmente, la consola de sonido y luces esta a unos 30 metros del escenario, y las maquinas de humo que tengo, no son DMX (y estan en el escenario) , asi que las adapté, y las disparo de la misma consola de luces,....  ahora una pregunta, o necesidad, que realmente no se si existe en el mercado...  hay algun dispositivo, que "reuna" 2 o mas señales DMX, y obtener una unica salida?
Les digo esto, porque actualmente empleo 3 lineas DMX, y que es engorroso por el cableado ( a veces empleo canales disponibles de la manguera de microfonos o envios de audio)
La idea seria leer cada dato, almacenarlos en memoria, verificando que sean distintas direcciones (logicamente) para luego "retransmitirlas" por una sola salida...
lo que no sé, es como "sincronizar" las velocidades... creo que necesitaria un dspic  :?

Un abrazo

Norberto

Hola Amigo Norberto!
creo que una vez te comente de que construya el USB DMX que yo uso, ya que con diferente modulo de esto puede tener varios Universos
en la Web ya hay muchos Software que trabajan con este DMX USB, creeme van de maravillas yo ya uso 1024 canales con 2 modulo que me hice :lol:
asi tendria mas canales siempre y cuando use una Laptop o pc, si quiere te envio el MCU programado y probados y tu hace la platina con los demas componente, asi que ya sabe y no me llore mas  :D :D :D :D :D
un saludo amigo Norbe

Título: Re: Receptor DMX (DMX512)
Publicado por: todopic en 22 de Enero de 2008, 15:38:33
Hola Amigos!, vamos por partes dijo Jack..

Ok JCC40, realmente no sabia que existía, o cual era su nombre...
No sabia de la existencia de memorias de doble puerto  :shock:
Ahora tengo por donde buscar...  :mrgreen:


Manolo (Nocturno), si que lo veo interesante, y considero que no tendria que haber errores, ya que normalmente las consolas y equipos sonprogramables, asi que puedo setear desde que canales controlar en cada consola, y el circuito MERGER, leeria una de las entradas primero, almacenando los datos, hasta un valor determinado (seteable), y luego, detectar el comienzo de la trama de la otra entrada DMX (con lo cual ya alli tenemos diferencias de sincronismo), y tambien ir almacenando los datos...
Luego tendria que ir barriendo los datos de la memoria (que quedaron reordenados segun el canal) y generar la nueva trama de datos DMX
Considero que si se realiza en 3 partes, si bien habria una pequeña diferencia entre el comando de entrada, y cuando se ejecuta, no seria muy notable...

Como ejemplo, dispongo de unos cambiadores de color o bañadores Icolor 3000
(http://www.soundivision.com.au/files/ic-3000.jpg)
que ya disponen de una pequeña consolita controladora para asignar directamente 9 colores predefinidos, y otras funciones
Otra para controlar luces robotizadas , y la tercera para las par54 (tachos de 1000w)

Rafael (Stk500) , está interesante el grabador de escenas!
(http://www.enttec.com/img/dmxplayback_mk2/frontangle_small.gif)

Con respecto al controlador USB, le tengo muchas ganas!!!!, ya que las nuevas personales, no traen ni puerto paralelo  :5], ni serie  :8}
No me queda otra que actualizarme!  :D
Citar
si quiere te envio el MCU programado y probados y tu hace la platina con los demas componente, asi que ya sabe y no me llore mas
:D :D :D ok a tu gentil propuesta!!!! ja ja, trataremos de no lorar más, y aprender a usar el freestyler
Voy a tratar de conseguir los componentes y te aviso ok?

Un gran abrazo a todos!

Norberto

Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 22 de Enero de 2008, 16:04:33
Si usamos el mismo esquema que en mi ReceptorDMX con un PIC18F que tenga 2 usart es bastante sencillo.
Cada USART levanta una interrupción pero ambas escribirían en el mismo array de 512 bytes.
En cada interrupción ser programará la lógica de escritura en la RAM, de manera que respondan a los criterios discriminatorios que comentaba JCC40.
Mientras tanto, un Timer podría estar escupiendo la trama DMX recompuesta en otra interrupción.
Realmente el protocolo DMX es tan lento para un PIC que le daría tiempo hasta de tomarse unas copitas mientras hace toda esa tarea.
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 04 de Febrero de 2008, 06:06:24
Si usamos el mismo esquema que en mi ReceptorDMX con un PIC18F que tenga 2 usart es bastante sencillo.
Cada USART levanta una interrupción pero ambas escribirían en el mismo array de 512 bytes.
En cada interrupción ser programará la lógica de escritura en la RAM, de manera que respondan a los criterios discriminatorios que comentaba JCC40.
Mientras tanto, un Timer podría estar escupiendo la trama DMX recompuesta en otra interrupción.
Realmente el protocolo DMX es tan lento para un PIC que le daría tiempo hasta de tomarse unas copitas mientras hace toda esa tarea.

Manolo y cual Pic18F tienen 2 Usart    :lol: :lol: :lol:
 :lol: :lol:dame dato
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 04 de Febrero de 2008, 06:22:24
Aquí puedes ver todos los PIC18F, y verás una columna llamada "Digital Communication" en la que observas el nº de puertos USART, MSSP, SPI... que tiene cada PIC.
Por ejemplo, el PIC18F65J10
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 04 de Febrero de 2008, 07:52:21
Aquí puedes ver todos los PIC18F, y verás una columna llamada "Digital Communication" en la que observas el nº de puertos USART, MSSP, SPI... que tiene cada PIC.
Por ejemplo, el PIC18F65J10
por lo que veo todas las Serie TQPF tiene doble USART.... y encontre  18F6720 este manolo donde yo compro y lo pedire que tu dice nos sirve :lol: :lol: :lol: :lol:
para merger   :D :D :D

Título: Re: Receptor DMX (DMX512)
Publicado por: ser64 en 14 de Marzo de 2008, 10:29:30
Muy bueno el proyecto ,ahora una consulta , alguien dispone del programa en assembler,soy principiante y solo aprendi a programar en ese idioma.
Gracias
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 14 de Marzo de 2008, 11:05:10
Es que no existe el programa en ensamblador, porque lo hice en C. Lo que se puede hacer es utilizar el HEX para desensamblarlo, pero dudo que te sirva para algo porque suele ser ininteligible.
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 22 de Marzo de 2008, 03:50:08
Pues bien! amigo Manolo,
yo habia siempre pensado en hacerme una Consola de Comandos DMX512 con Extenciones  :lol: :lol:
y mira lo que encontre por aqui, quizas tu te anime y como puede ver el programa se la desea muchos y muy apetitoso  :D
http://www.batchmaker.de/lsusbdmx512/DMX.htm

mira eso  :-)
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 22 de Marzo de 2008, 04:05:00
¿Pero porqué me enseñas esas cosas?  :?
No seas malo
Título: Re: Receptor DMX (DMX512)
Publicado por: misstreated en 29 de Marzo de 2008, 17:02:13
Hola a todos por  aqui. Queria agradecer al amigo manolo este gran trabajo, que para mi es de lo mas util.

Me gustaria que me ayudarais a compilar y grabar el pic por que en eso estoy un poco pez, os lo agradeceria de corazon porque en verdad estoy bastante interesado en este trabajo.

Gracias por adelantado y saludos a todos
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 29 de Marzo de 2008, 18:18:29
De nada, es un placer que te haya servido.
Si quieres abre un nuevo post en el subforo genérico con tus dudas sobre la programación del PIC, explicando cuáles son los medios de los que dispones, a ver si podemos ayudarte.
Título: Re: Receptor DMX (DMX512)
Publicado por: misstreated en 31 de Marzo de 2008, 13:49:30
Bueno, en lo que estoy un poco "cortito" es en la grabacion del pic, yo en esto a lo que llegue fue a programar el 16f876 de las piccard 2 con el Icprog, pero el 18f2550 no se con van a que programa y programador se hace. estoy seguro que con un poco de ayuda (que sera mucha) sere capaz de hacerlo.

Yo trabajo en el Auditorio de Sevilla y este receptor te aseguro que sera la "envidia"de los compis.

Un saludo y gracias de antemano
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 31 de Marzo de 2008, 13:54:19
Para no cambiar el tema del hilo, dividí tu mensaje donde pedías ayuda sobre programación y lo colgué aquí:
http://www.todopic.com.ar/foros/index.php?topic=21113.0

Algunos compañeros ya están ofreciendo ayuda ahí mismo.
Yo también soy de Sevilla, y me encantará que me invites a verlo funcionando en el Auditorio, eh :D
Título: Re: Receptor DMX (DMX512)
Publicado por: Diegunix en 10 de Mayo de 2008, 13:57:32
Buenas, estoy intentando realizar el receptor dmx. Y me estan surgiendo algunas dudas. Una de las principales. es sobre los transistores que vienen en el esquema.
Resulta que el nombre de esos transistores es BC327 y estos transistores son PNP pero en el esquema vienen con un dibujo de unos NPN.
Otra duda que tengo es el funcionamiento del teclado quiero decir por si pudiera realizar la misma funcion con interruptores o buscar alguno similar de un Telefono Telefonillo o algo asi.
Estas son mis dudas, esque en electronica no esoy muy puesto. Ya he realizado el manolator y funciona muy bien tambien estoy haciendo una interfaz grafica a partir del testit.
Ya os ire mostrando mas cosas sobre mi royecto.
Y espero sus respuestas.
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 10 de Mayo de 2008, 14:34:41
Son unos PNP BC327, aunque es verdad que en el esquema vienen dibujado unos NPN.
El teclado es estándar, seguramente te servirá uno de telefonillos.
También te servirá hacerlo con interruptores, pero seguro que te resulta mucho más cómodo comprar uno estándar en tu tienda de electrónica. Suelen ser muy baratos.
Título: Re: Receptor DMX (DMX512)
Publicado por: Diegunix en 11 de Mayo de 2008, 08:26:02
Muchísimas gracias por la rapidez de tu respuesta, la duda que me queda es cual seria el emisor del transistor y cual el colector.
Supongo que el emisor sera el que viene del display y el colector el que va a GND.

Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 11 de Mayo de 2008, 14:25:48
Correcto, emisor al display y colector a masa.
Título: Re: Receptor DMX (DMX512)
Publicado por: Diegunix en 27 de Mayo de 2008, 12:14:51
Buenas, pues ya he terminado mi aparatito y casi como esperaba no me ha funcionado. Le meto corriente y no hace nada. Creo que el problema se puede deber a las tomas de corriente. Según he entendido en el esquema solo tiene dos entradas de positivo VCC y todos los GND a negativo no?
En el led creo que le llega negativo por todas partes entonces no se podra encender nunca.
Otra duda pero creo que es así el teclado no necesita ningún tipo de corriente no solo las 7 conexiones al PIC.
Haber si me pueden ayudar por que no se que le puede pasar.
Lo ultimo cuando se enciende se tiene que encender el led como poco verdad?
A mi es que no me hace nada.
Un Saludo.
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 27 de Mayo de 2008, 13:43:13
Los dos positivo VCC deben ir unidos, pues es la alimentacion completa del circuitos, con que le envia Señales? que DMX Transmisor usas?
y debe unir todos los negativos GND juntos, el led se ensenderia cuando detecta señales del transmisor, pero el Display se debe ver algo,
si hiciste el esquemas tal como es debe funcionar, quizas y puede ser el transmisor, como pusiste la conecion de los cable de entradas ? ahi puede ser el problema,
Cualquier cosas por aqui estamos
Saludo
Título: Re: Receptor DMX (DMX512)
Publicado por: misstreated en 28 de Mayo de 2008, 04:53:22
Hola,vamos a ver , yo tambien tuve problemas y gracias a  nocturno los solucione. bueno en principio deberias al menos ver parpadear los puntos, por que creo que tienes el mismo problema que yo. los transistores deben de ir a positivo (el colector) y los displais deben de ser de anodo comun. El teclado no lleva ninguna tension, pero las columnas deven de ir con una resistencia (10k-20k) a negativo, son los pines del micro 1, 2 y 3. Estos son los cambios que hice yo y me fue bien. El led no he conseguido que funcione.
Título: Re: Receptor DMX (DMX512)
Publicado por: PACMER en 10 de Enero de 2009, 07:50:05
HOLA NOCTURNO :-)


Este proyecto se podria armar con un 16F874 ? :P


Saludos desde Oaxaca Mexico
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 10 de Enero de 2009, 08:17:32
Tal y como está no, porque hace uso de la EUSART y ese PIC no dispone de ese periférico. Pero seguro que se puede arreglar para hacerlo con una USART normal.
Ánimo.
Título: Re: Receptor DMX (DMX512)
Publicado por: mrlicho en 10 de Junio de 2010, 00:18:12
Hola, qué tal? Soy bastante nuevo en el foro, la verdad está muy bueno tu proyecto Nocturno, y he visto que otros lo han modificado para pics de la serie 16F, yo lo estoy intentando con un 16F628A y no consigo hacerlo andar.

Mi idea, como casi todos los interesados es la de controlar leds rgb. Ya hice programas que utilizan la interrupción de la usart pero de un modo mucho más sencillo, con las funciones putc y getc del compilador ccs, y de ese modo he conseguido controlar "remotamente" los leds, pero claro que quiero hacerlo con dmx.

Las modificaciones que hice sobre el proyecto fueron, eliminar todo lo que no concierne a la interrupicón de la usart, cambiar los valores de los registros por los que corresponden a mi pic, y la cantidad de canales a guardar, sólo necesito 4 o 5, además no alcanza la ram de mi pic para almacenar los 512 valores.

Bueno, perdón por revivir un hilo que está muerto hace más de un año, pero ya se me está complicando mucho jaja. Saludos y desde ya muchas gracias por sus aportes, está muy bueno el foro.
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 10 de Junio de 2010, 03:18:32
La clave está en la USART, porque la EUSART del 18F que utilicé tiene control de errores que se utiliza para saber en qué parte de la trama DMX estamos en cada momento, según los tiempos que tardan en llegar los distintos eventos. Hasta donde sé, la USART del 16F no dispone de esa característica, por lo que tendrás que ver cómo resuelves ese problema.
Título: Re: Receptor DMX (DMX512)
Publicado por: mrlicho en 10 de Junio de 2010, 10:48:08
Si vi, usás el registro de error de frame creo. Pensé que lo tenía al registro porque me compila, además estuve viendo un compañero del foro que lo modificó para el 16F876, por eso pensé que no iba a haber problema, bueno, seguiré quemandome las pestañas y les cuento.

Gracias!
Título: Re: Receptor DMX (DMX512)
Publicado por: mrlicho en 14 de Junio de 2010, 11:20:16
Nocturno, viendo las hojas de datos de el 18F2455 que usaste y la del 16F628A que quiero usar yo, veo que ambos tienen el bit de Framing Error, así que creo que se puede adaptar la rutina para este pic. Además leí la nota de aplicación de MicroChip que explica la máquina de estados y entiendo mejor el programa ahora. Seguiré modificando las diferencias entre los pics y después te comento.

Saludos!
Título: Re: Receptor DMX (DMX512)
Publicado por: mrlicho en 15 de Junio de 2010, 11:37:25
Bueno, no quiero molestar tanto, pero la verdad me está ganando de lo lindo esto... a ver si alguien ve dónde le estoy errando:

Aclaro que el WatchDog está habilitado porque así estaba en el programa de Nocturno, pero no entiendo qué función está cumpliendo aquí...

Donde tengo una duda también es en la definición de la constante TotalCanales, que lo cambié de 512 a 3, sigo el código pero no estoy seguro de que al recibir el tercer canal luego se quede esperando a que reciba los 509 canales restantes sin almacenarlos, y luego esperando por el break, o si directamente espera por el Break. Tengo la duda de que no se desincronice en este punto. Por otro lado, el compañero Tinho lo ha implementado para 12 canales en un 16F876 y realizó la misma modificación en esa constante, y no vi que Nocturno lo corrigiera... Bueno, esa es la duda principal.

Aclaro lo que hace el pic cuando testeo el circuito:

Pasado el segundo de delay que tiene el programa, se enciende el led indicador que está conectado al pin B7 y se encienden también los leds conectados en los pines B4 y B5, correspondientes a los canales DMX 1 y 2, pero independientemente del valor que entrega la consola, pues muevo los 3 potenciometros desde 0 a 255 y no pasa naaadaaa.

Bueno, disculpen lo largo del mensaje, pero así se entiende mejor tal vez. Desde ya: GRACIAS! :)

Código: [Seleccionar]

#include <16F628A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection


#use delay(clock=20000000,RESTART_WDT)             // Utilizo clock de 20MHz porque me facilita la elección exacta del baudrate a 250k y tenia el cristal


/************************************************************************
*                    Registros USART                                    *
************************************************************************/

#byte SPBRG=              0x99         // Registros para el pic 16F628
#byte RCSTA=              0x18         // Aqui se han modificado las direcciones correspondientes para el 628
#byte TXSTA=              0x98     
#byte RCREG=              0x1A     
#byte PIR1=               0x0C     
#byte PIE1=               0x8C     


#bit SPEN=                RCSTA.7     
#bit RX9=                 RCSTA.6   
#bit SREN=                RCSTA.5     
#bit CREN=                RCSTA.4   
#bit ADDEN=               RCSTA.3     
#bit FERR=                RCSTA.2   
#bit OERR=                RCSTA.1     
#bit RX9D=                RCSTA.0     
#bit BRGH=                TXSTA.2   
#bit SYNC=                TXSTA.4       
#bit RCIF=                PIR1.5       
#bit RCIE=                PIE1.5       


/************************************************************************
*                    Estados protocolo DMX                              *
************************************************************************/

#define       DMX_ESPERA_BYTE              0
#define       DMX_ESPERA_BREAK            1
#define       DMX_ESPERA_START            2
#define       DMX_ESPERA_DATO             3
#define       DMX_RECEPCION_DATOS     4


/************************************************************************
*                    Variables globales y constantes                    *
************************************************************************/

//--------------------Se han quitado las variables que no utilizo--------------------------------------

int8 DMX_Estado = DMX_ESPERA_BREAK;                        // Estado de la máquina de estados
int8 DatoRX;                                                                  // Dato genérico recibido en USART
int8 DMX_Indice = 0;                                                      // Apuntador a una posición de la trama DMX

#define TotalCanales          3            // Total canales a almacenar en este caso solo interesan los 3 primeros
int8 TramaDMX[TotalCanales];          // Trama completa de valores DMX

union                                               // Estructura para hacer una copia del registro RCSTA
  {
    unsigned char registro;
    struct {
        unsigned char RX9D:1;
        unsigned char OERR:1;
        unsigned char FERR:1;
        unsigned char ADDEN:1;
        unsigned char CREN:1;
        unsigned char SREN:1;
        unsigned char RX9:1;
        unsigned char SPEN:1;
    } bits ;
  }Copia_RCSTA;


/************************************************************************
*          Interrupción Timer 0:                                        *
************************************************************************/
#int_Timer0
TIMER0_isr()
{
}
/************************************************************************
*  Interrupción RDA: dato recibido por la USART                         *
*  Esta interrupción se activa cada vez que se recibe un dato en la     *
*  USART. Mediante el control de una máquina de estados se determina    *
*  la validez y el significado del dato recibido, y se obra en          *
*  consecuencia.                                                        *
************************************************************************/

//--------La interrupción de la USART no se ha modificado, esta tal cual el receptor de Nocturno----------------
//--------solo cambia el hecho de que TotalCanales vale 3 en lugar de 512----------------------------------------

#int_rda
void Dato_Recibido_USART(void)
{
   while (RCIF) // ejecutamos mientras haya un dato pendiente de procesar
   {
    // Hacemos una copia del registro RCSTA porque sus bits cambian de valor
    // al leer RCREG y modificar CREN
    Copia_RCSTA.registro = RCSTA;

    // En RCREG está el dato que acaba de recibir la USART
    DatoRX = RCREG;

    // Si se reciben más de 3 bytes sin haberlos procesado, se produce un error
    // de Overrun. En este caso, se borra el error reiniciando CREN y dejamos
    // la interrupción preparada para procesar la siguiente trama DMX
    if (Copia_RCSTA.bits.OERR)
    {
      CREN=0;
      CREN=1;
      DMX_Estado = DMX_ESPERA_BYTE;
      return;
    }

    // Máquina de estados
    switch (DMX_Estado)
    {
      case DMX_ESPERA_BYTE:   // si estamos en este estado y hay error FRAME
      // es que nos ha pillado en medio de un Byte. Hay que seguir esperando
      // hasta que desaparezca el error.
        if (!Copia_RCSTA.bits.FERR)
              // Ha llegado un byte. Ahora esperaremos la señal Break
          DMX_Estado = DMX_ESPERA_BREAK;
        break;


      case DMX_ESPERA_BREAK:   // estamos esperando la señal Break
        // Esta señal se identifica porque aparece el error de Frame
        if (Copia_RCSTA.bits.FERR)
          // Tras recibir el error de Break, hay que esperar un byte de valor 0
          if (!DatoRX)
            DMX_Estado = DMX_ESPERA_START;
        break;
      case DMX_ESPERA_START: // ya hemos recibido el Break y ahora hay que
          // esperar un Byte con valor 0, que será la señal de Start
        // Mientras tanto, si recibimos un error de Frame, hay que volver a
        // empezar para recibir la señal de comienzo de trama.
        if (Copia_RCSTA.bits.FERR)
            DMX_Estado = DMX_ESPERA_BYTE;
        else {
          if (!DatoRX)
          {
            // Llegados a este punto, ya hemos recibido el Byte Start=0
            // y comenzamos la trama de valores DMX.
            DMX_Indice = 0;
            DMX_Estado = DMX_RECEPCION_DATOS;
          } else
            // Si el dato recibido no es 0, volvemos a empezar
            DMX_Estado = DMX_ESPERA_BREAK;
        }
        break;
      case DMX_RECEPCION_DATOS:
        // En este estado estamos recibiendo la trama de datos DMX
        // Si se detecta un error de Frame es que ha habido un error y estamos
        // al principio
        if (Copia_RCSTA.bits.FERR)
          if (!DatoRX)
            DMX_Estado = DMX_ESPERA_START;
          else
            DMX_Estado = DMX_ESPERA_BYTE;
        else
        {
          // Almacenamos el dato recibido en nuestro array
          TramaDMX[DMX_Indice++] = DatoRX;

          // Si ha llegado al final de la capacidad, cambiamos al estado de espera
          // de nueva trama
          if (DMX_Indice >= TotalCanales)
            DMX_Estado = DMX_ESPERA_BREAK;
        }
        break;
   }
}
return;
}

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_wdt(WDT_18MS);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(False);
   
   // Activamos las interrupciones de recepción de la USART y del Timer0

   enable_interrupts(INT_RDA);     
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);

   // Configuración de la USART
   
SPBRG=4;          // A 20Mhz el baudrate es 250.000, sale de la tabla de la hoja de datos del 16F628
BRGH=1;           // Seleccionamos high speed
SYNC=0;           // Transmisión asíncrona
SPEN=1;           // Activamos la USART
RX9=1;            // 9 bit para la recepcion
SREN=0;           // Desactiva recepción de un byte
CREN=1;           // Recepción activada
ADDEN=0;          // Desactivada la autodetección de dirección
FERR=0;           // No hay error de frame con 1 se activa
OERR=0;           // No hay error de overrun con 1 se activa


//-----------------------------------------------------------


   delay_ms(1000);            // delay de 1 seg y enciendo un led en el pin B7 para saber que por lo menos está corriendo el programa
   output_high(pin_B7);
   
   while(1) {

           if (TramaDMX[0]>128)output_high(pin_B4);                 // La idea es hacer PWM pero primero quiero recibir la señal DMX exitosamente
                   else output_low(pin_B4);                                    // por eso primero trabajo ON-OFF a la mitad del potenciómetro
           if (TramaDMX[1]>128)output_high(pin_B5);                 
                   else output_low(pin_B5);                                    // Los valores de TramaDMX 0, 1 y 2 deberian corresponderse con los canales 1, 2 y 3
           if (TramaDMX[2]>128)output_high(pin_B6);
                   else output_low(pin_B6);
           
            delay_ms(25);                 // pequeña espera y refresco del Watchdog automático
             }
}
Título: Re: Receptor DMX (DMX512)
Publicado por: mrlicho en 24 de Junio de 2010, 19:20:35
Bueno, finalmente logré hacer funcionar el programa! Mil gracias por el ejemplo Nocturno, la verdad ha sido de una gran utilidad. Paso a comentar que el problema se debía a mi compilador, el código estaba perfecto, reinstalé una versión anterior del ccs y anduvo perfectamente. Recién he recibido la trama DMX, pero aún tengo que terminar el programa para que funcione con pwm, dimmer y flash. Cuando esté terminado lo posteo por si a alguien le sirve.

Saludos!
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 24 de Junio de 2010, 19:23:30
Perfecto, me alegro mucho. Espero verlo publicado, sí.
Título: Re: Receptor DMX (DMX512)
Publicado por: sistemas en 31 de Agosto de 2010, 18:27:45
hola manolo

Exelente trabajo pero he tenido problemas con el registo en MicroPIC me preguntaba si no puedes poner otro link para el codigo fuente y el esquematico. o bie me lo puedadas enviar a key_word@hotmail.com
se te agradece de antemano por semejante aportacion
saludos



Gracias por vuestras palabras. (Akenafab, esas pilas son las que venden en la cadena de supermercados Mercadona, seguro que muchos de mis compatriotas las conocen. Jesús, el conector no lo venden en Mercadona :D)

Ya he subido el código fuente y el esquemático, que podéis descargar aquí: Descargas de ReceptorDMX (http://www.micropic.es/index.php?option=com_remository&Itemid=27&func=select&id=48)

(http://img512.imageshack.us/img512/9342/receptordmxqf9.th.jpg) (http://img512.imageshack.us/my.php?image=receptordmxqf9.jpg)

Del código fuente pegaré aquí sólo la rutina de atención a la interrupción de la USART, que es donde está el meollo de la cuestión. El programa completo está disponible para descargar en el link que puse antes. El código está comentado, así que me ahorro explicarlo.

Si necesitáis algo más, no tenéis más que decirlo.

Código: C
  1. /************************************************************************
  2. *  Interrupción RDA: dato recibido por la USART                         *
  3. *  Esta interrupción se activa cada vez que se recibe un dato en la     *
  4. *  USART. Mediante el control de una máquina de estados se determina    *
  5. *  la validez y el significado del dato recibido, y se obra en          *
  6. *  consecuencia.                                                        *
  7. ************************************************************************/
  8.  
  9. #int_rda
  10. void Dato_Recibido_USART(void)
  11. {
  12.         while (RCIF) // ejecutamos mientras haya un dato pendiente de procesar
  13.         {
  14.          // Hacemos una copia del registro RCSTA porque sus bits cambian de valor
  15.          // al leer RCREG y modificar CREN
  16.          Copia_RCSTA.registro = RCSTA;
  17.  
  18.          // En RCREG está el dato que acaba de recibir la USART
  19.          DatoRX = RCREG;
  20.  
  21.          // Si se reciben más de 3 bytes sin haberlos procesado, se produce un error
  22.          // de Overrun. En este caso, se borra el error reiniciando CREN y dejamos
  23.          // la interrupción preparada para procesar la siguiente trama DMX
  24.          if (Copia_RCSTA.bits.OERR)
  25.          {
  26.            CREN=0;
  27.            CREN=1;
  28.            DMX_Estado = DMX_ESPERA_BYTE;
  29.            return;
  30.          }
  31.  
  32.          // Máquina de estados
  33.          switch (DMX_Estado)
  34.          {
  35.            case DMX_ESPERA_BYTE:        // si estamos en este estado y hay error FRAME
  36.                 // es que nos ha pillado en medio de un Byte. Hay que seguir esperando
  37.                 // hasta que desaparezca el error.
  38.              if (!Copia_RCSTA.bits.FERR)
  39.                                 // Ha llegado un byte. Ahora esperaremos la señal Break
  40.                DMX_Estado = DMX_ESPERA_BREAK;
  41.              break;
  42.  
  43.  
  44.            case DMX_ESPERA_BREAK:       // estamos esperando la señal Break
  45.              // Esta señal se identifica porque aparece el error de Frame
  46.              if (Copia_RCSTA.bits.FERR)
  47.                // Tras recibir el error de Break, hay que esperar un byte de valor 0
  48.                if (!DatoRX)
  49.                  DMX_Estado = DMX_ESPERA_START;
  50.              break;
  51.            case DMX_ESPERA_START: // ya hemos recibido el Break y ahora hay que
  52.                  // esperar un Byte con valor 0, que será la señal de Start
  53.              // Mientras tanto, si recibimos un error de Frame, hay que volver a
  54.              // empezar para recibir la señal de comienzo de trama.
  55.              if (Copia_RCSTA.bits.FERR)
  56.                  DMX_Estado = DMX_ESPERA_BYTE;
  57.              else {
  58.                if (!DatoRX)
  59.                {
  60.                  // Llegados a este punto, ya hemos recibido el Byte Start=0
  61.                  // y comenzamos la trama de valores DMX.
  62.                  DMX_Indice = 0;
  63.                  DMX_Estado = DMX_RECEPCION_DATOS;
  64.                } else
  65.             // Si el dato recibido no es 0, volvemos a empezar
  66.                  DMX_Estado = DMX_ESPERA_BREAK;
  67.              }
  68.              break;
  69.            case DMX_RECEPCION_DATOS:
  70.              // En este estado estamos recibiendo la trama de datos DMX
  71.         // Si se detecta un error de Frame es que ha habido un error y estamos
  72.         // al principio
  73.              if (Copia_RCSTA.bits.FERR)
  74.                if (!DatoRX)
  75.                  DMX_Estado = DMX_ESPERA_START;
  76.                else
  77.                  DMX_Estado = DMX_ESPERA_BYTE;
  78.              else
  79.              {
  80.                // Almacenamos el dato recibido en nuestro array
  81.                TramaDMX[DMX_Indice++] = DatoRX;
  82.  
  83.                // Si ha llegado al final de la capacidad, cambiamos al estado de espera
  84.           // de nueva trama
  85.                if (DMX_Indice >= TotalCanales)
  86.                  DMX_Estado = DMX_ESPERA_BREAK;
  87.              }
  88.              break;
  89.    }
  90. }
  91. return;
  92. }
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 01 de Septiembre de 2010, 01:58:11
Ya estás registrado en MicroPIC. Mira tu correo.
Título: Receptor DMX (DMX512)
Publicado por: PACMER en 25 de Octubre de 2010, 03:46:54
MrLicho si te funciono con el 16F628, es decir ya lo probaste con un controlador DMX, cambia el valor en los displays

Saludos a Todos
Título: Re: Receptor DMX (DMX512)
Publicado por: lagruya en 16 de Abril de 2011, 13:41:19
hola nocturno, hace un tiempo que vengo dandole vueltas al dmx y tu receptor ha sido el detonante  :5] para que me decida, ademas me viene barbaro para familiarizarme con el tema de la transmision serie por pic.

voy al grano, estoy tratando de comprender al detalle el codigo del receptor y se me plantean las siguientes dudas:

1- Estado DMX_ESPERA_BYTE, no comprendo su funcion. ¿Esta relacionado con la situacion del error de overrun? ¿si ocurrio un error de overrun se deja pasar una trama completa de los 512 canales para esperar una señal de  Break? ¿por que no arrancar con el estado DMX_ESPERA_BRAKE?

2- La señal de BREAK no se envia en el formato de USART, por eso se detecta con el error de frame (salta porque el bit stop no esta a "1") mas la confirmacion de que RCREG = 00000000

3- No se espera la señal AFTER BREAK? luego del estado DMX_ESPERA_BRAKE (la de 8 microsegundos), se pasa al estado DMX_ESPERA_START, ¿esto no genera problemas de lecturas?

hasta acá llegue, la verdad es que estoy muy entusiasmado con este tema.

abrazo.
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 18 de Abril de 2011, 02:41:59
Hola lagruya, la verdad es que no recuerdo el protocolo con un nivel de detalle como para poder contestarte, y me pillas de viaje.
Pero en cuanto vuelva a casa y pueda dedicarle un ratito intentaré encontrar la respuesta a tus dudas. Un saludo
Título: Re: Receptor DMX (DMX512)
Publicado por: lagruya en 18 de Abril de 2011, 22:46:26
 :mrgreen: esperare con ansias tu respuesta, desde ya muchas gracias. Mientras tanto le sigo echando el ojo haber que descubro.

saludos.
Título: Re: Receptor DMX (DMX512)
Publicado por: lagruya en 10 de Mayo de 2011, 10:28:26
despues de recorrer una y otra vez el codigo saco las siguientes conclusiones y dudas:


El baud rate es de 250khz esto implicaria que un bit equivale a 4µseg .

La recepcion del noveno bit esta habilitada con lo cual si tenemos en cuenta el bit de stop y el de start tenemos un formato exacto al de datos de DMX con la coincidencia del tiempo tambien (en total 44µseg).

primera duda:

La señal de break en DMX es mayor o igual a 88µseg y menor a 1seg. Esta señal no se adapta al formato de datos de la usart, por eso se la detecta como un error de frame porque el bit STOP es igual a 0 y segun el codigo como DATORX = 0, DMX ESTADO = DMX ESPERA START.
Acá la duda:
BREAK es >= a 88µseg el dato leido (DATORX) junto con el 9no bit mas los de start y stop dan un total de 44µseg, esto implica que el siguiente dato a leer seguira siendo la marca de BREAK y habra otro error de FRAME pero ahora el DMX ESTADO = ESPERA START y en ese caso si FERR = 1 DMX ESTADO pasa a ser DMX ESPERA BYTE, esto seria un circulo visioso.

segunda duda:

CASE DMX ESPERA START: en este caso se saltea la MARK AFTER BREAK y segun el codigo si DATORX = 0,  DMX ESTADO = DMX ESPERA BREAK. Como no se espera la marka AFTER BREAK acá veo otro circulo vicioso, porque la marca AFTER BREAK es distinta de cero, que es lo que se espra en el case DMX ESPERA START.

espero no ser un pesado con estas preguntas, pero es que me resulta muy interesante el  tema, ademas es obvio que el codigo funciona. Es que no me gusta la idea de copiarlo sin comprenderlo.

gracias!
Título: Re: Receptor DMX (DMX512)
Publicado por: Chipcon en 10 de Mayo de 2011, 11:28:10
Saludos lagruya estoy leyendo el tema y creo que tus dudas son de acuerdo al software pero no con el comportamiento del hardware.
Lo que he comprendido del código del amigo nocturno es que lee toda una trama y solo hasta detectar el ultimo byte de la trama entonces inicia el procesamiento.
Entonces el space to break como bien sabes sincroniza una trama este valor es una señal a 0 que tiene un tiempo de 88uS mínimo y típico de 176uS.

Cuando sucede el break la usart detecta el frame error pues no detecto stop bit, entonces ya tenemos detectado el space to break y solo verifica esto con DatoRX == 0 pero la señal no cambia, entonces la usart se queda en ese estado, sin embargo la maquina de estados ya paso a espera start.

Pero solo se iniciara una nueva lectura hasta producir otro start bit; esto sucede hasta terminar mark after break.

Es decir que el siguiente dato que la usart recibe es start code, entonce la maquina de estados pasa a recepción de datos,creo que solo por seguridad con cada nueva recepción verifica si existe un frame error
pero una vez iniciada la trama es muy difícil que se produzca un error en algún byte.

Ya por ultimo por que entonces no se produce otro frame error??.
La usart utiliza un reloj asíncrono, sample bit que se encarga de verificar el estado de cada bit pero esto no es inmediato en cada flanco es decir; que frame error solo ocurre si después de detectar el 9nvo. bit
el siguiente sample bit la señal no paso a '1'

Bueno espero haber ayudado con tus dudas
saludos
 
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 10 de Mayo de 2011, 11:35:30
Efectivamente, no cambia de byte, y por tanto de estado, hasta que la señal sube a 1. Es por ello que al recibir un 1 transcurridos más de 44us levanta el error de frame.
Disculpa que no haya contestado antes; se me olvidó volver a este hilo.
Título: Re: Receptor DMX (DMX512)
Publicado por: lagruya en 10 de Mayo de 2011, 13:41:15
 :cheesy: y se hizo la luz  :cheesy:

el meollo de mi confucion estaba en que no tuve en cuenta el START BIT ya que no hay cambio de flanco no lo encuentra lo que implica que no se produce ninguna nueva recepcion de datos, HASTA que llega la marca AFTER BREAK que su flanco de caida es interpretado como el start bit de una nueva transmision de datos, luego de ese momento tenemos otro DATORX == 0 y ya estamos en condiciones de ir al estado DMX_RECEPCION_DATOS !!!!!!!!!!!!!!!!

Estimado Chipcon, chagracia por la pronta y eficaz respuesta!!!!!!!!!!
Estimado Nocturno: recontra agradecido por la inteligencia empleada en tan util programa!!!!!

saludos!  :mrgreen:
Título: Re: Receptor DMX (DMX512)
Publicado por: chirola83 en 10 de Mayo de 2011, 21:31:25
Hola a todos, primero que nada, un capo el Sr. Nocturno!. Tu codigo y documentacion me ha sido de mucha utilidad y tambien las modificaciones realizadas por mrlicho.

En resumen, aqui esta el resultado de mi implementacion con un PIC16F628, con salida para 9 canales.


Saludos!
Título: Re: Receptor DMX (DMX512)
Publicado por: chirola83 en 10 de Mayo de 2011, 22:18:07
Se que el codigo puede mejorarse, estas son solo pruebas y tal vez a alguien le pueda servir.

(https://lh6.googleusercontent.com/_jcAN7sZk2-0/TcXC3PDw7hI/AAAAAAAACUw/XgJhDLb22I8/s640/DSC00506.JPG)

(https://lh5.googleusercontent.com/_jcAN7sZk2-0/TcXC5FM3e2I/AAAAAAAACU0/9Coga4C_-Gw/s640/DSC00521.JPG)

Código: [Seleccionar]
#include <16F628A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection


#use delay(clock=20000000,RESTART_WDT)             // Utilizo clock de 20MHz porque me facilita la elección exacta del baudrate a 250k y tenia el cristal


/************************************************************************
*                    Registros USART                                    *
************************************************************************/

#byte SPBRG=              0x99         // Registros para el pic 16F628
#byte RCSTA=              0x18         // Aqui se han modificado las direcciones correspondientes para el 628
#byte TXSTA=              0x98     
#byte RCREG=              0x1A     
#byte PIR1=               0x0C     
#byte PIE1=               0x8C     


#bit SPEN=                RCSTA.7
#bit RX9=                 RCSTA.6
#bit SREN=                RCSTA.5     
#bit CREN=                RCSTA.4   
#bit ADDEN=               RCSTA.3
#bit FERR=                RCSTA.2   
#bit OERR=                RCSTA.1
#bit RX9D=                RCSTA.0     
#bit BRGH=                TXSTA.2
#bit SYNC=                TXSTA.4       
#bit RCIF=                PIR1.5       
#bit RCIE=                PIE1.5       


/************************************************************************
*                    Estados protocolo DMX                              *
************************************************************************/

#define       DMX_ESPERA_BYTE              0
#define       DMX_ESPERA_BREAK            1
#define       DMX_ESPERA_START            2
#define       DMX_ESPERA_DATO             3
#define       DMX_RECEPCION_DATOS     4


/************************************************************************
*                    Variables globales y constantes                    *
************************************************************************/

//--------------------Se han quitado las variables que no utilizo--------------------------------------

int8 DMX_Estado = DMX_ESPERA_BREAK;                        // Estado de la máquina de estados
int8 DatoRX;                                                                  // Dato genérico recibido en USART
int8 DMX_Indice = 0;                                                      // Apuntador a una posición de la trama DMX
int8 Ticks = 0;

#define TotalCanales          9            // Total canales a almacenar en este caso solo interesan los 3 primeros
int8 TramaDMX[TotalCanales]= {0,0,0,0,0,0,0,0,0};          // Trama completa de valores DMX
int8 r1,g1,b1,r2,g2,b2,r3,g3,b3;

union                                               // Estructura para hacer una copia del registro RCSTA
  {
    unsigned char registro;
    struct {
        unsigned char RX9D:1;
        unsigned char OERR:1;
        unsigned char FERR:1;
        unsigned char ADDEN:1;
        unsigned char CREN:1;
        unsigned char SREN:1;
        unsigned char RX9:1;
        unsigned char SPEN:1;
    } bits ;
  }Copia_RCSTA;


/************************************************************************
*          Interrupción Timer 0:                                        *
************************************************************************/
#int_Timer0
TIMER0_isr()
{
   Ticks++;

   if (Ticks==0)
   {
      r1 = TramaDMX[0];
      g1 = TramaDMX[1];
      b1 = TramaDMX[2];
      r2 = TramaDMX[3];
      g2 = TramaDMX[4];
      b2 = TramaDMX[5];
      r3 = TramaDMX[6];
      g3 = TramaDMX[7];
      b3 = TramaDMX[8];

      output_high(pin_A1);
      output_high(pin_A0);
      output_high(pin_B7);
      output_high(pin_B4);
      output_high(pin_B5);
      output_high(pin_B6);
      output_high(pin_A2);
      output_high(pin_A3);
      output_high(pin_B3);
   }

   if(Ticks==r1)
      output_low(pin_A2);
   if(Ticks==g1)
      output_low(pin_A3);
   if(Ticks==b1)
      output_low(pin_B3);

   if(Ticks==r2)
      output_low(pin_B4);
   if(Ticks==g2)
      output_low(pin_B5);
   if(Ticks==b2)
      output_low(pin_B6);

   if(Ticks==r3)
      output_low(pin_B7);
   if(Ticks==g3)
      output_low(pin_A0);
   if(Ticks==b3)
      output_low(pin_A1);

   set_timer0(128);
}
/************************************************************************
*  Interrupción RDA: dato recibido por la USART                         *
*  Esta interrupción se activa cada vez que se recibe un dato en la     *
*  USART. Mediante el control de una máquina de estados se determina    *
*  la validez y el significado del dato recibido, y se obra en          *
*  consecuencia.                                                        *
************************************************************************/

//--------La interrupción de la USART no se ha modificado, esta tal cual el receptor de Nocturno----------------
//--------solo cambia el hecho de que TotalCanales vale 3 en lugar de 512----------------------------------------

#int_rda
void Dato_Recibido_USART(void)
{
   while (RCIF) // ejecutamos mientras haya un dato pendiente de procesar
   {
    // Hacemos una copia del registro RCSTA porque sus bits cambian de valor
    // al leer RCREG y modificar CREN
    Copia_RCSTA.registro = RCSTA;

    // En RCREG está el dato que acaba de recibir la USART
    DatoRX = RCREG;

    // Si se reciben más de 3 bytes sin haberlos procesado, se produce un error
    // de Overrun. En este caso, se borra el error reiniciando CREN y dejamos
    // la interrupción preparada para procesar la siguiente trama DMX
    if (Copia_RCSTA.bits.OERR)
    {
      CREN=0;
      CREN=1;
      DMX_Estado = DMX_ESPERA_BYTE;
      return;
    }

    // Máquina de estados
    switch (DMX_Estado)
    {
      case DMX_ESPERA_BYTE:   // si estamos en este estado y hay error FRAME
      // es que nos ha pillado en medio de un Byte. Hay que seguir esperando
      // hasta que desaparezca el error.
        if (!Copia_RCSTA.bits.FERR)
              // Ha llegado un byte. Ahora esperaremos la señal Break
          DMX_Estado = DMX_ESPERA_BREAK;
        break;


      case DMX_ESPERA_BREAK:   // estamos esperando la señal Break
        // Esta señal se identifica porque aparece el error de Frame
        if (Copia_RCSTA.bits.FERR)
          // Tras recibir el error de Break, hay que esperar un byte de valor 0
          if (!DatoRX)
            DMX_Estado = DMX_ESPERA_START;
        break;
      case DMX_ESPERA_START: // ya hemos recibido el Break y ahora hay que
          // esperar un Byte con valor 0, que será la señal de Start
        // Mientras tanto, si recibimos un error de Frame, hay que volver a
        // empezar para recibir la señal de comienzo de trama.
        if (Copia_RCSTA.bits.FERR)
            DMX_Estado = DMX_ESPERA_BYTE;
        else {
          if (!DatoRX)
          {
            // Llegados a este punto, ya hemos recibido el Byte Start=0
            // y comenzamos la trama de valores DMX.
            DMX_Indice = 0;
            DMX_Estado = DMX_RECEPCION_DATOS;
          } else
            // Si el dato recibido no es 0, volvemos a empezar
            DMX_Estado = DMX_ESPERA_BREAK;
        }
        break;
      case DMX_RECEPCION_DATOS:
        // En este estado estamos recibiendo la trama de datos DMX
        // Si se detecta un error de Frame es que ha habido un error y estamos
        // al principio
        if (Copia_RCSTA.bits.FERR)
          if (!DatoRX)
            DMX_Estado = DMX_ESPERA_START;
          else
            DMX_Estado = DMX_ESPERA_BYTE;
        else
        {
          // Almacenamos el dato recibido en nuestro array
          TramaDMX[DMX_Indice++] = DatoRX;

          // Si ha llegado al final de la capacidad, cambiamos al estado de espera
          // de nueva trama
          if (DMX_Indice >= TotalCanales)
            DMX_Estado = DMX_ESPERA_BREAK;
        }
        break;
      }
   }
   return;
}

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_wdt(WDT_18MS);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(False);
   


   // Configuración de la USART

SPBRG=4;          // A 20Mhz el baudrate es 250.000, sale de la tabla de la hoja de datos del 16F628
BRGH=1;           // Seleccionamos high speed
SYNC=0;           // Transmisión asíncrona
SPEN=1;           // Activamos la USART
RX9=1;            // 9 bit para la recepcion
SREN=0;           // Desactiva recepción de un byte
CREN=1;           // Recepción activada
ADDEN=0;          // Desactivada la autodetección de dirección
FERR=0;           // No hay error de frame con 1 se activa
OERR=0;           // No hay error de overrun con 1 se activa


 // Activamos las interrupciones de recepción de la USART y del Timer0

   enable_interrupts(INT_RDA);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);



//-----------------------------------------------------------

   set_timer0(128);

   while(1){ delay_ms(5000);}
}


Saludos!
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 11 de Mayo de 2011, 01:36:50
¡Magnífico!, muy chulo.
Título: Re: Receptor DMX (DMX512)
Publicado por: frahg1 en 21 de Noviembre de 2011, 16:18:53
Hola Chirola83 o Nocturno, una pregunta puedes subir el esquematico por favor no logro descifrarlo jejeje
Espero tu apoyo estoy comenzando y ya me arme el manolator, muy bueno por cierto.
Saludos! ! !
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 21 de Noviembre de 2011, 16:22:04
Lo tienes aquí (http://micropic.es/index.php?option=com_remository&Itemid=77&func=fileinfo&id=142)
Título: Re: Receptor DMX (DMX512)
Publicado por: frahg1 en 21 de Noviembre de 2011, 16:28:56
Lo tienes aquí (http://micropic.es/index.php?option=com_remository&Itemid=77&func=fileinfo&id=142)



Agradezco tu respuesta tan pronta, lo voy a montar y comento como me fue,
 saludos !! ! !
Título: Re: Receptor DMX (DMX512)
Publicado por: frahg1 en 21 de Noviembre de 2011, 17:42:55
Hola a todos, primero que nada, un capo el Sr. Nocturno!. Tu codigo y documentacion me ha sido de mucha utilidad y tambien las modificaciones realizadas por mrlicho.

En resumen, aqui esta el resultado de mi implementacion con un PIC16F628, con salida para 9 canales.


Saludos!

Hola amigo chirola83 espero puedas pasarme el esquematico de tu proyecto para poder adquirir los componentes de una vez, saludos ! ! !
Título: Re: Receptor DMX (DMX512)
Publicado por: chirola83 en 21 de Noviembre de 2011, 22:00:44
(https://lh3.googleusercontent.com/-Sr8eOYF8Fjg/TsryvPPY2sI/AAAAAAAACoA/5oTd8eANiwM/s720/receptor-circ.jpg)
(https://lh6.googleusercontent.com/-_YecfTgrJxU/TsryvCUznXI/AAAAAAAACoE/83MGGWAfMp4/s253/receptor.jpg)

Esto seria la etapa de control, la de potencia no tengo un diagrama en este momento pero es algo simple con mosfet canal n.
Espero que te sirva. Saludos
anibal
Título: Re: Receptor DMX (DMX512)
Publicado por: frahg1 en 17 de Diciembre de 2011, 22:48:03
Hola chirola83 he terminado de armar tu receptor dmx, me parece magnifico, es excelente, me gustaria agregarle un adress o  direccionador. . .
podra alguien ayudarme? ? ?
saludos y gracias por el apoyo.
Felices fiestas! ! !
Título: Re: Receptor DMX (DMX512)
Publicado por: chirola83 en 18 de Diciembre de 2011, 12:12:20
Hola frahg1, primero que nada, no es mio, es de todos..
Segundo, para agregarle direccion, hay una forma muy simple que solo ocupa dos pines. Te paso el esquematico, la rutina la tendras que crear vos, pero mirarando el diagrama lo entenderas.
(ver imagen adjunta)
este esta publicado en este sitio: http://picprojects.org.uk/projects/dmx/dmx688/index.htm, para el que no lo conozca se los recomiendo.

Por ultimo quiero hacer una aclaracion, no tomen este circuito como algo profesional. Yo lo abandone por que no estaba muy contento con su funcionamiento. para ese  pic generar 9 pwm por soft y procesar la trama dmx es mucho. Alguien con mas experiencia tal vez pueda corregirme.
Para mi la clave esta en utilizar otros medios para generar los pwm como por ejemplo con TLC5940.

Saludos y suerte!
Título: Re: Receptor DMX (DMX512)
Publicado por: lopezz88 en 08 de Marzo de 2012, 00:25:03
ola a todos, amigo chirola83, como se poderia obter o adress da forma como indicas no esquema?
fiquei algo confuso...podes tentar explicar como ficaria a rotina para que o pic reconhecesse o valor DMX que colocamos nos dips?

comprimentos
Lopez
Título: Re: Receptor DMX (DMX512)
Publicado por: jfsh2000 en 31 de Marzo de 2012, 02:21:08
Hola amigo  chirola83 ((:-)) ((:-)) ((:-)) ((:-))

Muy buen trabajo :-/ :-/

Funciona de maravilla muy bueno y practico 9 ch en un solo pic.
solo una pregunta como puedo cambiar la dirección de dmx el el código para que funcione en otros canales dmx me interesa colocar 3 módulos de 9 ch para controlar par de halogeno de los antiguos.


saludos
Título: Re: Receptor DMX (DMX512)
Publicado por: naldo santos en 10 de Abril de 2012, 03:00:08
¡Magnífico!, muy chulo.


Buenos días amigo,! En primer lugar quiero felicitarle por el foro
Naldo Santos y me gustaría saber si usted tiene el código para receptor DMX512 en formato hex, porque no soy capaz de compilar  el codigo,estoy usando PIC 16F628A con la versión 256, Gracias!

y ahuardo!
Título: Re: Receptor DMX (DMX512)
Publicado por: martin_sj en 16 de Julio de 2012, 23:54:54
chirola83 y nocturno son unos genios!! me anduvo joya el proyecto jeje
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 17 de Julio de 2012, 01:24:30
De genio nada, sólo un poco cabezota. Me alegro que te haya servido.
Título: Re: Receptor DMX (DMX512)
Publicado por: naldo santos en 29 de Julio de 2012, 14:20:21
De genio nada, sólo un poco cabezota. Me alegro que te haya servido.

Caro amigo Nocturno !

Usei o seu codigo para adaptar no pic16f877 com 12canais led rgb e funcionou perfeitamente,porem não conseguir colocar toda a trama de canais (512) pois não tinha espaço suficiente na RAM do pic então resolvi comprar o pic18f4525 ai começou minha dor de cabeça pois não entendo muito bem os registro do mesmo ,conseguir colocar toda a trama dmx neste pic porem
só que funcionar em 16bits então quando tento controlar os leds ele vai aumentado a intensidade e quando chega na metade do controle zera e começa tudo denovo ,acho que ele não esta lendo  de 0 a 255 e sim de -127  0 127 (16bits)
ai entra Vc grande MESTRE, como faço para eliminar este problema? teria como vc analisar isso para mim pois tenho pouco conhecimento em programação e não consigo resolver.
Por favor me ajude pois já estou ficando careca com isso.

segue o codigo para analise.

#include <18F4525.h>
#device adc=8
#FUSES WDT
#FUSES WDT128                   //Watch Dog Timer uses 1:1 Postscale
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOIESO                     //Internal External Switch Over mode enabled
#FUSES NOBROWNOUT               //No brownout reset
#FUSES BORV46                   //Brownout reset at 4.6V
#FUSES PUT                      //Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOFCMEN                    //Fail-safe clock monitor enabled
#FUSES NOXINST                    //Extended set extension and Indexed Addressing mode enabled
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES NOMCLR                   //Master Clear pin used for I/O


#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,restart_wdt)






#use delay(clock=20000000,RESTART_WDT)             // Utilizo clock de 20MHz porque me facilita la elección exacta del baudrate a 250k y tenia el cristal

/************************************************************************
*                    Registros USART                                    *
************************************************************************/
#byte SPBRG=             0xFAF         // Registros para establecer la velocidad
#byte SPBRGH=            0xFB0         // de la USART
#byte RCSTA=             0xFAB       // Registro de recepcion de la usart
#byte TXSTA=             0xFAC       // Registro de emisión de la usart
#byte RCREG=             0xFAE       // Aquí se recibe el dato de la usart
#byte PIR1=              0xF9E       // Estado de interrupciones de periféricos
#byte PIE1=              0xF9D        // Activación de interrupciones de periféricos
#byte BAUDCON=           0xFB8      // Control de la velocidad en baudios


#bit SPEN=                RCSTA.7      // Bit activación puerto serie
#bit RX9=                 RCSTA.6      // Activación de recepción de 9 bits
#bit SREN=                RCSTA.5      // Se activa para recibir un sólo byte
#bit CREN=                RCSTA.4      // Se activa para recepción continua
#bit ADDEN=               RCSTA.3       // Autodetección de dirección
#bit FERR=                RCSTA.2      // Error de Frame
#bit OERR=                RCSTA.1      // Error de Overrun
#bit RX9D=                RCSTA.0      // El noveno bit
#bit BRGH=                TXSTA.2       // Selección de alta velocidad
#bit BRG16=             BAUDCON.3    // Uso de un valor baudrate de 16 bits
#bit SYNC=                TXSTA.4       // Selección de modo síncrono o asíncrono
#bit RCIF=                PIR1.5       // Señalizador de byte recibido en USART
#bit RCIE=                PIE1.5       // Activación de la interrupción USART



/************************************************************************
*                    Estados protocolo DMX                              *
************************************************************************/

#define       DMX_ESPERA_BYTE              0
#define       DMX_ESPERA_BREAK            1
#define       DMX_ESPERA_START            2
#define       DMX_ESPERA_DATO             3
#define       DMX_RECEPCION_DATOS     4

//#define HS      0xFAFF
/************************************************************************
*                    Variables globales y constantes                    *
************************************************************************/

//--------------------Se han quitado las variables que no utilizo--------------------------------------


int8 DMX_Estado = DMX_ESPERA_BREAK;                        // Estado de la máquina de estados
int8 DatoRX;                                                                  // Dato genérico recibido en USART
int8 DMX_Indice = 0;                                                      // Apuntador a una posición de la trama DMX

                         
#define liga output_low
#define off  output_high
#define TotalCanales         50 // Total canales a almacenar en este caso solo interesan los 3 primeros int16 tramadmx[totalcanales];    //={0,0,0,0,0,0,0,0,0,0,0,0};          // Trama completa de valores DMX

 int8 TramaDMX[totalcanales];
 int8 r1,g1,b1,r2,g2,b2,r3,g3,b3,r4,g4,b4;
 int8 a,b,c,d,e,f,g,h,i,j,l,m;
 int8 x;
 int8 Ticks = 0;
 
union                                               // Estructura para hacer una copia del registro RCSTA
  {
   unsigned char  registro;
    struct {
        unsigned char RX9D:1;
        unsigned char OERR:1;
        unsigned char FERR:1;
        unsigned char ADDEN:1;
        unsigned char CREN:1;
        unsigned char SREN:1;
        unsigned char RX9:1;
        unsigned char SPEN:1;
    } bits ;
  }Copia_RCSTA;


/************************************************************************
*          Interrupción Timer 0:                                        *
************************************************************************/
#int_Timer0
TIMER0_isr()
{
 
  (a = x=0);
  (b = a+1);
  (c = b+1);
  (d = c+1);
  (e = d+1);
  (f = e+1);
  (g = f+1);
  (h = g+1);
  (i = h+1);
  (j = i+1);
  (l = j+1);
  (m = l+1); 
 

  ticks++;

  if (Ticks==0)
 
   {
      r1 = TramaDMX[a];
      g1 = TramaDMX;
      b1 = TramaDMX[c];
      r2 = TramaDMX[d];
      g2 = TramaDMX[e];
      b2 = TramaDMX[f];
      r3 = TramaDMX[g];
      g3 = TramaDMX[h];
      b3 = TramaDMX;
      r4 = TramaDMX[j];
      g4 = TramaDMX[l];   
      b4 = TramaDMX[m];
           
     

      off(pin_b1);
      off(pin_b2);               
      off(pin_b3);     
      off(pin_b4);
      off(pin_b5);     
      off(pin_b6);     
      off(pin_b7);   
      off(pin_d0);   
      off(pin_d1);   
      off(pin_d2);     
      off(pin_d3);     
      off(pin_d4);   
     
     
}

   if(Ticks==r1)
      liga(pin_b1);
   if(Ticks==g1)
      liga(pin_b2);
   if(Ticks==b1)
      liga(pin_b3);

   if(Ticks==r2)
      liga(pin_b4);
   if(Ticks==g2)
      liga(pin_b5);
   if(Ticks==b2)
     liga(pin_b6);

   if(Ticks==r3)
      liga(pin_b7);
   if(Ticks==g3)
      liga(pin_d0);
   if(Ticks==b3)
      liga(pin_d1);
     
   if(Ticks==r4)
      liga(pin_d2);
   if(Ticks==g4)
      liga(pin_d3);
   if(Ticks==b4)
      liga(pin_d4);

   set_timer0(128);
   
}

/************************************************************************
*  Interrupción RDA: dato recibido por la USART                         *
*  Esta interrupción se activa cada vez que se recibe un dato en la     *
*  USART. Mediante el control de una máquina de estados se determina    *
*  la validez y el significado del dato recibido, y se obra en          *
*  consecuencia.                                                        *
************************************************************************/

//--------La interrupción de la USART no se ha modificado, esta tal cual el receptor de Nocturno----------------
//--------solo cambia el hecho de que TotalCanales vale 3 en lugar de 512----------------------------------------

#int_rda
void Dato_Recibido_USART(void)
{
while (RCIF) // ejecutamos mientras haya un dato pendiente de procesar
{
// Hacemos una copia del registro RCSTA porque sus bits cambian de valor
// al leer RCREG y modificar CREN
Copia_RCSTA.registro = RCSTA;
// En RCREG está el dato que acaba de recibir la USART
DatoRX = RCREG;
// Si se reciben más de 3 bytes sin haberlos procesado, se produce un error
// de Overrun. En este caso, se borra el error reiniciando CREN y dejamos
// la interrupción preparada para procesar la siguiente trama DMX
if (Copia_RCSTA.bits.OERR)
{
CREN=0;
CREN=1;
DMX_Estado = DMX_ESPERA_BYTE;
return;
}
// Máquina de estados
switch (DMX_Estado)
{
case DMX_ESPERA_BYTE: // si estamos en este estado y hay error FRAME
// es que nos ha pillado en medio de un Byte. Hay que seguir esperando
// hasta que desaparezca el error.
if (!Copia_RCSTA.bits.FERR)
// Ha llegado un byte. Ahora esperaremos la señal Break
DMX_Estado = DMX_ESPERA_BREAK;
break;
case DMX_ESPERA_BREAK: // estamos esperando la señal Break
// Esta señal se identifica porque aparece el error de Frame
if (Copia_RCSTA.bits.FERR)
// Tras recibir el error de Break, hay que esperar un byte de valor 0
if (!DatoRX)
DMX_Estado = DMX_ESPERA_START;
break;
case DMX_ESPERA_START: // ya hemos recibido el Break y ahora hay que
// esperar un Byte con valor 0, que será la señal de Start
// Mientras tanto, si recibimos un error de Frame, hay que volver a
// empezar para recibir la señal de comienzo de trama.
if (Copia_RCSTA.bits.FERR)
DMX_Estado = DMX_ESPERA_BYTE;
else {
if (!DatoRX)
{
// Llegados a este punto, ya hemos recibido el Byte Start=0
// y comenzamos la trama de valores DMX.
DMX_Indice = 0;
DMX_Estado = DMX_RECEPCION_DATOS;
} else
// Si el dato recibido no es 0, volvemos a empezar
DMX_Estado = DMX_ESPERA_BREAK;
}
break;
case DMX_RECEPCION_DATOS:
// En este estado estamos recibiendo la trama de datos DMX
// Si se detecta un error de Frame es que ha habido un error y estamos
// al principio
if (Copia_RCSTA.bits.FERR)
if (!DatoRX)
DMX_Estado = DMX_ESPERA_START;
else
DMX_Estado = DMX_ESPERA_BYTE;
else
{
// Almacenamos el dato recibido en nuestro array
TramaDMX[DMX_Indice++] = DatoRX;
// Si ha llegado al final de la capacidad, cambiamos al estado de espera
// de nueva trama
if (DMX_Indice >= TotalCanales)
DMX_Estado = DMX_ESPERA_BREAK;
}
break;
}
}
return;
}

void main()
{

    setup_oscillator(TRUE); //(OSC_8MHZ|OSC_INTRC|OSC_PLL_ON);
   port_b_pullups(TRUE);
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF|ADC_TAD_MUL_0);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_ON);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1|RTCC_8_BIT);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_4);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   // Configuración de la USART
   BRGH=1;           // Alta velocidad seleccionada.
   BRG16=1;          // Baudrate de 16 bits
   SYNC=0;           // Seleccionamos transmisión asíncrona
   SPBRG=17;          // A 8MHz representa Baudios = 250KHz
   SPBRGH=0;
   RX9=1;            // Activada la recepción a 9 bits
   SREN=0;           // Desactivada la recepción de un sólo byte
   ADDEN=0;          // Desactivada la autodetección de dirección
   FERR=0;           // No hay error de frame
   OERR=0;           // No hay error de overrun
   SPEN=1;           // USART activada
   CREN=1;           // Recepción activada


 // Activamos las interrupciones de recepción de la USART y del Timer0








   enable_interrupts(INT_RDA);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);



//-----------------------------------------------------------

   set_timer0(128);

   while(1){delay_ms(5000); }
   
}
Título: Re: Receptor DMX (DMX512)
Publicado por: jahir golbem en 03 de Septiembre de 2012, 03:54:47
Se que el codigo puede mejorarse, estas son solo pruebas y tal vez a alguien le pueda servir.

(https://lh6.googleusercontent.com/_jcAN7sZk2-0/TcXC3PDw7hI/AAAAAAAACUw/XgJhDLb22I8/s640/DSC00506.JPG)

(https://lh5.googleusercontent.com/_jcAN7sZk2-0/TcXC5FM3e2I/AAAAAAAACU0/9Coga4C_-Gw/s640/DSC00521.JPG)

Código: [Seleccionar]
#include <16F628A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection


#use delay(clock=20000000,RESTART_WDT)             // Utilizo clock de 20MHz porque me facilita la elección exacta del baudrate a 250k y tenia el cristal


/************************************************************************
*                    Registros USART                                    *
************************************************************************/

#byte SPBRG=              0x99         // Registros para el pic 16F628
#byte RCSTA=              0x18         // Aqui se han modificado las direcciones correspondientes para el 628
#byte TXSTA=              0x98     
#byte RCREG=              0x1A     
#byte PIR1=               0x0C     
#byte PIE1=               0x8C     


#bit SPEN=                RCSTA.7
#bit RX9=                 RCSTA.6
#bit SREN=                RCSTA.5     
#bit CREN=                RCSTA.4   
#bit ADDEN=               RCSTA.3
#bit FERR=                RCSTA.2   
#bit OERR=                RCSTA.1
#bit RX9D=                RCSTA.0     
#bit BRGH=                TXSTA.2
#bit SYNC=                TXSTA.4       
#bit RCIF=                PIR1.5       
#bit RCIE=                PIE1.5       


/************************************************************************
*                    Estados protocolo DMX                              *
************************************************************************/

#define       DMX_ESPERA_BYTE              0
#define       DMX_ESPERA_BREAK            1
#define       DMX_ESPERA_START            2
#define       DMX_ESPERA_DATO             3
#define       DMX_RECEPCION_DATOS     4


/************************************************************************
*                    Variables globales y constantes                    *
************************************************************************/

//--------------------Se han quitado las variables que no utilizo--------------------------------------

int8 DMX_Estado = DMX_ESPERA_BREAK;                        // Estado de la máquina de estados
int8 DatoRX;                                                                  // Dato genérico recibido en USART
int8 DMX_Indice = 0;                                                      // Apuntador a una posición de la trama DMX
int8 Ticks = 0;

#define TotalCanales          9            // Total canales a almacenar en este caso solo interesan los 3 primeros
int8 TramaDMX[TotalCanales]= {0,0,0,0,0,0,0,0,0};          // Trama completa de valores DMX
int8 r1,g1,b1,r2,g2,b2,r3,g3,b3;

union                                               // Estructura para hacer una copia del registro RCSTA
  {
    unsigned char registro;
    struct {
        unsigned char RX9D:1;
        unsigned char OERR:1;
        unsigned char FERR:1;
        unsigned char ADDEN:1;
        unsigned char CREN:1;
        unsigned char SREN:1;
        unsigned char RX9:1;
        unsigned char SPEN:1;
    } bits ;
  }Copia_RCSTA;


/************************************************************************
*          Interrupción Timer 0:                                        *
************************************************************************/
#int_Timer0
TIMER0_isr()
{
   Ticks++;

   if (Ticks==0)
   {
      r1 = TramaDMX[0];
      g1 = TramaDMX[1];
      b1 = TramaDMX[2];
      r2 = TramaDMX[3];
      g2 = TramaDMX[4];
      b2 = TramaDMX[5];
      r3 = TramaDMX[6];
      g3 = TramaDMX[7];
      b3 = TramaDMX[8];

      output_high(pin_A1);
      output_high(pin_A0);
      output_high(pin_B7);
      output_high(pin_B4);
      output_high(pin_B5);
      output_high(pin_B6);
      output_high(pin_A2);
      output_high(pin_A3);
      output_high(pin_B3);
   }

   if(Ticks==r1)
      output_low(pin_A2);
   if(Ticks==g1)
      output_low(pin_A3);
   if(Ticks==b1)
      output_low(pin_B3);

   if(Ticks==r2)
      output_low(pin_B4);
   if(Ticks==g2)
      output_low(pin_B5);
   if(Ticks==b2)
      output_low(pin_B6);

   if(Ticks==r3)
      output_low(pin_B7);
   if(Ticks==g3)
      output_low(pin_A0);
   if(Ticks==b3)
      output_low(pin_A1);

   set_timer0(128);
}
/************************************************************************
*  Interrupción RDA: dato recibido por la USART                         *
*  Esta interrupción se activa cada vez que se recibe un dato en la     *
*  USART. Mediante el control de una máquina de estados se determina    *
*  la validez y el significado del dato recibido, y se obra en          *
*  consecuencia.                                                        *
************************************************************************/

//--------La interrupción de la USART no se ha modificado, esta tal cual el receptor de Nocturno----------------
//--------solo cambia el hecho de que TotalCanales vale 3 en lugar de 512----------------------------------------

#int_rda
void Dato_Recibido_USART(void)
{
   while (RCIF) // ejecutamos mientras haya un dato pendiente de procesar
   {
    // Hacemos una copia del registro RCSTA porque sus bits cambian de valor
    // al leer RCREG y modificar CREN
    Copia_RCSTA.registro = RCSTA;

    // En RCREG está el dato que acaba de recibir la USART
    DatoRX = RCREG;

    // Si se reciben más de 3 bytes sin haberlos procesado, se produce un error
    // de Overrun. En este caso, se borra el error reiniciando CREN y dejamos
    // la interrupción preparada para procesar la siguiente trama DMX
    if (Copia_RCSTA.bits.OERR)
    {
      CREN=0;
      CREN=1;
      DMX_Estado = DMX_ESPERA_BYTE;
      return;
    }

    // Máquina de estados
    switch (DMX_Estado)
    {
      case DMX_ESPERA_BYTE:   // si estamos en este estado y hay error FRAME
      // es que nos ha pillado en medio de un Byte. Hay que seguir esperando
      // hasta que desaparezca el error.
        if (!Copia_RCSTA.bits.FERR)
              // Ha llegado un byte. Ahora esperaremos la señal Break
          DMX_Estado = DMX_ESPERA_BREAK;
        break;


      case DMX_ESPERA_BREAK:   // estamos esperando la señal Break
        // Esta señal se identifica porque aparece el error de Frame
        if (Copia_RCSTA.bits.FERR)
          // Tras recibir el error de Break, hay que esperar un byte de valor 0
          if (!DatoRX)
            DMX_Estado = DMX_ESPERA_START;
        break;
      case DMX_ESPERA_START: // ya hemos recibido el Break y ahora hay que
          // esperar un Byte con valor 0, que será la señal de Start
        // Mientras tanto, si recibimos un error de Frame, hay que volver a
        // empezar para recibir la señal de comienzo de trama.
        if (Copia_RCSTA.bits.FERR)
            DMX_Estado = DMX_ESPERA_BYTE;
        else {
          if (!DatoRX)
          {
            // Llegados a este punto, ya hemos recibido el Byte Start=0
            // y comenzamos la trama de valores DMX.
            DMX_Indice = 0;
            DMX_Estado = DMX_RECEPCION_DATOS;
          } else
            // Si el dato recibido no es 0, volvemos a empezar
            DMX_Estado = DMX_ESPERA_BREAK;
        }
        break;
      case DMX_RECEPCION_DATOS:
        // En este estado estamos recibiendo la trama de datos DMX
        // Si se detecta un error de Frame es que ha habido un error y estamos
        // al principio
        if (Copia_RCSTA.bits.FERR)
          if (!DatoRX)
            DMX_Estado = DMX_ESPERA_START;
          else
            DMX_Estado = DMX_ESPERA_BYTE;
        else
        {
          // Almacenamos el dato recibido en nuestro array
          TramaDMX[DMX_Indice++] = DatoRX;

          // Si ha llegado al final de la capacidad, cambiamos al estado de espera
          // de nueva trama
          if (DMX_Indice >= TotalCanales)
            DMX_Estado = DMX_ESPERA_BREAK;
        }
        break;
      }
   }
   return;
}

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_wdt(WDT_18MS);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(False);
   


   // Configuración de la USART

SPBRG=4;          // A 20Mhz el baudrate es 250.000, sale de la tabla de la hoja de datos del 16F628
BRGH=1;           // Seleccionamos high speed
SYNC=0;           // Transmisión asíncrona
SPEN=1;           // Activamos la USART
RX9=1;            // 9 bit para la recepcion
SREN=0;           // Desactiva recepción de un byte
CREN=1;           // Recepción activada
ADDEN=0;          // Desactivada la autodetección de dirección
FERR=0;           // No hay error de frame con 1 se activa
OERR=0;           // No hay error de overrun con 1 se activa


 // Activamos las interrupciones de recepción de la USART y del Timer0

   enable_interrupts(INT_RDA);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);



//-----------------------------------------------------------

   set_timer0(128);

   while(1){ delay_ms(5000);}
}


Saludos!
Bueno, finalmente logré hacer funcionar el programa! Mil gracias por el ejemplo Nocturno, la verdad ha sido de una gran utilidad. Paso a comentar que el problema se debía a mi compilador, el código estaba perfecto, reinstalé una versión anterior del ccs y anduvo perfectamente. Recién he recibido la trama DMX, pero aún tengo que terminar el programa para que funcione con pwm, dimmer y flash. Cuando esté terminado lo posteo por si a alguien le sirve.


HOLA QUE TAL AMIGO UNA PREGUNTA SOY NUEVO EN ESO Y QUISIERA VER SI PUEDEN AYUDARME A CONSTRUIR UNO PERO A 12 CANALES CON SU DIRECCIONADOR USANDO switch
ESPERO RESPUESTA O LES DEJO MI CORREO ja_02_da@hotmail.com
gracias..
saludos

Saludos!
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 03 de Septiembre de 2012, 04:16:49
Jahir, el código recibe la trama completa en el array TramaDMX[]
Si quieres usar 12 canales, sólo tienes que leer las 12 posiciones del array que te interesen.
Coge el código, modifícalo a tu gusto y si tienes dudas pégalo indicando dónde está el problema.
Título: Re: Receptor DMX (DMX512)
Publicado por: jahir golbem en 03 de Septiembre de 2012, 19:35:24
Jahir, el código recibe la trama completa en el array TramaDMX[]
Si quieres usar 12 canales, sólo tienes que leer las 12 posiciones del array que te interesen.
Coge el código, modifícalo a tu gusto y si tienes dudas pégalo indicando dónde está el problema.
[/

ya modifique el codigo mi duda es comopuedo poder los dipswich parra dirreccionarlos canales enel codigo esa esmi duda o si tienes un codigo que me ayudet lo agradesco ja_02_da@hotmail.com
saludos...
Título: Re: Receptor DMX (DMX512)
Publicado por: jahir golbem en 04 de Septiembre de 2012, 23:13:20


ya modifique el codigo mi duda es como puedo poder los dipswich parra dirreccionarlos canales enel codigo esa esmi duda o si tienes un codigo que me ayudet lo agradesco ja_02_da@hotmail.com
saludos...


el codigo memarca erro enesta linea..
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,restart_wdt)

k puede ser la falla..

espero cntesten amigos....
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 05 de Septiembre de 2012, 02:12:19
¿Has modificado el código y te marca errores de compilación?, ¿qué cambios has hecho?
Título: Re: Receptor DMX (DMX512)
Publicado por: jahir golbem en 06 de Septiembre de 2012, 00:19:05
¿Has modificado el código y te marca errores de compilación?, ¿qué cambios has hecho?

ningunon cambio me marca error en la linea donde se declara el rs232.......
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 06 de Septiembre de 2012, 03:32:18
Si no hay cambios sí funciona, yo lo hice. Asegúrate que tienes bien configurado el compilador.
Título: Re: Receptor DMX (DMX512)
Publicado por: jahir golbem en 07 de Septiembre de 2012, 02:57:27
Si no hay cambios sí funciona, yo lo hice. Asegúrate que tienes bien configurado el compilador.

ok ok checare k onda..otra pregunta ese codigo ya me permite poner los dips switch..??

podras subir amigo nocturno algun diagrama de como lo armaste xfavor..

gracias saludos...
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 07 de Septiembre de 2012, 03:39:18
No entiendo qué necesitas, aquí tienes fotos del prototipo terminado y el esquemático de cómo está diseñado.

http://www.micropic.es/mpblog/2007/12/receptor-dmx-dmx512/
Título: Re: Receptor DMX (DMX512)
Publicado por: jahir golbem en 12 de Octubre de 2012, 02:58:42
No entiendo qué necesitas, aquí tienes fotos del prototipo terminado y el esquemático de cómo está diseñado.

http://www.micropic.es/mpblog/2007/12/receptor-dmx-dmx512/


una pregunta como puedo cambiar la dirección de dmx el el código para que funcione en otros canales dmx  como se muestra en la figura espero me puedas ayudar gracias..saludos...
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 12 de Octubre de 2012, 03:39:22
¿Has leído el artículo?, ¿has visto el vídeo?

Sólo hay que teclear el canal en el teclado matricial. Se reciben TODOS los canales.
Título: Re: Receptor DMX (DMX512)
Publicado por: jahir golbem en 01 de Noviembre de 2012, 05:30:07
¿Has leído el artículo?, ¿has visto el vídeo?

Sólo hay que teclear el canal en el teclado matricial. Se reciben TODOS los canales.

que tal amigo nocturno solo molestando para ver si estan bien declarados las entradas para poder dirreccionar el dmx a un canal en especifico dejo el programa espero puedas ayudarme..


#include <16F887.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection


#use delay(clock=20000000,RESTART_WDT)             // Utilizo clock de 20MHz porque me facilita la elección exacta del baudrate a 250k y tenia el cristal


/************************************************************************
*                    Registros USART                                    *
************************************************************************/

#byte SPBRG=              0x99         // Registros para el pic 16F628
#byte RCSTA=              0x18         // Aqui se han modificado las direcciones correspondientes para el 628
#byte TXSTA=              0x98     
#byte RCREG=              0x1A     
#byte PIR1=               0x0C     
#byte PIE1=               0x8C     



#bit SPEN=                RCSTA.7
#bit RX9=                 RCSTA.6
#bit SREN=                RCSTA.5     
#bit CREN=                RCSTA.4   
#bit ADDEN=               RCSTA.3
#bit FERR=                RCSTA.2   
#bit OERR=                RCSTA.1
#bit RX9D=                RCSTA.0     
#bit BRGH=                TXSTA.2
#bit SYNC=                TXSTA.4       
#bit RCIF=                PIR1.5       
#bit RCIE=                PIE1.5       

//************************************************************************

#byte TRISC = 0x87
#byte TRISD = 0x88
#byte PORTC = 0x07
#byte PORTD = 0x08

// 9 bits para conseguir la direccion del dispositivo (Midireccionreal)
#bit  RD0 = PORTD.0
#bit  RD1 = PORTD.1
#bit  RD2 = PORTD.2
#bit  RD3 = PORTD.3
#bit  RD4 = PORTD.4
#bit  RD5 = PORTD.5
#bit  RD6 = PORTD.6
#bit  RD7 = PORTD.7
#bit  RC4 = PORTC.4


//************E*****************************************************




/************************************************************************
*                    Estados protocolo DMX                              *
************************************************************************/

#define       DMX_ESPERA_BYTE              0
#define       DMX_ESPERA_BREAK            1
#define       DMX_ESPERA_START            2
#define       DMX_ESPERA_DATO             3
#define       DMX_RECEPCION_DATOS     4


/************************************************************************
*                    Variables globales y constantes                    *
************************************************************************/

//--------------------Se han quitado las variables que no utilizo--------------------------------------

int8 DMX_Estado = DMX_ESPERA_BREAK;                        // Estado de la máquina de estados
int8 DatoRX;                                                                  // Dato genérico recibido en USART
//int8 DMX_Indice = 0;                                                      // Apuntador a una posición de la trama DMX
int8 Ticks = 0;

//***********************************************************************
int8 Midireccionreal, Midireccionvirtual;
int16 CanalDMX;                     // Canal DMX seleccionado para visualizar, de 1 a 512
int8 DatoDMX;                       // Dato que contiene el canal seleccionado
int16 DMX_Indice = 0;               // Apuntador a una posición de la trama DMX

void Cojedireccion (void);



void Cojedireccion (void){
 DatoDMX =0;
   if (RD0 == 1)
   DatoDMX = DatoDMX+1;
   if (RD1 == 1)
  DatoDMX = DatoDMX+2;
   if (RD2 == 1)
  DatoDMX = DatoDMX+4;
   if (RD3 == 1)
  DatoDMX = DatoDMX+8;
   if (RD4 == 1)
   DatoDMX = DatoDMX+16;
   
   if (RD5 == 1)
  DatoDMX = DatoDMX+32;
   if (RD6 == 1)
  DatoDMX = DatoDMX+64;
   if (RD7 == 1)
   DatoDMX = DatoDMX+128;
   if (RC4 == 1)
 DatoDMX = DatoDMX+256;

}
//*********************************************************************



#define TotalCanales       12              // Total canales a almacenar en este caso solo interesan los 3 primeros
int8 TramaDMX[TotalCanales];// = {0,0,0,0,0,0,0,0,0,0,0,0};         //  Trama completa de valores DMX
int8 r1,g1,b1,r2,g2,b2,r3,g3,b3,r4,g4,b4;

union                                               // Estructura para hacer una copia del registro RCSTA
  {
    unsigned char registro;
    struct {
        unsigned char RX9D:1;
        unsigned char OERR:1;
        unsigned char FERR:1;
        unsigned char ADDEN:1;
        unsigned char CREN:1;
        unsigned char SREN:1;
        unsigned char RX9:1;
        unsigned char SPEN:1;
    } bits ;
  }Copia_RCSTA;


/************************************************************************
*          Interrupción Timer 0:                                        *
************************************************************************/
#int_Timer0
TIMER0_isr()
{
   Ticks++;

   if (Ticks==0)
   {
      r1 = TramaDMX[0];
      g1 = TramaDMX[1];
      b1 = TramaDMX[2];
      r2 = TramaDMX[3];
      g2 = TramaDMX[4];
      b2 = TramaDMX[5];
      r3 = TramaDMX[6];
      g3 = TramaDMX[7];
      b3 = TramaDMX[8];
 r4 = TramaDMX[9];
 g4 = TramaDMX[10];
 b4 = TramaDMX[11];

      output_high(pin_B0);
      output_high(pin_B1);
      output_high(pin_B2);
     
      output_high(pin_B3);
      output_high(pin_B4);
      output_high(pin_B5);
     
      output_high(pin_B6);
      output_high(pin_B7);
      output_high(pin_A1);
     
      output_high(pin_A2);//r4
        output_high(pin_A3);//g4
         output_high(pin_A0);//b4

   }

   if(Ticks==r1)
      output_low(pin_A2);
   if(Ticks==g1)
      output_low(pin_A3);
   if(Ticks==b1)
      output_low(pin_B3);

   if(Ticks==r2)
      output_low(pin_B4);
   if(Ticks==g2)
      output_low(pin_B5);
   if(Ticks==b2)
      output_low(pin_B6);

   if(Ticks==r3)
      output_low(pin_B7);
   if(Ticks==g3)
      output_low(pin_A0);
   if(Ticks==b3)
      output_low(pin_A1);
     
       if(Ticks==r4)
      output_low(pin_B0);
   if(Ticks==g4)
      output_low(pin_B1);
   if(Ticks==b4)
      output_low(pin_B2);

/*******************************

  set_timer0(128);
}
/************************************************************************
*  Interrupción RDA: dato recibido por la USART                         *
*  Esta interrupción se activa cada vez que se recibe un dato en la     *
*  USART. Mediante el control de una máquina de estados se determina    *
*  la validez y el significado del dato recibido, y se obra en          *
*  consecuencia.                                                        *
************************************************************************/

//--------La interrupción de la USART no se ha modificado, esta tal cual el receptor de Nocturno----------------
//--------solo cambia el hecho de que TotalCanales vale 3 en lugar de 512----------------------------------------

#int_rda
void Dato_Recibido_USART(void)
{
   while (RCIF) // ejecutamos mientras haya un dato pendiente de procesar
   {
    // Hacemos una copia del registro RCSTA porque sus bits cambian de valor
    // al leer RCREG y modificar CREN
    Copia_RCSTA.registro = RCSTA;

    // En RCREG está el dato que acaba de recibir la USART
    DatoRX = RCREG;

    // Si se reciben más de 3 bytes sin haberlos procesado, se produce un error
    // de Overrun. En este caso, se borra el error reiniciando CREN y dejamos
    // la interrupción preparada para procesar la siguiente trama DMX
    if (Copia_RCSTA.bits.OERR)
    {
      CREN=0;
      CREN=1;
      DMX_Estado = DMX_ESPERA_BYTE;
      return;
    }

    // Máquina de estados
    switch (DMX_Estado)
    {
      case DMX_ESPERA_BYTE:   // si estamos en este estado y hay error FRAME
      // es que nos ha pillado en medio de un Byte. Hay que seguir esperando
      // hasta que desaparezca el error.
        if (!Copia_RCSTA.bits.FERR)
              // Ha llegado un byte. Ahora esperaremos la señal Break
          DMX_Estado = DMX_ESPERA_BREAK;
        break;


      case DMX_ESPERA_BREAK:   // estamos esperando la señal Break
        // Esta señal se identifica porque aparece el error de Frame
        if (Copia_RCSTA.bits.FERR)
          // Tras recibir el error de Break, hay que esperar un byte de valor 0
          if (!DatoRX)
            DMX_Estado = DMX_ESPERA_START;
        break;
      case DMX_ESPERA_START: // ya hemos recibido el Break y ahora hay que
          // esperar un Byte con valor 0, que será la señal de Start
        // Mientras tanto, si recibimos un error de Frame, hay que volver a
        // empezar para recibir la señal de comienzo de trama.
        if (Copia_RCSTA.bits.FERR)
            DMX_Estado = DMX_ESPERA_BYTE;
        else {
          if (!DatoRX)
          {
            // Llegados a este punto, ya hemos recibido el Byte Start=0
            // y comenzamos la trama de valores DMX.
            DMX_Indice = 0;
            DMX_Estado = DMX_RECEPCION_DATOS;
          } else
            // Si el dato recibido no es 0, volvemos a empezar
            DMX_Estado = DMX_ESPERA_BREAK;
        }
        break;
      case DMX_RECEPCION_DATOS:
        // En este estado estamos recibiendo la trama de datos DMX
        // Si se detecta un error de Frame es que ha habido un error y estamos
        // al principio
        if (Copia_RCSTA.bits.FERR)
          if (!DatoRX)
            DMX_Estado = DMX_ESPERA_START;
          else
            DMX_Estado = DMX_ESPERA_BYTE;
        else
        {
          // Almacenamos el dato recibido en nuestro array
          TramaDMX[DMX_Indice++] = DatoRX;

          // Si ha llegado al final de la capacidad, cambiamos al estado de espera
          // de nueva trama
          if (DMX_Indice >= TotalCanales)
            DMX_Estado = DMX_ESPERA_BREAK;
        }
        break;
      }
   }
   return;
}

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_wdt(WDT_18MS);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(False);
   //**********************************************************************************
    set_tris_d(0xFF);    //Se configura para 8 entradas
   set_tris_c(0x01);    //Se configuran los pines de los Leds como salidas y el resto como entradas
   
   
   
   CanalDMX=2;       // Por defecto, el canal seleccionado es el primero
   
    Cojedireccion();
   Midireccionvirtual = Midireccionreal;
   //**********************************************************************************


   // Configuración de la USART

SPBRG=4;          // A 20Mhz el baudrate es 250.000, sale de la tabla de la hoja de datos del 16F628
BRGH=1;           // Seleccionamos high speed
SYNC=0;           // Transmisión asíncrona
SPEN=1;           // Activamos la USART
RX9=1;            // 9 bit para la recepcion
SREN=0;           // Desactiva recepción de un byte
CREN=1;           // Recepción activada
ADDEN=0;          // Desactivada la autodetección de dirección
FERR=0;           // No hay error de frame con 1 se activa
OERR=0;           // No hay error de overrun con 1 se activa


 // Activamos las interrupciones de recepción de la USART y del Timer0

   enable_interrupts(INT_RDA);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);



//-----------------------------------------------------------

  // set_timer0(128);
    set_timer0(255);

   while(true)
   {
   delay_ms(5000);
   }
}
Título: Re: Receptor DMX (DMX512)
Publicado por: Fermino en 14 de Febrero de 2013, 03:28:38
Gracias por vuestras palabras. (Akenafab, esas pilas son las que venden en la cadena de supermercados Mercadona, seguro que muchos de mis compatriotas las conocen. Jesús, el conector no lo venden en Mercadona :D)

Ya he subido el código fuente y el esquemático, que podéis descargar aquí: Descargas de ReceptorDMX (http://www.micropic.es/index.php?option=com_remository&Itemid=27&func=select&id=48)

(http://img512.imageshack.us/img512/9342/receptordmxqf9.th.jpg) (http://img512.imageshack.us/my.php?image=receptordmxqf9.jpg)

Del código fuente pegaré aquí sólo la rutina de atención a la interrupción de la USART, que es donde está el meollo de la cuestión. El programa completo está disponible para descargar en el link que puse antes. El código está comentado, así que me ahorro explicarlo.

Si necesitáis algo más, no tenéis más que decirlo.

Código: C
  1. /************************************************************************
  2. *  Interrupción RDA: dato recibido por la USART                         *
  3. *  Esta interrupción se activa cada vez que se recibe un dato en la     *
  4. *  USART. Mediante el control de una máquina de estados se determina    *
  5. *  la validez y el significado del dato recibido, y se obra en          *
  6. *  consecuencia.                                                        *
  7. ************************************************************************/
  8.  
  9. #int_rda
  10. void Dato_Recibido_USART(void)
  11. {
  12.         while (RCIF) // ejecutamos mientras haya un dato pendiente de procesar
  13.         {
  14.          // Hacemos una copia del registro RCSTA porque sus bits cambian de valor
  15.          // al leer RCREG y modificar CREN
  16.          Copia_RCSTA.registro = RCSTA;
  17.  
  18.          // En RCREG está el dato que acaba de recibir la USART
  19.          DatoRX = RCREG;
  20.  
  21.          // Si se reciben más de 3 bytes sin haberlos procesado, se produce un error
  22.          // de Overrun. En este caso, se borra el error reiniciando CREN y dejamos
  23.          // la interrupción preparada para procesar la siguiente trama DMX
  24.          if (Copia_RCSTA.bits.OERR)
  25.          {
  26.            CREN=0;
  27.            CREN=1;
  28.            DMX_Estado = DMX_ESPERA_BYTE;
  29.            return;
  30.          }
  31.  
  32.          // Máquina de estados
  33.          switch (DMX_Estado)
  34.          {
  35.            case DMX_ESPERA_BYTE:        // si estamos en este estado y hay error FRAME
  36.                 // es que nos ha pillado en medio de un Byte. Hay que seguir esperando
  37.                 // hasta que desaparezca el error.
  38.              if (!Copia_RCSTA.bits.FERR)
  39.                                 // Ha llegado un byte. Ahora esperaremos la señal Break
  40.                DMX_Estado = DMX_ESPERA_BREAK;
  41.              break;
  42.  
  43.  
  44.            case DMX_ESPERA_BREAK:       // estamos esperando la señal Break
  45.              // Esta señal se identifica porque aparece el error de Frame
  46.              if (Copia_RCSTA.bits.FERR)
  47.                // Tras recibir el error de Break, hay que esperar un byte de valor 0
  48.                if (!DatoRX)
  49.                  DMX_Estado = DMX_ESPERA_START;
  50.              break;
  51.            case DMX_ESPERA_START: // ya hemos recibido el Break y ahora hay que
  52.                  // esperar un Byte con valor 0, que será la señal de Start
  53.              // Mientras tanto, si recibimos un error de Frame, hay que volver a
  54.              // empezar para recibir la señal de comienzo de trama.
  55.              if (Copia_RCSTA.bits.FERR)
  56.                  DMX_Estado = DMX_ESPERA_BYTE;
  57.              else {
  58.                if (!DatoRX)
  59.                {
  60.                  // Llegados a este punto, ya hemos recibido el Byte Start=0
  61.                  // y comenzamos la trama de valores DMX.
  62.                  DMX_Indice = 0;
  63.                  DMX_Estado = DMX_RECEPCION_DATOS;
  64.                } else
  65.             // Si el dato recibido no es 0, volvemos a empezar
  66.                  DMX_Estado = DMX_ESPERA_BREAK;
  67.              }
  68.              break;
  69.            case DMX_RECEPCION_DATOS:
  70.              // En este estado estamos recibiendo la trama de datos DMX
  71.         // Si se detecta un error de Frame es que ha habido un error y estamos
  72.         // al principio
  73.              if (Copia_RCSTA.bits.FERR)
  74.                if (!DatoRX)
  75.                  DMX_Estado = DMX_ESPERA_START;
  76.                else
  77.                  DMX_Estado = DMX_ESPERA_BYTE;
  78.              else
  79.              {
  80.                // Almacenamos el dato recibido en nuestro array
  81.                TramaDMX[DMX_Indice++] = DatoRX;
  82.  
  83.                // Si ha llegado al final de la capacidad, cambiamos al estado de espera
  84.           // de nueva trama
  85.                if (DMX_Indice >= TotalCanales)
  86.                  DMX_Estado = DMX_ESPERA_BREAK;
  87.              }
  88.              break;
  89.    }
  90. }
  91. return;
  92. }
Hola!
Primero felicitaciones por su proyectos inspirador.Que ya funciona muy bien.
Sólo quería implementar un LED que parpadea cuando los datos recibidos mSQL positivo.
¿Cuál sería el código alquem si me puede contestar.
Título: Re: Receptor DMX (DMX512)
Publicado por: jahir golbem en 18 de Marzo de 2013, 00:54:39
que tal amigo solo molestando para saver si puedes ayudarme con lo del proyecto dmx en cuestion de como agregar el addres desde los dip switch para poder controlar mas de una luminaria al mismo tiempo.ojala puedas ayudarme..
Título: Re: Receptor DMX (DMX512)
Publicado por: Limako en 30 de Agosto de 2013, 09:25:46
Gracias a los grandes artifices de este post :)

he de decir que realice el receptor con el 16f628A y me anda perfecto, ahora queria probrar a hacer un receptor mas pequeño con el 12f1840 pero no encuentro en el datasheet la velocidad de 250k para el br. Alguien sabe si es posible hacer un receptor con un micro de la serie 12f?
otra duda que tengo es si en lugar de un max485 se podria usar un 75176, pues la diferencia de precio es notable, y lo he visto en otro proyecto... pero parece que no esta conectado igual que aqui.

tratare de modificar el codigo del 16f628 para que maneje una luz de esta forma

Strobe con leds blancos(canal 1)
RGB PWM (canales 2,3,4)
2 motores paso a paso(canal 5 y 6) para cada motor usare dos salidas, STEP y DIR, y luego esto va a un 12f628 que me hace las funciones de un l297.
si lo consigo ya lo subire ;)

Gracias
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 30 de Agosto de 2013, 13:46:22
El SN75176 es perfectamente válido. Suerte
Título: Re: Receptor DMX (DMX512)
Publicado por: Limako en 04 de Septiembre de 2013, 22:46:05
Una pequeña duda de tu codigo Nocturno.

En la parte de interrupcion de la USART.
La variable DMX_INDICE, indica apartir de que parte de la trama comenzamos a cojer los datos?
por que si yo pongo TotalCanales a 9 por ejemplo, y quiero que esos canales sean del 200 al 208, como tendira que hacer.
Por que claro estoy tratando de montarlo en un 16f876a y me funciona todo, pero ahora quiero hacer funcionar lo del dipswitch que hay por ahi, y claro si pongo total canales un numero elevado se me queda sin RAM el micro.

Alguna sugerencia? Gracias ;)
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 05 de Septiembre de 2013, 03:40:17
Y como está diseñado el código necesitas almacenar toda la trama. De todas formas ahora no tengo acceso al fuente para ver qué cambios podrían hacerse.
Título: Re: Receptor DMX (DMX512)
Publicado por: jahir golbem en 05 de Septiembre de 2013, 12:54:13
 ((:-))
Título: Re: Receptor DMX (DMX512)
Publicado por: jahir golbem en 05 de Septiembre de 2013, 12:55:48
Y como está diseñado el código necesitas almacenar toda la trama. De todas formas ahora no tengo acceso al fuente para ver qué cambios podrían hacerse.

Que tal amigo nocturno yo igual ando en eso de los dip shwitch, mi pregunta es si cres que lo pueda realizar con este registro del pic... ADDEN=0;          // Desactivada la autodetección de dirección y al activarlo que quede asi.... ADDEN=1;          // Desactivada la autodetección de dirección.....
podrás sugerirme si puedo activarlo de esa manera, o tendrás algún ejemplo de como utilizar este registro para poder guiarme.
saludos..
  :)
Título: Re: Receptor DMX (DMX512)
Publicado por: Limako en 27 de Septiembre de 2013, 09:44:54
Gracias por los aportes, que hacen que aqui pueda ir el mio, con un pequeño pic, un 12f1840, 3 canales, y dipswitch.

Subo, simulacion en proteus, esquematico, hex, y codigo ccs.

el esquematico es orientativo en cuanto a la etapa de salida, cada uno sabra lo que quiere controlar.
si se quiere se puede dejar sin dipswitch, y el sistema para controlar el 4017, siempre que el pin RA3 este con la resistencia a masa.

No se si al activar las interrupciones por la USART el pin de TX/RA0 se sigue pudiendo usar independientemente como una cuarta salida y canal, sin que esto afecte a la interrupcion y recepcion de datos, asi que por eso subo el codigo por si alguien quiere probar o lo que sea.

En el codigo escrito mas atras para un 16f628, he hecho las modificaciones tipicas para el modelo de PIC, y luego he añadido, dos nuevas variables, contador y canal.
Contador se deja en cero, y canal si se quiere establecer un canal sin poner dipswitch por programa, si no se deja en cero tambien.
el canal 0 es = al 1. Y bueno en la interrupcion de UART al final de ella vereis como hace para seleccionar el canal que interese, sin saturar la ram del micro.

Título: Re: Receptor DMX (DMX512)
Publicado por: jahir golbem en 27 de Septiembre de 2013, 11:34:11
Gracias por los aportes, que hacen que aqui pueda ir el mio, con un pequeño pic, un 12f1840, 3 canales, y dipswitch.

Subo, simulacion en proteus, esquematico, hex, y codigo ccs.

el esquematico es orientativo en cuanto a la etapa de salida, cada uno sabra lo que quiere controlar.
si se quiere se puede dejar sin dipswitch, y el sistema para controlar el 4017, siempre que el pin RA3 este con la resistencia a masa.

No se si al activar las interrupciones por la USART el pin de TX/RA0 se sigue pudiendo usar independientemente como una cuarta salida y canal, sin que esto afecte a la interrupcion y recepcion de datos, asi que por eso subo el codigo por si alguien quiere probar o lo que sea.

En el codigo escrito mas atras para un 16f628, he hecho las modificaciones tipicas para el modelo de PIC, y luego he añadido, dos nuevas variables, contador y canal.
Contador se deja en cero, y canal si se quiere establecer un canal sin poner dipswitch por programa, si no se deja en cero tambien.
el canal 0 es = al 1. Y bueno en la interrupcion de UART al final de ella vereis como hace para seleccionar el canal que interese, sin saturar la ram del micro.






 ((:-)) ((:-)) ((:-)) muy bien amigo buen proyecto. ((:-)) ((:-)) ((:-))
Título: Re: Receptor DMX (DMX512)
Publicado por: Nocturno en 27 de Septiembre de 2013, 13:01:23
¡Magnífico!, a ver si nos muestras un vídeo del cacharro funcionando.
Título: Re: Receptor DMX (DMX512)
Publicado por: Jansen en 09 de Febrero de 2014, 06:23:01
Hola me presento soy Jansen y bueno queria gradecer el buen trabajo que haceis con estos proyectos y queria preguntar una duda si me lo permiten, el codigo me da error desde que invoco el pic a usar con el #include <16F628A> y bueno ya todos los errores arraid de esto, he de mencionar que en c no estoy puesto solo arduino pero seria una gran ayuda que puedan resolverme el problema, gracias de antemano  :)
Título: Re: Receptor DMX (DMX512)
Publicado por: dinoelectro en 09 de Diciembre de 2014, 22:49:46
Hola frahg1, primero que nada, no es mio, es de todos..
Segundo, para agregarle direccion, hay una forma muy simple que solo ocupa dos pines. Te paso el esquematico, la rutina la tendras que crear vos, pero mirarando el diagrama lo entenderas.
(ver imagen adjunta)
este esta publicado en este sitio: http://picprojects.org.uk/projects/dmx/dmx688/index.htm, para el que no lo conozca se los recomiendo.

Por ultimo quiero hacer una aclaracion, no tomen este circuito como algo profesional. Yo lo abandone por que no estaba muy contento con su funcionamiento. para ese  pic generar 9 pwm por soft y procesar la trama dmx es mucho. Alguien con mas experiencia tal vez pueda corregirme.
Para mi la clave esta en utilizar otros medios para generar los pwm como por ejemplo con TLC5940.

Saludos y suerte!

Yo tampoco he logrado generar PWM y procesar la trama DMX con el mismo PIC16FXXX... Pero utilice un PIC32 que posee 6 PWM embebidos y bueno fue una solucion resulto mucho mas mas economica que comprar el TLC5940.. saludos!
Título: Re: Receptor DMX (DMX512)
Publicado por: alexhumbertoa en 02 de Enero de 2015, 12:23:22
Yo logré generar 20 salidas pwm por soft comandadas por trama DMX usando interrupciones, en un pic16f877
Título: Re: Receptor DMX (DMX512)
Publicado por: Joseph90 en 28 de Abril de 2015, 10:06:42
Yo logré generar 20 salidas pwm por soft comandadas por trama DMX usando interrupciones, en un pic16f877

Hola amigo, pordías por favor decirme como lo hiciste?.
El tema es que estoy tratando de hacer un dimmer de 8 canales con un PIC16F74 a 20 Mz, pero la parte de recepción DMX consume mucho tiempo y al desatenderme el micro tan solo 1us la parte de dimmerizacion no me queda bien. Lo que estoy tratando de hacer es mi programa más eficiente....
suldos desde CUBA.......   
Título: Re: Receptor DMX (DMX512)
Publicado por: KILLERJC en 28 de Abril de 2015, 10:16:04
A mi entender el dimmer lo harias con el modulo PWM, al menos con el pic16f877, asi que por mas que desatendas la salida, el modulo va a seguir funcionando.

El tema es que tu PIC no posee eso o queres hacer muchas mas. Pienso que estarias jugando con las interrupciones de timers para realizar un dimmer.
Es decir hacer una interrupcion corta que te sirva para ambos, tanto para generar el PWM como para verificar el DMX
Título: Re: Receptor DMX (DMX512)
Publicado por: Joseph90 en 28 de Abril de 2015, 10:21:31
Exactamente amigo KILLERJC, todo el programa juega con interrupciones externas, interrupciones del puerto serie e interrupciones de timers, el asunto es que cuando el micro cae en una interrupcion por puerto serie demora mucho tiempo ahí y me demora aunque sea por solo unos us el timer y por tanto la dimmerización.
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 28 de Abril de 2015, 15:01:44
Hola Joseph90, podria especificar que clase de dimmer esta haciendo o quiere hacer?
Dimmer para Lamparas incandecente o simplemente Leds Dimmer?
yo he hecho Led Dimmer sin tener que usar interrupciones externas.
para que la necesitas las interrupciones externas?
te aclaro, los Dimmer ProFi, no necesitan interrupciones externas porque entonce no seria DMX standard. ;-)

Saludos
Título: Re: Receptor DMX (DMX512)
Publicado por: KILLERJC en 28 de Abril de 2015, 23:03:08
Es que si. Si posee otras interrupciones entonces va a tener problemas, en especial por que el micro no es capaz de atender varias interrupciones o no posee una prioridad de interrupcion.
La que quedaba era no usar la interrupcion de la UART y de los pines de entrada. Y en main un bucle leyendo sus flags y actuar acorde a lo que se necesita, pero jamas interrumpiendo la generacion del timer.
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 29 de Abril de 2015, 02:44:20
habia que saber si usa la interrupciones como Transceptor, si es asi puede usar todas las interrupciones que quiere siempre y cuando no afecte la trama, no olvidemos que el DMX se trata de un Micro Maestros (Transmisor) y varios esclavos o uno(Receptor), los Sistema Maestro en Algunas Mesas de luces se pueden configurar de muchas manera,Strobo,Flash,Secuenciar,Dimmer etc. Aqui lo aclara muy bien el protocologo (http://www.dsi.fceia.unr.edu.ar/downloads/InfoElectronica/Proyecto%20IE%20DMX512.pdf)

Saludos
Título: Re: Receptor DMX (DMX512)
Publicado por: Joseph90 en 06 de Mayo de 2015, 11:40:28
Siento mucho la demora amigos, no he podido entrar al foro hasta ahora, lo q quiero hacer es un dimmer de ocho canales con recepcion DMX para luces profecionales PAR64, ya tengo uno hecho de 8 canales de salida de potencia de los cuales se controla la intensidad de 4 y 4 solamente y funciona de maravilla.
El asunto es que ahora estoy enfrascado en hacer un dimmer de potencia de 8 canales DMX512 lo más profesional posible, la parte DMX y la parte de dimmerizacion funciona bien, pero lograr poner a trabajar las 2 cosas en un micro tan pobre es bastante dificil.

Según KillerJC:
Citar
La que quedaba era no usar la interrupcion de la UART y de los pines de entrada. Y en main un bucle leyendo sus flags y actuar acorde a lo que se necesita, pero jamas interrumpiendo la generacion del timer.

Esa idea puede funcionar, gracias KillerJC  :P, solo me preocuparía entonces que no se perdieran datos de la trama DMX, no sé, todo lo he hecho en la computadora y todavía no he implementado nada porque la computadora de mi casa se me rompió pero espero arreglar eso pronto, gracias...
Título: Re: Receptor DMX (DMX512)
Publicado por: KILLERJC en 06 de Mayo de 2015, 11:47:39
Esa idea puede funcionar, gracias KillerJC  :P, solo me preocuparía entonces que no se perdieran datos de la trama DMX, no sé, todo lo he hecho en la computadora y todavía no he implementado nada porque la computadora de mi casa se me rompió pero espero arreglar eso pronto, gracias...

No deberia, ya que la interrupcion del timer deberia ser rapida, algunas intrucciones nomas, si antes te funcionaba y no perdias ningun dato entre dato y dato deberia funcionar ahora
Título: Re: Receptor DMX (DMX512)
Publicado por: Joseph90 en 08 de Mayo de 2015, 14:18:32
Coincido contigo KillerJC la interrupción del timer es corta solo incrementar un contador y chequear si debo activar el disparo en algún canal, en cuanto tenga la computadora lista armo el circuito y lo pruebo en vivo.
Veo que te interesa el mundo de las luces, a mi también, tengo en mente hacer este dimmer lo más profesional posible y luego hacerme una consola de luces, tengo dos chasis sin las placas controladoras, una de 8 y otra de 24 canales, todavía no me he decido por ninguna pues estoy pensando cual sería mejor hacer. En cuanto termine este proyecto lo publico....... gracias... 
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 08 de Mayo de 2015, 15:38:13
Hola Joseph90, hasta ahora no he comorendido lo que quiere hacer,
Led dmx512 Dimmer?
o Lampara dmx512 dimmer?
para hacer lamparas dmxdimmer hay que tener muy en claro de cuantos Vatios lo va hacer, porque de aqui dependera como va hacer el Cruces por ceros y no solo eso, las mayorias de los light dimmer Profi, usan los que se llama un Preheat, eso quiere decir que los dimmer siempre estan en casi 1% encendido, nunca se te ocurra encender un Grupo de lampara si hacer ese preajuste, los light dmx512 dimmer los mas modernos llevan un Display(LCD) para configurar los parametro de como lo va usar, porque se puede usar como modo ON/OFF y algunos otros modos que ahora mismo no recuerdo.
tambien deberia pensar como va a repartir la cargas, hasta ahora yo he usado 12 canales Dmx512 Dimmer en 3 Fases y 32Amp, osea cada canales 2000vatios-
a ver si nos explica como lo va querer hacer.
Saludos

Título: Re: Receptor DMX (DMX512)
Publicado por: Joseph90 en 11 de Mayo de 2015, 10:35:06
Hola stk500, lo que quiero hacer es un dimmer para PAR64, o sea 1 KW controlado por DMX512. Ya hice uno de 2 canales muy chulo con preheat y todo eso que variaban en funcion de 2 fader (potenciómetros lineales), pero ahora quiero hacer algo más serio, 8 canales controlados por DMX512. :mrgreen: :mrgreen: :mrgreen:

Citar
hasta ahora yo he usado 12 canales Dmx512 Dimmer en 3 Fases y 32Amp, osea cada canales 2000vatios-
a ver si nos explica como lo va querer hacer.

cuando te refieres que has usado es que has empleado equipos profesionales o los has hecho tú?
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 11 de Mayo de 2015, 11:55:34
Yo me refiero profesionales, hacer un dimmer algo complejo a la hora de elegir el material, por ejemplo,los Triac,Fusible,Bobina de cargas etc.

Saludos
Título: Re: Receptor DMX (DMX512)
Publicado por: Joseph90 en 11 de Mayo de 2015, 14:13:51
En realidad no es tan difícil. El dimmer de 2 canales anterior que hice lo hice con componentes recuperados de placas (aquí no hay tiendas de electrónica :( :( :( :( :( ) y funcionaba perfecto, solo un problema: ruido. Como era para trabajar en conjunto con audio el ruido de alta frecuencia se metía en el equipo de audio y era un poquito molesto. La solución según la literatura es colocar una bobina en serie con la carga pero luego de unas pruebas sin quitar el ruido me encontré colega que me regaló ocho módulos de potencia con tiacs, optotriac y bobinas incluidas y al probarlo con el sistema programado por mí: vaya como si fuera original  :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:.

Saludos.....
Título: Re: Receptor DMX (DMX512)
Publicado por: stk500 en 11 de Mayo de 2015, 15:04:01
Ya te dije que no es nada facil, por eso te dije Bobina de choque y Filtro antiparasitos.  :P
Saludos
Título: Re: Receptor DMX (DMX512)
Publicado por: Joseph90 en 11 de Mayo de 2015, 15:26:28
Cierto, de cualquier modo ya tengo eso original de frábica.. :-) :-) :-) :-) :-).
Saludos...
Título: Re:Receptor DMX (DMX512)
Publicado por: JuaniButtignol en 24 de Noviembre de 2015, 01:47:25
Bueno a verlo
Título: Re:Receptor DMX (DMX512)
Publicado por: lagruya en 06 de Mayo de 2016, 19:57:46
Finalmente me dedique a el proyecto del receptor que tan generosamente introdujo el maestro Nocturno!!!!
Lo pase a xc8 y lo implemente con un pic18f4550.

Les dejo un videito, del circuito montado en protoboard y conectado a una consolita de 192 canales, es una consola con algunas limitaciones y con algun delay pero para la prueba sirve mas que de sobra:

Cuando haga el impreso definitivo subo mas fotos.
Abrazo!

Título: Re:Receptor DMX (DMX512)
Publicado por: Nocturno en 07 de Mayo de 2016, 01:28:57
¡Qué bueno!, me da mucha alegría ver que ha sido útil después de tanto tiempo.