Поддержу
tjapljap. На пальцах (разрисовывать диаграммы лень))).
1 бит передаем за
х мс, 4 байта температуры + 8 байт счетчиков за 96*
х мс, для обозначения начала пакета используем преамбулу, скажем, длиной в 6*
х мс. Итого пакет передается за 102*
х мс, максимальное время, которое можем отвести на передачу одного бита 19,6 мс. Возьмем 18 мс.
Оставшиеся 64 мс используем для передачи сигнала высокого уровня 32 мс (чтобы обозначить окончание последнего бита) и для паузы в 32 мс между пакетами
Кодируем передаваемый сигнал, например, таким образом (картинка из даташита на кодер keeloq):
Преамбула - 54мс высокий уровень, 54мс низкий уровень. Эту последовательность приемник считает началом пакета, сбрасывая счетчик принятых бит, прекращая уже начатый прием пакета, если "внутри" него обнаружилась эта последовательность.
Каждый бит - сигнал высокого уровня, сменяющийся сигналом низкого уровня.
6 мс высокий 12 мс низкий - единица, 12мс высокий 6 мс низкий - ноль (можно и наоборот, разумеется).
Te у нас получается 6 мс.
Как организуется прием: 1 раз в 2 миллисекунды по прерыванию считываем состояние порта и для каждой ножки прямо в прерывании исполняем простой конечный автомат, который сравнивает текущее состояние линии с предыдущим - если для данного канала не выставлен флаг наличия принятого пакета, иначе линия просто не обрабатывается, пока основная программа не снимет данный флаг.
При неизменном состоянии инкрементируется соответствующий счетчик (всего 12*2 счетчиков - для каждой линии текущая длительность сигнала высокого уровня, и текущая длительность сигнала низкого уровня), и проверяется полученное значение на выход из заданных пределов.
При изменении уровня с низкого на высокий:
- если идет прием пакета - просто сравнивает отсчитанные длительности низкого и высокого уровней, определяя по тому, что оказалось больше, ноль или единицу мы приняли, и задвигает полученный бит в приемный буфер для данного канала, инкрементируя счетчик принятых бит для этого канала, если это был последний бит последовательности - выставляет флаг наличия принятого пакета.
- если прием пакета еще не начат, то проверяется длительность низкого уровня на соответствие преамбуле, если она "в рамках" - начинаем пакет.
При прерывании раз в 2 мс у хмеги на 32 МГц вагон времени, чтоб все это выполнить, и еще оставить время для всего остального.
Основная программа следит за флагами, при обнаружении установленного флага забирает принятые в канале данные из приемного буфера в свой и сбрасывает флаг. Опять же раз в 2 секунды выплевывает свой буфер наружу, можно с использованием ДМА.
При желании можно уменьшить длительность пакета до 1,5с, уменьшив все наши тайминги, включая период прерываний приемника соответственно, и после передачи пакета поставить 0,5с паузу. Чтоб в приемнике гарантированно не пропускать пакеты из-за того, что основная программа "не успела" забрать принятый в одном из каналов пакет.
Но программирование всё должно быть достаточно аккуратным, тогда и без этого все будет работать правильно.
За счет того, что длительность Te выбрана с запасом, мы не будем терять данные при довольно приличном разбеге частот приемника и передатчика, и всегда будем отличать 0 от 1.
У основной программы достаточно времени, чтобы подсчитывать время, прошедшее с момента последнего выставления флага для каждого канала для определения, что в том или канале пропала связь, и сигнализации об этом "наружу".
Как-то так. Все решаемо, в общем, но, если честно, это просто преодоление самолично сделанного геморроя. Ну почему не двусторонняя связь с блоками? Дороже? Для единичной установки удорожание совершенно не критичное.