Go Down

Topic: Error en código Arduino DMX (Read 214 times) previous topic - next topic

guezro

Nov 23, 2017, 08:55 am Last Edit: Nov 23, 2017, 03:48 pm by guezro
Estoy utilizando Arduino como DMX con la libreria lib_dmx.h (de Toni Merino) y mi duda es que en la parte del código ArduinoDmx0.set_tx_address(1); se guarda supuestamente en la dirección 1, pero al leer con otro Arduino UNO aunque ponga la dirección que quiera, sigue leyendo.  
ArduinoDmx0.set_rx_address(1); ,
ArduinoDmx0.set_rx_address(2); o
ArduinoDmx0.set_rx_address(n);
Como podría mandar desde el maestro a distintos dispositivos esclavos conectados y leer desde éstos?
Es decir, como asignar una dirección a los dispositivos esclavos y escribir a ellos desde el maestro.
Code: [Select]

//Código transmision
#include <lib_dmx.h>
#define DMX512 (0)
int i;

void setup() {
 
ArduinoDmx0.set_tx_address(1);
ArduinoDmx0.set_tx_channels(512);
ArduinoDmx0.init_tx(DMX512);
}

void loop() {
  
 for(i=0;i<512;i++)
 {
  ArduinoDmx0.TxBuffer[i] = 255;
}
}


y al usar Arduino Mega2560 me da este error:

Code: [Select]

//ERROR
C:\Users\Desktop\PROGRAMAS\arduino-1.8.3\libraries\Dmx/lib_dmx.h:77:12: error: attempt to use poisoned "SIG_USART0_RECV"

       void SIG_USART0_RECV  (void) __attribute__((__always_inline__));

            ^

C:\Users\Desktop\PROGRAMAS\arduino-1.8.3\libraries\Dmx/lib_dmx.h:78:12: error: attempt to use poisoned "SIG_USART0_TRANS"

       void SIG_USART0_TRANS (void) __attribute__((__always_inline__));

            ^

C:\Users\Desktop\PROGRAMAS\arduino-1.8.3\libraries\Dmx/lib_dmx.h:81:12: error: attempt to use poisoned "SIG_USART1_RECV"

       void SIG_USART1_RECV  (void) __attribute__((__always_inline__));

            ^

C:\Users\Desktop\PROGRAMAS\arduino-1.8.3\libraries\Dmx/lib_dmx.h:82:12: error: attempt to use poisoned "SIG_USART1_TRANS"

       void SIG_USART1_TRANS (void) __attribute__((__always_inline__));

            ^

C:\Users\Desktop\PROGRAMAS\arduino-1.8.3\libraries\Dmx/lib_dmx.h:85:12: error: attempt to use poisoned "SIG_USART2_RECV"

       void SIG_USART2_RECV  (void) __attribute__((__always_inline__));

            ^

C:\Users\Desktop\PROGRAMAS\arduino-1.8.3\libraries\Dmx/lib_dmx.h:86:12: error: attempt to use poisoned "SIG_USART2_TRANS"

       void SIG_USART2_TRANS (void) __attribute__((__always_inline__));

            ^

C:\Users\Desktop\PROGRAMAS\arduino-1.8.3\libraries\Dmx/lib_dmx.h:89:12: error: attempt to use poisoned "SIG_USART3_RECV"

       void SIG_USART3_RECV  (void) __attribute__((__always_inline__));

            ^

C:\Users\Desktop\PROGRAMAS\arduino-1.8.3\libraries\Dmx/lib_dmx.h:90:12: error: attempt to use poisoned "SIG_USART3_TRANS"

       void SIG_USART3_TRANS (void) __attribute__((__always_inline__));

            ^

C:\Users\Desktop\PROGRAMAS\arduino-1.8.3\libraries\Dmx/lib_dmx.h:106:19: error: attempt to use poisoned "SIG_USART0_RECV"

       friend void SIG_USART0_RECV  (void);

                   ^

C:\Users\Desktop\PROGRAMAS\arduino-1.8.3\libraries\Dmx/lib_dmx.h:107:19: error: attempt to use poisoned "SIG_USART0_TRANS"

       friend void SIG_USART0_TRANS (void);

                   ^

C:\Users\Desktop\PROGRAMAS\arduino-1.8.3\libraries\Dmx/lib_dmx.h:110:19: error: attempt to use poisoned "SIG_USART1_RECV"

       friend void SIG_USART1_RECV  (void);

                   ^

C:\Users\Desktop\PROGRAMAS\arduino-1.8.3\libraries\Dmx/lib_dmx.h:111:19: error: attempt to use poisoned "SIG_USART1_TRANS"

       friend void SIG_USART1_TRANS (void);

                   ^

C:\Users\Desktop\PROGRAMAS\arduino-1.8.3\libraries\Dmx/lib_dmx.h:114:19: error: attempt to use poisoned "SIG_USART2_RECV"

       friend void SIG_USART2_RECV  (void);

                   ^

