Arduino DMX shield code

Hi,

the code given in arduino play ground for arduino DMX shield is not working. Tell me the necessary changes.

the code is:

/* DMX Shift Out for arduino - 004 and 005


  • Shifts data in DMX format out to DMX enabled devices
  • it is extremely restrictive in terms of timing. Therefore
  • the program will stop the interrupts when sending data
  • The elektronic foundation for DMX is RS 485, so you have to use
  • a MAX-485 or a 75176.
  • wirring for sending dmx with a MAX-485
    1 - RO - Receiver Output --- set to ground with a 100 ohm resistor
    2 - RE - Receiver Output Enable -- set to ground
    3 - DE - Driver Output Enable -- set to 5v
    4 - DI - Driver Input -- Input from Arduino
    5 - GnD - Ground Connection -- set to ground -- refence for the DMX singal --- (DMX pin 1)
    6 - A - Driver Output / Receiver Input -- DMX Signal (hot)------------------ (DMX pin 3)
    7 - B - Driver Output / Receiver Input -- DMX Signal inversion ( cold)------ (DMX pin 2)
    8 - Vcc - Positive Supply -- 4,75V < Vcc < 5,25V
  • Every dmx packet contains 512 bytes of information (for 512 channels).
  • The start of each packet is market by a start byte (shiftDmxOut(sig,0);),
  • you should always send all 512 bytes even if you don*t use all 512 channels.
  • The time between every dmx packet is market by a break
  • between 88us and 1s ( digitalWrite(sig, LOW); delay(10):wink:
  • (cleft) 2006 by Tomek Ness and D. Cuartielles
  • K3 - School of Arts and Communication
  • fhp - University of Applied Sciences
  • http://www.arduino.cc
  • http://www.mah.se/k3
  • http://www.design.fh-potsdam.de
  • @date: 2006-09-30
  • @idea: Tomek Ness
  • @code: D. Cuartielles and Tomek Ness
  • @acknowledgements: Johny Lowgren for his DMX devices

/
int sig = 11; // signal (hot / dmx pin 3)
int count = 0;
int swing = 0;
int updown = 0;
/
Sends a DMX byte out on a pin. Assumes a 16 MHz clock.

  • Disables interrupts, which will disrupt the millis() function if used
  • too frequently. */
    void shiftDmxOut(int pin, int theByte)
    {
    int theDelay = 1;
    int count = 0;
    int portNumber = port_to_output[digital_pin_to_port[pin].port];
    int pinNumber = digital_pin_to_port[pin].bit;
    // the first thing we do is to write te pin to high
    // it will be the mark between bytes. It may be also
    // high from before
    _SFR_BYTE(_SFR_IO8(portNumber)) |= _BV(pinNumber);
    delayMicroseconds(20);
    // disable interrupts, otherwise the timer 0 overflow interrupt that
    // tracks milliseconds will make us delay longer than we want.
    cli();
    // DMX starts with a start-bit that must always be zero
    _SFR_BYTE(_SFR_IO8(portNumber)) &= ~_BV(pinNumber);
    //we need a delay of 4us (then one bit is transfert)
    // at the arduino just the delay for 1us is precise every thing between 2 and 12 is jsut luke
    // to get excatly 4us we have do delay 1us 4 times
    delayMicroseconds(theDelay);
    delayMicroseconds(theDelay);
    delayMicroseconds(theDelay);
    delayMicroseconds(theDelay);
    for (count = 0; count < 8; count++) {
    if (theByte & 01) {
    _SFR_BYTE(_SFR_IO8(portNumber)) |= _BV(pinNumber);
    }
    else {
    _SFR_BYTE(_SFR_IO8(portNumber)) &= ~_BV(pinNumber);
    }
    delayMicroseconds(theDelay);
    delayMicroseconds(theDelay);
    delayMicroseconds(theDelay);
    delayMicroseconds(theDelay);
    theByte>>=1;
    }
    // the last thing we do is to write the pin to high
    // it will be the mark between bytes. (this break is have to be between 8 us and 1 sec)
    _SFR_BYTE(_SFR_IO8(portNumber)) |= _BV(pinNumber);
    // reenable interrupts.
    sei();
    }
    void setup() {
    pinMode(sig, OUTPUT);
    digitalWrite(13, HIGH);
    }
    void loop() {
    // sending the break (the break can be between 88us and 1sec)
    digitalWrite(sig, LOW);
    delay(10);
    //sending the start byte
    shiftDmxOut(sig,0);
    //sending the 512 bytes for the channels
    shiftDmxOut(sig, 150); //1
    shiftDmxOut(sig, 150); //2
    shiftDmxOut(sig, 150); //3
    shiftDmxOut(sig, 150); //4
    for (count = 1; count<=508; count++){
    shiftDmxOut(sig, 0);
    }
    }

Tell me the necessary changes.

Tell us how it is not working. Presumably, the people whose names are in the code verified that it DOES work, if you connect the shield correctly to the correct kind of device.

I am getting the following error:

sketch_nov25a.cpp: In function 'void shiftDmxOut(int, int)':
sketch_nov25a:49: error: 'port_to_output' was not declared in this scope
sketch_nov25a:49: error: 'digital_pin_to_port' was not declared in this scope

How much searching for a solution did you do? In a few seconds, I found this:
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1205193597/1