2020年2月17日 星期一

DMX512 protocol

DMX protocol…
# 1:break + 1:start + 512:channel

python:
import serial

class DMX512:
    def __init__(self, port):
        self.serial = serial.Serial(
        port=port,
        baudrate=250000,
        bytesize=serial.EIGHTBITS,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_TWO,
        timeout=0
        )
        self.data=[0]*513   # 513 bytes = 1:start + 512:channel

    def setChannel(self, chan, intensity):
        self.data[chan] = intensity

    def setAll(self,col):
        for i in range(1, 513):
            self.data[i] = col

    def update(self):
        # break use or serial.send_break  or serial.break_condition
        self.serial.send_break(0.0001)  # 100us but not precise on different OSs
        # 513 bytes = 1:start + 512:channel
        self.serial.write(bytes(self.data))

dmx = DMX512( 'COM3' )
dmx.setAll(255)
dmx.update()

stm8s:
====BREAK====:
UART3_Init(
    (u32)45500,
    UART3_WORDLENGTH_9D,
    UART3_STOPBITS_1,
    UART3_PARITY_NO,
    UART3_MODE_TXRX_ENABLE
    );
UART3_SendData9( 0x0100 | 0x00 );

====TX/RX====:
UART3_Init(
    (u32)250000,
    UART3_WORDLENGTH_9D,
    UART3_STOPBITS_1,
    UART3_PARITY_NO,
    UART3_MODE_TXRX_ENABLE
    );
UART3_SendData9( 0x0100 | data ); /// 513 BYTES

====rx====:
u8 dmx_buffer[513];
u16 dmx_buffer_idx; 
BOOL DMX_FLAG = FALSE;
BOOL SC_FLAG = FALSE;

void UART3_RX_IRQHandler( void )
{
    BOOL BREAK_FLAG = FALSE; 
    u8 rx = 0; 

    /// DMX512 = 1:break + 1:start + 512:data
    if(UART3_GetITStatus(UART3_IT_RXNE )!= RESET)
    {
        BREAK_FLAG = UART3_ReceiveData9()>>8;
        rx = UART3_ReceiveData8();

        if(BREAK_FLAG == FALSE) /// 1:break
        {
            if(rx == 0x00)
            {
                SC_FLAG = TRUE;
                return ;           
            }
        }

        if((BREAK_FLAG == TRUE)&&(SC_FLAG == TRUE)) /// 1:start
        {
            SC_FLAG = FALSE;
            if(rx == 0x00)
            {
                DMX_FLAG = TRUE;
            dmx_buffer_idx = 1; /// fill buff start from idx=1
            return;
        }
        }

        if((BREAK_FLAG == TRUE)&&(DMX_FLAG == TRUE)) /// 512:data
        {
            if( dmx_buffer_idx < sizeof(dmx_buffer) )
            {
            dmx_buffer[dmx_buffer_idx] = rx;
                dmx_buffer_idx++;
            }
        }
    }
}

更高效處理 micro second 的方式

更高效處理 micro second 的方式…  以 STM32 為例… __IO unsigned long sys_tick = 0; void SysTick_Handler(void) {     HAL_IncTick();     sys_tick += (SysTi...