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)
- (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);
}
}