// DMX reciever for atmega328p // it consumes the USART, so serial transfers cant be used #define BREAK 100 // break time in us (must be less than 127us) #define MAB 12 // mark-after-break in us (8 < MAB < 127) // MAB and BREAK times are not exact #define SIZE 512 // max frame size, if you want to do it this way volatile byte dmx_buffer_rx[SIZE]; // allocate buffer space volatile byte dmx_buffer_tx[SIZE]; // allocate buffer space unsigned int dmx_ptr_tx = 0; // pointer for tx interrupt unsigned int dmx_ptr_rx = 0; // pointer for rx interrupt byte dmx_state_rx = 0; // rx state tracker volatile byte dmx_state_tx = 0; // tx state tracker // test variables byte red = 84; byte blue = 167; byte green = 0; byte r_toggle = 0; byte g_toggle = 0; byte b_toggle = 0; void setup() { // initialize uart for data transfer cli(); // in case data arrives and triggers an interrupt UBRR0H = ((F_CPU/250000/16) - 1) >> 8; UBRR0L = ((F_CPU/250000/16) - 1); UCSR0A = (1<= SIZE) { UCSR0A |= (1<= SIZE) { dmx_state_rx = 0; // last byte recieved or error } } else if (dmx_state_rx == 1) { // check if slot0 = 0 if (UDR0) { dmx_state_rx = 0; // error - reset reciever } else { dmx_ptr_rx = 0; // reset buffer pointer to beginning dmx_state_rx = 2; // set to data waiting } } else { byte temp = UDR0; // get data to flush buffer dmx_state_rx = 0; // reset - bad condition or done } }