Плюс тут адаптивный последовательный протокол - нет заранее известной скорости передачи - приёмник настраивается по первому импульсу от передатчика:
Перенёс экранчики поближе и подписал под "осциллограммками" какое число передаётся где:
В каждой посылке 12 битов:
первый бит - всегда "1" (по этому стартовому импульсу приёмник вычисляет скорость)
второй бит - всегда "0" (чтобы точно определить момент, когда закончился стартовый импульс)
третий бит - бит 7 передаваемого байта (самый старший)
четвёртый бит - бит 6 передаваемого байта
пятый бит - бит 5 передаваемого байта
шестой бит - бит 4 передаваемого байта
седьмой бит - бит 3 передаваемого байта
восьмой бит - бит 2 передаваемого байта
девятый бит - бит 1 передаваемого байта
десятый бит - бит 0 передаваемого байта (самый младший)
одиннадцатый бит - бит чётности (обязательный!)
двенадцатый бит - всегда "1" (стоповый бит также может быть использован для проверки корректности приёма ну и просто удобно на осциллограммы смотреть - видно где байт начинается и где заканчивается)
далее идёт нулевая пауза длительностью несколько битов (в примере на картинке около 5 - при 2 МГц процессоре и константе 0x20 как на картинке это примерно 230 байт в секунду).
В реальных передатчиках скорее всего надо делать общий коллектор, чтобы разные устройства могли по очереди на этот провод говорить - тогда физически уровни будут инвертированные, т.к. нормальное состояние общего коллектора это подтянуто к напряжению питания. Интересный вопрос - где ставить подтягивающий резистор? Прямо на мастере можно или где-то в конце линии типа терминатор? В инете есть даже с двух сторон:
Кроме сигнального провода в этой "домашней шине" предполагалась земля, питание и один резервный провод (например для передачи звукового сигнала) т.е. всего 4 - и мне тогда виделось, что будет это всё 4-жильным телефонным проводом растягиваться по дому...
P.S. Тут такое дело всплыло - все узлы будут всегда слушать все передаваемые байты (неважно от мастера или от слейвов) - тогда чтобы защититься от ошибочного срабатывания контроллеров на передаваемые байты данных (например в дампе памяти может попасться байт #F2, который ошибочно можно принять за команду "запрос полного статуса у контроллера №2") надо ввести правило, что командой считается байт, перед которым в течение какого-то времени (например равного длительности предыдущего прочитанного байта) ничего не передавалось (на сигнальной линии была тишина) - в этом случае мы гарантированно будем срабатывать только там, где надо. Ну и отвечать в линию надо только если там какое-то время (опять же равное длительности предыдущего прочитанного байта) была тишина...