Цитата(bbill @ Jun 3 2006, 00:18)

Я перечитал текст своего вопроса: Формат передачи: старт-бит, 8 бит данных, 1 стоп. Скорость передачи 2400 или 4800 бод.
Фраза с разночтением. Скорость у всех датчиков одинакова или 2400, или 4800. Переключается.
Еще мне минус, в конфе fulcruma я указал на уточнение облегчающее мне жизнь: данные в посылке занимают 7 бит, старший бит нулевой, ВСЕГДА. Поэтому мне очень удобно измерять длительность старт-бита. Скорость дрейфует очень медленно, а разброс, читай скорость, фактически измеряется.
SasaVitebsk внимательно прочитал ваше сообщение:
1) Надо зафиксировать скорости по каналам. Иначе - не верю в успех.
2) Я бы делал на ASMе
3) Я бы делал так, как это делает аппаратный контролер на уровне железа, а именно:
a) Обрабатывал бы прерывание от таймера с частотой, как минимум в три раза выше максимальной частоты передачи. Лучше в пять!
б) в прерывании читал бы ВСЕ каналы.
в) Если 2 из 3 или 4 из 5 засвечено - единица.
Мой путь как-то не очень отличается от приведенного выше.
Это означаетодно из двух. Либо Вы не умеете читать, либо я не умею писать.

Давайте выберем второе. Итак в третий раз старик забросил свои сети ...
Разница в алгоритме СУЩЕСТВЕННАЯ. Я исходил из того что датчики независимы. Это значит, что даже если посылка происходит раз в несколько минут, то всё равно наступит момент когда прерывание от одного не закончится, а от второго поступит.
Т.о. может поступить посылка от двух и более датчиков. И если их обрабатывать по прерыванию, то те посылки которые предут "не вовремя" не будут обработаны должным образом.
Моему алгоритму - данное не страшно.
Итак ещё раз.
1) Инициализируем ОДНО прерывание от таймера с частотой 1/16 от максимальной частоты посылки.
2) В НАЧАЛЕ прерывания (до ветвлений) читаем все порты.
3) Если хотите определять старт бит, то пожалуйста определяйте примерно так.
(Данная работа выполняется не с портом, а со считанными данными по каждому порту)
3.1) Если посылки не было, то проверяем 0/1 и если 0, - то помечаем номер такта посылки как нулевой такт (начинаем отсчёт тактов по каждому каналу)
3.2) Если посылка идёт, то смотрим какой такт и какой бит сверяем бит и считаем длину бита если равна 16, то переходим к след биту.
(для более низкой скорости - 32)
3.3) Если прошло 10 бит, то формируем байт и выставляем признак готовности данных по данному каналу. (Или "загоняем" его в кольцевой буффер канала)
3.4) Сбрасываем признак того что идёт посылка.
При таком подходе Вы можете принимать данные от N каналов одновременно.
Данный подход не исключает возможность автоопределения частоты. Просто размеры битов Вы будете видеть в тактах прерывания.
Откуда у Вас данный расчёт по занятому ОЗУ - можно только гадать. Я со своим опытом работы предсказать не берусь.
Но я бы весь сигнал загонял в озу и работал бы в голове. Думаю что озу m8 Вам за глаза. Если не делать сжатие "на лету".