|
|
View previous topic :: View next topic |
Author |
Message |
Roberto da Rivoli
Joined: 09 Feb 2004 Posts: 37 Location: TURIN -Italy-
|
DMX Slave device |
Posted: Thu Apr 20, 2017 4:18 am |
|
|
In one of my devices I'm using a receiving routine that I do not fully satisfy, and I wanted to improve the product using CCS's DMX libraries. Then the Hardware is working.
With CCS routines I can not receive DMX data and in debug I do not enter the interrupt.
Does anyone have a tip?
Code: |
/////////////////////////////////////////////////////////////////////////
//// DERIVATE ex_dmx_slave.c ////
/////////////////////////////////////////////////////////////////////////
#include <24EP32GP204.h>
#device ICD=TRUE
#device ICSP=2
#fuses NOWDT
#use delay(clock=140MHz,crystal=8MHz)
#pin_select U2TX=PIN_C8
#pin_select U2RX=PIN_B4
#use rs232(UART2, baud=115200, stream=UART_PORT2)
//#use rs232(UART1,baud=9600, stream=PC)
#pin_select U1RX=PIN_C6
//#use pwm(CCP1, timer=2, frequency=5000, duty=0)
//Setup Tick timer for DMX Driver
#use timer(timer=1, tick=1us, bits=16)
typedef unsigned int16 TICK;
TICK GetTickDifference(TICK Current, TICK Previous)
{
return(Current - Previous);
}
//Required Macros for DMX Driver when using it for a slave device
#define DMX_TICK TICK
#define DMXGetTick() get_ticks()
#define DMXGetTickDifference(x, y) GetTickDifference(x, y)
#define DMX_TICKS_PER_MS (TICKS_PER_SECOND / 1000)
//Setup DMX Driver Settings
#define DMX_TYPE DMX_SLAVE_DEVICE
#define DMX_INT INT_RDA
#define DMX_RCV PIN_C6
#define DMX_START_CHANNEL 1
#define DMX_CHANNELS 2 //16 bit LSB first
//Include the DMX Driver
#include <dmx.c>
void main()
{
unsigned int16 PWMDuty;
unsigned int16 pPWMDuty = 0;
delay_ms(100);
//printf("\r\nex_dmx_slave.c\r\n");
putchar('R',UART_PORT2);
putchar('O',UART_PORT2);
putchar('B',UART_PORT2);
putchar('Y',UART_PORT2);
//Initialize the DMX Driver
DMXInit();
//Enable Global Interrupts
enable_interrupts(GLOBAL);
while(TRUE)
{
//Get for new DMX Data
if(DMXKbhit())
{
putchar('Y',UART_PORT2);
//Get new DMX Data
DMXGetd(&PWMDuty, DMX_CHANNELS);
if(PWMDuty != pPWMDuty)
{
if(PWMDuty > 1000)
PWMDuty = 1000;
putchar((((PWMDuty>>8) & 0xFF)),UART_PORT2);
putchar(((PWMDuty & 0xFF)),UART_PORT2);
// pwm_set_duty_percent(PWMDuty);
pPWMDuty = PWMDuty;
}
}
}
} |
|
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9241 Location: Greensville,Ontario
|
|
Posted: Thu Apr 20, 2017 6:45 am |
|
|
OK, it's be 2 decades since I built/used DMX but back then it was 250KB and a PIC UART could easily be setup to run DMX so I don't know why you've got a timer and other code doing what the HW UART can....
Jay |
|
|
Roberto da Rivoli
Joined: 09 Feb 2004 Posts: 37 Location: TURIN -Italy-
|
DMX Slave device dont't work PIC24EP32GP |
Posted: Thu Apr 20, 2017 6:56 am |
|
|
As you can see from the posted code, it's exactly the official CCS example, where I just changed the processor and set the peripherals I'm using, if I re-run everything properly, I'll integrate it into the project. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19535
|
|
Posted: Thu Apr 20, 2017 8:35 am |
|
|
CCS dropped that example, many years ago.
What DMX protocol are you using?. The original CCS example, was for an early DMX512 variant, not the current DMX512-A.
The example has never been updated....
DMX512-A, is quite easy to do with the hardware UART. What you have to do, is set it up to send at 250000bps, and select 9bit operation. DMX uses 8bits, with 2 stop bits, and to cheat the UART into doing this, you use 9bits, and set the 9th bit in the data you send. This gives the required extra stop bit.
The reason the timer was used, was to handle the timings for the break marker at the start of the packet.
Honestly, just write your own. This is not an example you should be using. |
|
|
Roberto da Rivoli
Joined: 09 Feb 2004 Posts: 37 Location: TURIN -Italy-
|
dmx 512-A |
Posted: Thu Apr 20, 2017 9:18 am |
|
|
I use DMX512-A "ANSI E1.11-2008 (R2013)"
Is there an example of an updated code sample for correct reception of characters? |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9241 Location: Greensville,Ontario
|
|
Posted: Thu Apr 20, 2017 5:07 pm |
|
|
Have a read of Microchip's AN1659 DMX512a, you can download the sources from them too. You WILL have to convert into CCS C, fairly easy to do. Probably less than 2 coffee pots will get you 'up and running'.
I know I have my code here 'somewhere'.. but after 20+ years..it'd be quicker just to cut new code !
Jay |
|
|
Roberto da Rivoli
Joined: 09 Feb 2004 Posts: 37 Location: TURIN -Italy-
|
dmx 512-A receiver |
Posted: Fri Apr 21, 2017 1:47 am |
|
|
I downloaded the AN1659, now I try to implement the receive routine. Let's see if it works. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|