The DMX512.com Forum
General Category => DMX512 Discussions => Topic started by: tendai02 on November 20, 2009, 09:18:19 AM
-
I am trying to design a simple LED light which can be controlled by dmx512 signal to give out different colors. i have the MAX485 chip for the input to my project( university final year project) and now i am not sure if i can use the 8051 to do the job, that is, to be able to use dip-switches for address setting and be able to get 3 pulse width modulations frm the 8051 to my LED cicuit. i have heard of PIC microntrollers but am not sure which one is best. are these PIC microcontrollers programmable with simple C compilers or they are self programmable? Please help.
-
It is easily possible to do PWM on a PIC chip, and many PICs have support for two channels of PWM in hardware, which makes PWM generation particularly simple; just stuff a few registers and off it goes.
However. most lighting implementations want more than two channels and/or want a lower cost device, so PWM is done in software.
PICs can be programmed using free assembler language tools for Microchip themselves, and a google search will turn up plenty of code to receive DMX512 and do PWM in assembler. There are C compilers available, probably the best known being the CCS (http://www.ccsinfo.com) C compiler, but it is not free.
You can use an 8051 or derivitive to do the job, or a Cypress PSoC, or a Parallex propellor (probably an excellent choice for this application as it can do many PWM channels - up to 32 I think - and the dev tools are free) or indeed pretty much any processor as even the most humble processor available this centrury has enough grunt to do what is a fairly simple computational job.
-
thanks a million for the advice, i will stick to the 8051 since i am a bit firmiliar with the code( C assembler, C compiler and Turbo C) but i think TurboC will be better since i can change it to HEX file and upload to the 8051
i just need 3 channels so i think the 8051 is best for the job
once again thanks a lot
-
i have done a program with .asm extension for my project. i have assembled it and have no errors. after this i created a hex file using Quickbuild in MPLAB IDE version 8.43 and still no problem. the program is supposed to accept a DMX512 signal from a console and then control a PIC16F876 to produce a dimmable light using pulse width modulation.
the programmer i mnaged to get is a Velleman K8048 whic is supposed to program the pic without any problems. when i load the hex file, it does not give me the message to indicate that the pic was programmed successfully.
does my program have anything to do with this?
please help
i have included the .asm file
;**********************************************************************
; This file is a basic code template for assembly code generation *
; on the PIC16F876.
; *
; Filename: xxx.asm *
; Date: *
; File Version: *
; *
; Author: charles01 *
; Files Required: P16F876.INC *
;
; Notes: DMX512 demo program for an LED light to respond to the DMX signal *
;
;*********
list p=16f876 ; list directive to define processor
#include <p16f876.inc> ; processor specific variable definitions
errorlevel -302
;*****
__CONFIG _CP_OFF & _WDT_ON & _BODEN_ON & _PWRTE_ON & _RC_OSC & _WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF
;*****
#define CHANNEL .000 ;select the receiver slot/channel
;*****
;***** VARIABLE DEFINITIONS
w_temp EQU 0x7E ; variable used for context saving
status_temp EQU 0x7F ; variable used for context saving
CBLOCK 0x20
CountH ;16-bit counter
CountL
RxBuffer: .512 ;512 bytes buffer allocation
ENDC
;**********************************************************************
ORG 0x000 ; processor reset vector
clrf PCLATH ; ensure page bits are cleared
goto main ; go to beginning of program
;*****
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move status register into W register
movwf status_temp ; save off contents of STATUS register
; isr code can go here or be located as a call subroutine elsewhere
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
;*****
main
call SetupSerial ;Setup Serial port and buffers
;******************************************************************************
Start
; first loop, synchronizing with the transmitter
WaitBreak
btfsc PIR1,RCIF ; if a byte is received correctly
movf RCREG,W ; discard it
btfss RCSTA,FERR ; else
goto WaitBreak ; continue waiting until a frame error is detected
movf RCREG,W ; read the Receive buffer to clear the error condition
;second loop, waiting for the START code
WaitForStart
btfss PIR1,RCIF ; wait until a byte is correctly received
goto WaitForStart
btfsc RCSTA,FERR
goto WaitForStart
movf RCREG,W
; check for the START code value, if it is not 0, ignore the rest of the frame
andlw 0xff
bnz Start ; ignore the rest of the frame if not zero
; init receive counter and buffer pointer
clrf CountL
clrf CountH
;; clrf RxBuf
clrf RCREG; third loop, receiving 512 bytes of data
WaitForData
btfsc RCSTA,FERR ; if a new framing error is detected (error or short frame)
goto RXend ; the rest of the frame is ignored and a new synchronization is
; attempted
btfss PIR1,RCIF ; wait until a byte is correctly received
goto WaitForData ;
movf RCREG,W ; MoveData
movwf RxBuffer ; move the received data to the buffer
; (auto-incrementing pointer)
incf CountL,F ; increment 16-bit counter
btfss STATUS,C
goto WaitForData
incf CountH,F
btfss CountH,1 ; check if 512 bytes of data received
goto WaitForData
;******************************************************************************
; when a complete frame is received
; use the selected CHANNEL data to control the CCP1 & CCP2 module duty cycle
RXend
clrf RxBuffer ; use indirect pointer 0 to address the receiver buffer
GetData
movlw LOW(CHANNEL) ; add the offset for the select channel
addwf FSR,F
movlw HIGH(CHANNEL)
addwf FSR,F
;; movwf INDF,CCPR2L ; retrieve the data and assign MSB to control PWM2
;; movwf INDF,CCPR1L ; retreive the data and assign MSB to control PWM1
movlw INDF
movwf CCPR2L ; retreive the data and assign MSB to control PWM2
;*****
movlw INDF
movwf CCPR1L ; retreive the data and assign MSB to control PWM1
;*****
goto Start ; return to main loop
;******************************************************************************
; Setup Serial port and buffers
SetupSerial
; Clear the receive buffer
;*****
clrf RxBuffer
CBloop
clrf RxBuffer ; clear INDF register then increment pointer
incf CountL,F
btfss STATUS,C
goto CBloop
incf CountH,F
btfss CountH,1
goto CBloop
; Setup EUSART
banksel TRISC
;; bsf TRISC,7 ;B'10000000' ; allow the EUSART RX to control pin RC7
;; bsf TRISC,B'10000000'; allow the EUSART TX to control pin RC6
movlw B'11000000'
movwf TRISC
movlw 0x04 ; Disable transmission
movwf TXSTA ; enable transmission and CLEAR high baud rate
movlw 0x90
movwf RCSTA ; enable serial port and reception
;; bsf BAUDCON,BRG16 ; Enable UART for 16-bit Asyn operation
bsf TXSTA,BRGH
clrf SPBRG
movlw .15 ; Baud rate is 250KHz for 16MHz Osc. freq.
movwf SPBRG
; Setup PWM module
movf CCP1CON,W ; configure CCP1 for PWM mode
andlw 0xF0
iorlw 0x0C
movwf CCP1CON
;*****
movf CCP2CON,W ; set CCP2 as PWM mode
andlw 0xF0
iorlw 0x0C
movwf CCP2CON
;*****
; Timer1 control
movf T1CON,W ; configure Timer1 to oscilation
andlw 0x09
iorlw 0x04
movwf T1CON
;Timer2 control
movlw 0x04 ; enable Timer2, select a prescale of 1:1
movwf T2CON
; PWM period
movlw 0xFF ; 256 x .25us = 64us period
movwf PR2
; init I/O
banksel TRISA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; bsf TRISA;;;;;;;;;;;;;
movlw 0x00
movwf TRISA
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movlw b'11111111' ; make pins on PortA inputs
movwf PORTA
;int I/O
banksel TRISB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; bsf TRISB;;;;;;;;;;;;
movlw 0x00
movwf TRISB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movlw b'11111111' ; make pins on PortB inputs
movwf PORTB
;init I/O
banksel TRISC
;; bsf TRISC;;;;;;;;;;;;;;
movlw 0x00
movwf TRISC
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
movlw b'11110111' ; make pin RC2 (CCP2) output
movwf PORTC
return
;*****
END ; directive 'end of program'
-
Might be of some use but possibly overboard for your project, I have released my USB DMX512-A product as open source. One method I use to ensure 100% reliable DMX512 break reception is by using an external counter, see attached schematic.
Firmware is at http://code.google.com/p/dmxking-usbdmx512/ (http://code.google.com/p/dmxking-usbdmx512/) and you can become a fan on the facebook page http://www.facebook.com/pages/DMXking/335067574205
Jason
-
One method I use to ensure 100% reliable DMX512 break reception is by using an external counter, see attached schematic.
Although I cant see the schematic (not attached), using a counter to detect break is an excellent idea, much better than misusing framing errors, which is the most widely used approach. However, depending on your choice of processor, and how much the resources offered by the processor are utilised, you could possibly use on on-board counter to do the same thing as an external counter.
-
i think that is a brilliant idea, i never thought of it. i am a newbee on the PIC microcontroller programming. i will see if i can add it to my circuit
thnk you for the information
-
The PIC isn't a bad choice of processor for this trick, as it has count / compare thingies, which I think could be persuaded to do most of the work for you.
-
hi guys
i have a Velleman K8048 programmer and it seems to give me problems everytime i try to assemble my .asm file from MPLAB v8.43 so i can load the hex file to the PIC16F876. it gives me errors which i do not get when i use the v8.43 to create hex files
the Velleman comes with MPLAB IDE v5.2.
could it be the different versions of MPLAB which cause the problems when assembling?
please help
thank you in advance
-
Could you be more specific as to the "problems"?
-
i was trying to load a .asm file from MPLAB IDE v8.43 to the MPLAB v 5.2 which comes with the Velleman K8048 programmer. so i have been able to load the hex file using the functions in the PicProg2009 software. now when i load the hex file and try to run the program from the PIC16F876, nothing happens
i have tried to change the coding but still nthing happens
when i test the voltages on the pins iget the following
pin 9 with respect ot ground = 1.85V
pin 10 wit respect to ground = 2.55V
pin 9 and 10 are the external 20MHz connections(crystal oscilator)
pin 18 (RC7 DMX input has 4.97V from the TIL194 opto-isolator)
opto- isolator gets the biasing voltage from pin1 of the max485 chip which is connected to the DMX512 line
my proposed output pins for PWM are RC0, RC1 and RC2 of the chip and i get 0.1V from them which is not high enough to switch on the transistors driving the High brightness LEDs
-
hi guys
i have assembled my program without any errors and have run the MPLAB SIM and iget the following message. does it affact my program form running after loading to my PIC16F876
here is the message UART-W0005: Synchronous mode is not implemented in USART. Use Asynchronous mode only.
UART-W0005: Synchronous mode is not implemented in USART. Use Asynchronous mode only.
UART-W0005: Synchronous mode is not implemented in USART. Use Asynchronous mode only.
UART-W0005: Synchronous mode is not implemented in USART. Use Asynchronous mode only.
UART-W0005: Synchronous mode is not implemented in USART. Use Asynchronous mode only.
UART-W0005: Synchronous mode is not implemented in USART. Use Asynchronous mode only.
please help
thank you in advance
-
DMX512 reception uses asynchronous comms, so the fact the simulator doesn't support a mode you're not using is not a problem. Those are just warning messages anyway.
In terms of debugging - start simple - dont try to get PWM up intially, settle for a LED going on and off.
The three tools I find most helpful for PIC debugging is the on-board ICD with MPLab's free software, a LED or two attached to pin(s) and a scope (or a counter / timer) for timing things. With real-time stuff you cant single step your way through code with the ICD, but you can use breakpoints and examine data which is really helpful.
-
thank you very much for the advise. the reason why i am using PWM is because it is one of the conditions in my final year project. so in this project, the pulse-width-modulation will be used to dim the LED light using the signal from a DMX512 console or generator which can produce the DMX512 signal. at the moment, i am using a Velleman USB controlled DMX interface to get my DMX512 signal.
-
I want to see more updates of that work. The simple LED light is one of the nicest light. It is such a good thing to be learned.
-
Thanks Colby
I finally managed to make it work. I am now trying to design a power socket which can swicth off power totally to a load (e.g. a tV set when it is left in standby for 5 min or more)
-
I was soldering new LEDs to my xbox 360 controller motherboard. After I successfully took off the player 2 green led to replace it with a new LED, I noticed that when I put the battery pack back in all of the other LEDs stopped working but the controller still worked fine. Did I accidentally take off the solder joint which caused all of the other LEDs to stop working or what? How could I fix this? Please help!
-
The green LED on my USB DMX dongle comes once I plug in the USB chord and stays on even when I'm not sending a signal. The dongle seems to work fine with my Express
I was wondering if the green light being on all the time means that something is conducting when it shouldn't be.
Any words of wisdom are appreciated.