Итак имеем:
0. АТМега16, ну пусть 16МГц;
1. I2C на 100КБит/с;
2. UART скажем на 57600КБит/с;
3. 24 сервы которыми хочется поуправлять не теряя пакетов с I2C и UART'a.
Слабонервным выйти из темы
Попробуем решить:
1. I2C будет хавать байты через TWI с частотой не более 11Кбайт/сек;
2. UART соответственно не более 7.2Кбайт/сек;
Получается чтобы не терять байтики мы должны забирать их с частотой не менее 20'000 раз в секунду. То есть спокойно что-то делать мы можем только в течение 16'000'000/20'000=800 тактов.
После чего надо будет вернуть управление.
Теперь про сервы - их надо рефрешить с частотой 50Гц импульсами от 0.9 до 2.1 мс.
В 1 мс помещается 16'000 тактов.
То есть если сделать там 120 делений, то при помещении их в 1.2мс это будет 160 тактов на 1 деление.
Получается оптимальный вариант - повешать таймер, чтобы он каждые 10мкс выставлял на всех портах нужные значения за не более чем 50 тактов, а затем давал поработать остальным.
Я нигде не ошибся?