@haba Looking at the outline of the other system that uses assembly for the timing critical part. Here is the setup: Output the number of preamble bits specified (1s) Output the packet start bit (a 0) Reset checksum to 0 For each packet byte XOR for the checksum Output the packet byte Output the data byte start bit (a 0) Output the checksum byte Output the packet end bit (a 1) Not having completely poured through that code and also your recent changes, I have some questions. First, aren't we still bit shifting things all over the place to get the start and stop bits still so that our packets don't match the raw DCC packets? Or just before sending, do they match up? I guess I thought we could follow the above outline exactly, just like the way the "interface.print" functions send the return values back to the serial monitor: Serial.print("<N"); Serial.print(COMM_TYPE); Serial.print(": "); The difference may be that for timing reasons, we may not be able to send a preamble, then send a start bit, then send a first data packet, then a stop bit, etc. as separate functions instead of building a stream and sending it all at once. Maybe I just need more education on what we are already doing, what is possible, and what is not possible.