Autor Tema: Receptor DMX (DMX512)  (Leído 162807 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Receptor DMX (DMX512)
« Respuesta #105 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.

Desconectado jahir golbem

  • PIC10
  • *
  • Mensajes: 18
Re: Receptor DMX (DMX512)
« Respuesta #106 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...

Desconectado jahir golbem

  • PIC10
  • *
  • Mensajes: 18
Re: Receptor DMX (DMX512)
« Respuesta #107 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....

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Receptor DMX (DMX512)
« Respuesta #108 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?

Desconectado jahir golbem

  • PIC10
  • *
  • Mensajes: 18
Re: Receptor DMX (DMX512)
« Respuesta #109 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.......

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Receptor DMX (DMX512)
« Respuesta #110 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.

Desconectado jahir golbem

  • PIC10
  • *
  • Mensajes: 18
Re: Receptor DMX (DMX512)
« Respuesta #111 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...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Receptor DMX (DMX512)
« Respuesta #112 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/

Desconectado jahir golbem

  • PIC10
  • *
  • Mensajes: 18
Re: Receptor DMX (DMX512)
« Respuesta #113 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...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Receptor DMX (DMX512)
« Respuesta #114 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.

Desconectado jahir golbem

  • PIC10
  • *
  • Mensajes: 18
Re: Receptor DMX (DMX512)
« Respuesta #115 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);
   }
}

Desconectado Fermino

  • PIC10
  • *
  • Mensajes: 4
Re: Receptor DMX (DMX512)
« Respuesta #116 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



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.

Desconectado jahir golbem

  • PIC10
  • *
  • Mensajes: 18
Re: Receptor DMX (DMX512)
« Respuesta #117 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..

Desconectado Limako

  • PIC10
  • *
  • Mensajes: 3
Re: Receptor DMX (DMX512)
« Respuesta #118 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
« Última modificación: 30 de Agosto de 2013, 10:26:10 por Limako »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: Receptor DMX (DMX512)
« Respuesta #119 en: 30 de Agosto de 2013, 13:46:22 »
El SN75176 es perfectamente válido. Suerte