Pages: [1]   Go Down
Author Topic: TLC 5940 & DMX  (Read 538 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 106
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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.
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 106
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aucune piste ?...
Logged

FRANCE
Offline Offline
Sr. Member
****
Karma: 0
Posts: 338
Arduino rocks .... oulalalalala
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

eventuellement rajouter un cast:
Code:
Tlc.set( i, (int)(ArduinoDmx0.RxBuffer[i])*16));
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 106
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
Logged

Pages: [1]   Go Up
Jump to: