Like most things there is more than one way to accomplish a task. Last year I saw the post from JEC about DMX. While it was nice to hear that DMX was possible with PICBasic I really wanted something that was interrupt based.
After doing some research I found that all you need to do is look for a framing error, after which should be the start code (there may be several framing errors in a row). Over the last few days I have created the interrupt code snip below. While I haven't tested it exhaustively it seems to work.
Code:DimmerCount VAR WORD ; Location in DMX string DMXStartAddr VAR WORD ; DMX start address DMXStartCode VAR BYTE ; DMX Start code (Dimmer=0) Dummy VAR BYTE DMX_State VAR BYTE ; Stage of DMX reception Valid_Break CON 1 Valid_SC CON 2 Valid_Data CON 3 Disable INTERRUPT_SUB: IF OERR Then CREN = 0 CREN = 1 ; Clear Overrun Errors High Err_LED ; Notify user of overrun error DMX_State=0 EndIF IF FERR Then FERR = 0 DMX_State=Valid_Break Else GoSub RX_DMX_Data EndIF Dummy=RCREG ; Empty UART of junk data Resume RX_DMX_Data: IF DMX_State=Valid_Break Then HSerin 20,NoData,[DMXStartCode] ; Start code of 0 = dimmer data IF DMXStartCode=0 Then DMX_State=Valid_SC Else High Err_LED ; Notify user of Error in Start Code DMX_State=0 EndIF EndIF IF DMX_State=Valid_SC Then For DimmerCount=0 TO DMXStartAddr; Count incoming data bytes (frames) Dummy=RCREG ; Read unwanted values Next DimmerCount DMX_State=Valid_Data EndIF IF DMX_State=Valid_Data Then HSerin 20,NoData,[STR DataBuffer\Number_Of_Channels] DMX_State=0 EndIF IF DMX_State=0 Then Resume EndIF GoTo RX_DMX_Data NoData: DMX_State=0 Resume Enable End



but it's a first & fast observation.


Bookmarks