Цитата(bbill @ Jun 1 2006, 21:59)

Алгоритм вырисовывается примерно таков:
по появлению первой посылки c канала1(условно1) в прерывании pin chang запускаются таймера:
таймер 0 -прерывания через 80 мкс, такт опроса всего порта(всех каналов);
таймер 1 -счет с нуля и до заполнения, т.е. 65536 мкс.
По окончании старт-бита по повторному pin chang считываем со счетчиков TCNTL,H значения определяющие длину старт-бита(частоту) данного датчика.
....
Прошу комментарии об ошибках или упрощениях.
Согласен с Александром (SashaVitebsk).
Ну и плюс мой коментарий:
Определение длины старт бита это какая-то галиматья.. Почитайте Atmel appnote "AVR304" для того чтобы иметь хоть какое-то представление о природе УАППа.
Раз длину старт бита определить нельзя, то дальше алгоритм читать бесполезно.
Цитата(dimka76 @ Jun 2 2006, 13:51)

от каждого датчика посылки поступают довольно редко (мин. 0.5 сек.), вот эту паузу и использовать для определения начала посылки. В m88 любую ножку можно использовать как источник внешнего прерывания. Прерывание это начало посылки, далее на время посылки запрещаем прерывание с этого пина, а по завершению приема 10 бит восстанавливаем разрешение прерывания
Здесь абсолютно верный ход мысли.
Как бы вашу задачу решал я:
1. Завел бы таймер на генерацию прерывания с частотой 4800 * 5 Гц.
2. Разрешил бы PinChange int по N каналам.
3. Завел бы счетчик текущего бита для каждого канала.
4. Завел бы номер цикла чтения бита для каждого канала.
5. Завел бы флаг приема для каждого канала.
6. По прерыванию PinChange считывал бы весь порт.
7. В обработчике прерывания анализировал бы значения каналов для которых не ведется прием.
8. При обнаружении старт-бита устанавливал бы флаг "ведется прием" для этого канала, одновременно внес бы в номер цикла чтения бита - номер текщего цикла +2.
9. В обработчике таймера - первым делом считывал бы значение всех каналов.
10. В обработчике таймера увеличивал бы номер текущего цикла "циклически" (0, 1, 2, 3, 4, 0, 1 ... ).
11. При условии ("установлен флаг приема" AND (номер цикла = текущий цикл)) заносил бы приянтый бит с канала в сдвиговый регистр и увеличивал бы счетчик текущего бита.
12. Если счетчик текущего бита = 9, то сбрасывал бы флаг приема.
13. Заносил бы принятый байт в буфер канала если 9-й бит = 1 (стоп бит распознан) .
14. Проверил бы работу N каналов на одной скорости.
15. При НЕУСПЕШНОМ прохождении теста - правил бы баги, до тех пор пока все каналы не заработают.
16. При успешном прохождении теста внес бы переменную "делитель скорости" для каждого канала.
17. В пункт 11 внес бы коррективу с учетом "делителя скорости".
18. Проверил бы работу N каналов на разных скоростях.
все.