Thanks for your answer,
My problem is more decoding DMX frame with picbasic , firstly I try to detect the break at the beginning of the dmx frame....
Thanks too for the link.
Greeting
Thanks for your answer,
My problem is more decoding DMX frame with picbasic , firstly I try to detect the break at the beginning of the dmx frame....
Thanks too for the link.
Greeting
Hello,
I find a break
but i don't understand the RCIF fonction!!
I think that RCIF is my problem because he is always at 0 thus RCREG he is already full !!
How made for use the RCIF??
Greeting
Have you read the chapter about the USART in the datasheet? It takes a few tries for it all to sink in, usually.
If you're reading zeros, that means it's either empty, or it actually thinks a zero was received.
Depending on how you've structured your code, you may consider turning OFF the USART while you look for the break.
Once you've found the break signal, turn on the USART and clear it a few times, just to make sure it's ready for whatever data you're hoping to capture.
JEC
Hello,
Can you say to me if my code is good for the definition of the variables (rcif)and if there are not other errors.
Thank you
Code:'************************************************* *************** '* Name : UNTITLED.BAS * '* Author : [select VIEW...EDITOR OPTIONS] * '* Notice : Copyright (c) 2006 [select VIEW...EDITOR OPTIONS] * '* : All Rights Reserved * '* Date : 26/01/2006 * '* Version : 1.0 * '* Notes : * '* : * '************************************************* *************** DEFINE OSC 20 ' for pic 16f627 DEFINE HSER_BAUD 250000 DEFINE HSER_CLROERR 1 ' Variables diverves counter VAR word ' Variable de travail WORD idleflag VAR WORD dummy VAR WORD RCIF VAR byte startcode VAR WORD aminus VAR WORD adresse_grada VAR WORD x VAR WORD newlevel1 VAR WORD adresse_grada = 20 ' my adress for exemple 20 'This next routine is called on a gosub from my main housekeeping loop: checkdmx: counter = 1 'just a dummy variable pulsin portB.1,0,counter 'here I'm looking for the break signal if counter = 0 then idleflag = 1 'either no dmx, or break was too long to count 'return endif if counter < 40 then checkdmx 'watching for 'break 'if you get here, an active low pulse was detected, but it was too short. 'probably just part of the datastream. So go back and look again. 'otherwise, a valid break was found and it's time to read the start code dummy = RCREG 'clear out any garbage which may be in the USART dummy = RCREG SPBRG = 0 TXSTA.2 = 0 'brgh = 0 TXSTA.4 = 0 RCSTA.7 = 1 RCSTA.6 = 0 'setting 8 bit receive mode, no parity, etc RCSTA.4 = 0 'check the datasheet to see what all these bits do RCSTA.4 = 1 'now, the USART is on and ready to receive while RCIF = 0:wend 'hover here after break, before start code startcode = RCREG 'This is the first byte received after the break if startcode <> 0 then checkdmx 'do your own stuff here on a non-zero code aminus = adresse_grada - 1 'address1 is my target address for x = 1 to aminus 'set up a loop to count almost to the address while RCIF = 0:WEND 'sit here until a byte is received dummy = RCREG 'stash the byte somewhere unimportant next x newlevel1 = RCREG 'This is your target channel data portA.2 = newlevel1 'i want dimming a LED on PORTA.2 RCSTA.7 = 0 'turn off the USART goto checkdmx return
Last edited by ScaleRobotics; - 6th August 2010 at 15:52. Reason: added code tags
Hi -
From what I can tell, you've copied the code I posted a few months ago verbatim. And I know that the code is good.
What I posted was a *subroutine* which checks for DMX at a particular address.
But, if what you've posted is in fact your entire project, it seems that you haven't added anything to it all!
RCIF needs to be defined as whichever bit of the PIR register it actually is. Without it being defined, you code may return strange results. PIR1.5? Check your datasheet.
The PULSIN routine in my code looks for DMX on PORTB.1, which is the RX pin for the processor I used. Your first post from a few days ago mentions that you're hoping to receive on PORTC.7. But you haven't changed the PULSIN command to suit, so there's no chance it will work right out of the box.
You're using a different oscillator than I did. Have you confirmed that SPBRG and BRGH have the same values?
How do you know you're even finding the break signal? Have you added any flags or pin-twiddles which let you know where the program is at any given time?
One thing I did when I started writing the code was to insert something like this:
If break signal was received
high PORTB.FOO
pauseus 10
low PORTB.FOO
endif
Then, I could monitor the incoming signal and the FOO pin at the same time on my 'scope. Once I saw the FOO pin pulsing at exactly the proper position, I moved on to decoding other parts of the DMX stream. But if you don't catch the break signal properly, you don't have a chance at getting the rest of the stream.
There are so many inconsistencies here that it's hard to know where to start...
John
Thank you JEC for your very detailed answer.
Indeed I am only at the beginning of my project.
My objective is to be able to decode DMX stream with a 16F627 or a 18Fxxx (what explains the differences of port RX between my different "post"), to use it for different functions not yet definite.
All that in PICBASIC if possible.
By the way I use an 20 MHz oscillator.
I wish to proceed by small steps
1) first, detect signal DMX, and light a LED if it is present on RX pin.
For example, if the break is detected.
2) Then, store DMX value on a preset address, (in my example address 20).
3) View this value in a way or another
4) using this value to dim a LED, if possible on a pin of the processor use.
Thank you for all your examples, but I am almost a beginner in programming, so I require also the good DEFINE of the variables used.
I will continue my experiments with these new councils.
So long.
Fred
hi fd
i tryed your code and i add like this .
newlevel1 = RCREG 'This is your target channel data
================================================== =
PWM portb.3 ,newlevel1 100 ' send pluse to led at
' portb.3 i use 16f628 xtal = 20 mhz
serout portb.2, t9600 [#newlevel1 10,13 ] ' send data to monitor
'on pc rs 232
'portA.2 = newlevel1 ' i don't use
================================================== =
RCSTA.7 = 0 'turn off the USART
-------------
and led is work diming from low to full bright when i add my volum from ch 1
but i have another problem it read data not same as my dmx transmit
like ch1 send data 200 but my code read out 100 and not sure it moveing
even i don't move volume..
ok if someone know how to fix please let me know..
GOD bless you ok have a goo day.
Bookmarks