Да там все просто очень - на каждые 8 серв - счетчик-дешифратор 4017. Счетные входы счетчиков заведены на OC3A и OC3C. 4017 - это просто десятичный счетчик с позиционным кодом на выходе, после сброса у него единичка на выходе Q0, с каждым импульсом на счетном входе единичка перемещается к следующему выходу. То есть нужно просто выдавать короткие импульсы с интервалами, соответствующими импульсу очередной сервы, а потом в конце "добить" остаток до 20 мс, единичка при этом будет на неподключенном выходе. Ну и еще все выходы конкретно перепутаны местами, для облегчения разводки наверное - что в принципе логично.
А вот пару более конкретных вопросов по коду и схеме:
1. Как сбрасываются счетчики после 9 интервалов? Я вижу только один сброс при инициализации. А то в цикле программы только 9 импульсов (8 заданных и "добивочный") - а счетчики-то до 10 считают.
2. А не защитить ли вот этот блок запретом прерываний?
- Код: Выделить всё
calc_ocr[block][8] += calc_ocr[block][idx];
calc_ocr[block][8] -= pos;
calc_ocr[block][idx] = pos;
А то легко можно прочесть младший байт от нового значения, а старший от старого, при плавном переходе например от 0x3FF к 0x400 получим 0x300 и щелчок в серве