Go Down

Topic: TLC 5940 & DMX (Read 797 times) previous topic - next topic

bouault

Bonjour à tous !
J'essaie de piloter un Tlc en DMX; pour la partie DMX j'utilise la librairie DMX four universes :
http://www.deskontrol.net/blog/arduino-four-universes-dmx-512-library/
et pour la partie TLC :
http://code.google.com/p/tlc5940arduino/

Le code que j'ai écris fonctionne ... pendant quelques minutes! Au bout d'un moment les leds commencent à scintiller puis il n'y a plus de graduation mais du off/on.
Le câblage ne semble pas en cause car les codes d'exemple (TLC ou DMX) fonctionnent parfaitement.
Voici le code:
Code: [Select]

#include <lib_dmx.h>
#include "Tlc5940.h"

int address = 1;

#define    DMX512     (0)    // (250 kbaud - 2 to 512 channels) Standard USITT DMX-512


void setup()
{

   
/////////////////////////////////////////////////////////////////////////////
/* Call Tlc.init() to setup the tlc.
     You can optionally pass an initial PWM value (0 - 4095) for all channels.*/
  Tlc.init(0);

 
////////////////////////////////////////////////////////////////////////////
//SetUp DMX
  ArduinoDmx0.set_control_pin(2);    // Arduino output pin for MAX485 input/output control (connect to MAX485 pins 2-3)
  ArduinoDmx0.set_rx_address(address);      // set rx0 dmx start address
  ArduinoDmx0.set_rx_channels(16);     // number of rx channels
// *** NEW *** attach RX service routine here, fired when all channels in one universe are received. 
  ArduinoDmx0.attachRXInterrupt  (frame_received);
  ArduinoDmx0.init_rx(DMX512);        // starts universe 0 as rx, NEW Parameter DMX mode
}

void loop()
{
}

void frame_received(uint8_t universe) // Custom ISR: fired when all channels in one universe are received
{
  if (universe == 0) // USART0
  {
    Tlc.clear();
    /* Tlc.clear() sets all the grayscale values to zero, but does not send
       them to the TLCs.  To actually send the data, call Tlc.update() */
    for(int i=0;i<16;i++)
    {
     Tlc.set( i, (ArduinoDmx0.RxBuffer[i])*16);
    }
  /* Tlc.update() sends the data to the TLCs.  This is when the LEDs will
  actually change. */
    Tlc.update();
  }
}

Si quelqu'un a une piste...
Merci d'avance,
Jacques.

bouault


karistouf

essayes de sortir le TLC update du timer, place le dans la loop.

eventuellement rajouter un cast:
Code: [Select]

Tlc.set( i, (int)(ArduinoDmx0.RxBuffer[i])*16));

bouault

Bravo Christoph!
Ta deuxième proposition semble être la solution.
Au final il me semble que l'interruption ne sert à rien, ça marche aussi bien avec tout dans la loop :
Code: [Select]
void loop()
{
  for(int i=0;i<16;i++)
  {
   Tlc.set( i, (int)(ArduinoDmx0.RxBuffer[i])*sqrt(ArduinoDmx0.RxBuffer[i]));
  }
  Tlc.update();
}

Il y a encore malgré tout des petits flashs au démarrage...
Merci.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy