// DMX reciever for atmega328p // it consumes the USART, so serial transfers cant be used #define SIZE 512 // max frame size, if you want to do it this way volatile byte dmx_buffer[SIZE]; // allocate buffer space unsigned int dmx_ptr = 0; byte dmx_state = 0; // state tracker void setup() { // initialize uart for data transfer UBRR0H = ((F_CPU/250000/16) - 1) >> 8; UBRR0L = ((F_CPU/250000/16) - 1); UCSR0A = 1<= SIZE) { dmx_state = 0; // last byte recieved or error } } else if (dmx_state == 1) { // check if slot0 = 0 if (UDR0) { dmx_state = 0; // error - reset reciever } else { dmx_ptr = 0; // reset buffer pointer to beginning dmx_state = 2; // set to data waiting } } else { byte temp = UDR0; // get data to flush buffer dmx_state = 0; // reset - bad condition or done } }