C:\Users\Desktop\PROGRAMAS\arduino-1.8.3\libraries\Dmx/lib_dmx.h:115:19: error: attempt to use poisoned "SIG_USART2_TRANS"

       friend void SIG_USART2_TRANS (void);

                   ^

C:\Users\Desktop\PROGRAMAS\arduino-1.8.3\libraries\Dmx/lib_dmx.h:118:19: error: attempt to use poisoned "SIG_USART3_RECV"

       friend void SIG_USART3_RECV  (void);

                   ^

C:\Users\Desktop\PROGRAMAS\arduino-1.8.3\libraries\Dmx/lib_dmx.h:119:19: error: attempt to use poisoned "SIG_USART3_TRANS"

       friend void SIG_USART3_TRANS (void);

                   ^
Utilizando biblioteca Dmx en carpeta: C:\Users\Desktop\PROGRAMAS\arduino-1.8.3\libraries\Dmx (legacy)
exit status 1
Error compilando para la tarjeta Arduino/Genuino Mega or Mega 2560.

Gracias, un saludo.

surbyte

Cuando se trae un problema como el que presentas, quienes intentamos ayudarte tenemos que reproducir la falla. Pero tu no has puesto un enlace a la librería para poder repetir con precisión la misma.

Asi que a la espera de ese dato, podremos comenzar con las respuestas.

guezro

Ya he puesto la librería que he usado.
Gracias y perdón por las molestias

surbyte

Lo he compilado con un UNO y compila sin fallos


Code: [Select]
El Sketch usa 2.198 bytes (7%) del espacio de almacenamiento de programa. El máximo es 30.720 bytes.
Las variables Globales usan 61 bytes (2%) de la memoria dinámica, dejando 1.987 bytes para las variables locales. El máximo es 2.048 bytes.


con un Mega da tu error.

Code: [Select]
In file included from C:\Users\Bichy\AppData\Local\Temp\arduino_modified_sketch_489392\Prueba.ino:3:0:

D:\Documentos\Arduino\libraries\Dmx/lib_dmx.h:77:12: error: attempt to use poisoned "SIG_USART0_RECV"

       void SIG_USART0_RECV  (void) __attribute__((__always_inline__));

            ^

D:\Documentos\Arduino\libraries\Dmx/lib_dmx.h:78:12: error: attempt to use poisoned "SIG_USART0_TRANS"

       void SIG_USART0_TRANS (void) __attribute__((__always_inline__));

            ^

D:\Documentos\Arduino\libraries\Dmx/lib_dmx.h:81:12: error: attempt to use poisoned "SIG_USART1_RECV"

       void SIG_USART1_RECV  (void) __attribute__((__always_inline__));

            ^

D:\Documentos\Arduino\libraries\Dmx/lib_dmx.h:82:12: error: attempt to use poisoned "SIG_USART1_TRANS"

       void SIG_USART1_TRANS (void) __attribute__((__always_inline__));

            ^

D:\Documentos\Arduino\libraries\Dmx/lib_dmx.h:85:12: error: attempt to use poisoned "SIG_USART2_RECV"

       void SIG_USART2_RECV  (void) __attribute__((__always_inline__));

            ^

D:\Documentos\Arduino\libraries\Dmx/lib_dmx.h:86:12: error: attempt to use poisoned "SIG_USART2_TRANS"

       void SIG_USART2_TRANS (void) __attribute__((__always_inline__));

            ^

D:\Documentos\Arduino\libraries\Dmx/lib_dmx.h:89:12: error: attempt to use poisoned "SIG_USART3_RECV"

       void SIG_USART3_RECV  (void) __attribute__((__always_inline__));

            ^

D:\Documentos\Arduino\libraries\Dmx/lib_dmx.h:90:12: error: attempt to use poisoned "SIG_USART3_TRANS"

       void SIG_USART3_TRANS (void) __attribute__((__always_inline__));

            ^

D:\Documentos\Arduino\libraries\Dmx/lib_dmx.h:106:19: error: attempt to use poisoned "SIG_USART0_RECV"

       friend void SIG_USART0_RECV  (void);

                   ^

D:\Documentos\Arduino\libraries\Dmx/lib_dmx.h:107:19: error: attempt to use poisoned "SIG_USART0_TRANS"

       friend void SIG_USART0_TRANS (void);

                   ^

D:\Documentos\Arduino\libraries\Dmx/lib_dmx.h:110:19: error: attempt to use poisoned "SIG_USART1_RECV"

       friend void SIG_USART1_RECV  (void);

                   ^

D:\Documentos\Arduino\libraries\Dmx/lib_dmx.h:111:19: error: attempt to use poisoned "SIG_USART1_TRANS"

       friend void SIG_USART1_TRANS (void);

                   ^

D:\Documentos\Arduino\libraries\Dmx/lib_dmx.h:114:19: error: attempt to use poisoned "SIG_USART2_RECV"

       friend void SIG_USART2_RECV  (void);

                   ^

D:\Documentos\Arduino\libraries\Dmx/lib_dmx.h:115:19: error: attempt to use poisoned "SIG_USART2_TRANS"

       friend void SIG_USART2_TRANS (void);

                   ^

D:\Documentos\Arduino\libraries\Dmx/lib_dmx.h:118:19: error: attempt to use poisoned "SIG_USART3_RECV"

       friend void SIG_USART3_RECV  (void);

                   ^

D:\Documentos\Arduino\libraries\Dmx/lib_dmx.h:119:19: error: attempt to use poisoned "SIG_USART3_TRANS"

       friend void SIG_USART3_TRANS (void);

                   ^

exit status 1
Error compilación en tarjeta Arduino/Genuino Mega or Mega 2560.

victorjam

Me consumia el error attempt to use poisoned y he mirado el error que es. Resulta que la libreria que usas fue escrita en 2012 y por lo tanto usaría un ide 1.0.x. Mientras la libreria no se ha actualizado el compilador si, redefiniendo nombres de vectores de interrupción y otras mas cosas. Así que los ides actuales te avisa diciendo que esa función esta envenenada y no se usa. Me temo que tendrás que: o usar otra libreria o usar un ide muy anterior.

surbyte

En IDE 1.6.11 no da error usando UNO. Si con MEGA

Lucario448

Has lo siguiente:

En ambos .h y .cpp, cambia SIG_USARTx_RECV por USARTx_RX_vect, y SIG_USARTx_TRANS por USARTx_TX_vect; donde 'x' (la minúscula) es un número del 0 al 3. Puedes usar algún editor de texto para facilitarte los reemplazos.

Tal parece que la librería no se ha actualizado al punto que para el ATmega2560 se usaban antiguas definiciones para rutinas de interrupción en los puertos USART (serial). En el ATmega328 siempre se han llamado USART_RX_vect o USART_TX_vect, por eso no había error.




PD: ¿notáste esto?
Code: [Select]
// *** comment UARTs not used ***
#define        USE_UART0
#define        USE_UART1
#define        USE_UART2
#define        USE_UART3

Eso quiere decir que comentes todos los puertos seriales en desuso (o para uso normal como con los Serial)

victorjam

Más o menos lo que decia, pero con una solución muchos mas elegante.  :)  :)  :)  :)

He probado los cambios que propone Lucario448 y exactamente, ya compila OK en Uno y en Mega. Dejo la libreria como attachment.

Los agradecimientos para Lucario448, yo solo me he limitado a quitarme un reconcome de la cabeza.

guezro

Llevaba unos días comiendome la cabeza.
Muchas gracias a todos, funciona perfectamente.

guezro

Tengo otra duda, que es sobre lo de direccionar varios dispositivos.
Code: [Select]

//TRANSMISOR
#include <lib_dmx.h>


#define DMX512 (0)
int i;


void setup() {
 
ArduinoDmx0.set_tx_address(1); //Aqui supuestamente establecemos la direccion

ArduinoDmx0.set_tx_channels(512);
ArduinoDmx0.init_tx(DMX512); //Iniciar la transmision del universo (0, 1 o 2)
}

void loop() {
   
 for(i=0;i<512;i++)
 {
  ArduinoDmx0.TxBuffer[i] = 255;
}

}

Code: [Select]

RECEPTORES

#include <lib_dmx.h>


#define    DMX512     (0)   

int led1 = A1;
int led2 = A2;
int led3 = A3;
void setup()
{
     
  ArduinoDmx0.set_rx_address(1);      //direccion de entrada DMX para este universo desde 1 a 510 canaless
  ArduinoDmx0.set_rx_channels(100);     // numero de canales de lectura (100 canales)
  ArduinoDmx0.init_rx(DMX512);     

 
 pinMode(led1, OUTPUT);
 pinMode(led2, OUTPUT);
 pinMode(led3, OUTPUT);
}

void loop()
{
 
 
 
   digitalWrite(led1, ArduinoDmx0.RxBuffer[1]);

  digitalWrite(led2, ArduinoDmx0.RxBuffer[2]);

  digitalWrite(led3, ArduinoDmx0.RxBuffer[3]);




Conecto 2 arduinos como receptores y un arduino como transmisor (mediante MAX485).
Mi duda es como elegir a que receptor mandamos la orden, yo pensaba que elegíamos la dirección a la que enviamos mediante ArduinoDmx0.set_tx_address(n); y recibimos  ArduinoDmx0.set_rx_address(n); pero no lo consigo.


surbyte

Quote
yo pensaba que elegíamos la dirección a la que enviamos mediante ArduinoDmx0.set_tx_address(n); y recibimos  ArduinoDmx0.set_rx_address(n); pero no lo consigo.
Estudiaste la librería DMX? digo porque ahi esta la respuesta.

Lucario448

yo pensaba que elegíamos la dirección a la que enviamos mediante ArduinoDmx0.set_tx_address(n); y recibimos  ArduinoDmx0.set_rx_address(n); pero no lo consigo.
Setear las direcciones es solo para indicar desde cuál canal actualizar/transmitir los valores del buffer.
Recuperar/modificar dichos valores se hace con el vector interno del objeto.

Go Up