Уже объяснили, но повторю:shads писал(а):Так если прерывание по сравнению, то там ошибка и не накапливается, зачем передвигать точку сравнения?
Если мы не будем сдвигать точку сравнения, то получим прерывание с тем же периодом, что и переполнение, просто сдвинутое по фазе. Иногда это и нужно, а инода удобно сделать импульсы тактирования чего-то ШИМ-ом, а по переполнению и по сравнению в прерываниях делать что-то сразу после соответствующих перепадов тактового сигнала.
В случае же с передвиганием точки сравнения мы получаем независимую сетку прерываний с частотой выше частоты переполнения и, в общем случае, асинхронную с ней. Для уменьшения писанины пусть нам не 9600 нужно было а 2400, так что добавляем по 48. Имеем прерывания в точках
0, 48, 96, 144, 192, 240, (тут проскочит прерывание переполнения), 32, 80, 128, 176, ...
Несущественно. С манчестером на передачу удобно использовать модуль сравнения с аппаратным управлением ножкой в режиме инвертирования «toggle on compare». В зависимости от значения текущего бита и стадии его передачи, опять таки, смещаем OCR та величину в половину длительности бита или в полную. Следующее сравнение перекинет ножку и даст новое прерывание. В нём опять сдвинем OCR. При этом прерывания могут быть задержаны на время почти в половину длительности бита, но сам выходной сигнал манчестера будет идеальным, так как сформируется аппаратно. Хаотическая задержка прерывания на время до полубита ничего не испортит.shads писал(а):Да вообщета для обмена по радиоканалу я не использую UART, использую свой обработчик на основе манчестера.
Код: Выделить всё
____----________--------____----____- это выходной сигнал (аппаратно)
__-___-_______-_______-___-___-___-__ аж тут может производиться обработка прерыванияОдно в таком решении плохо — исчезает повод для гордости «во как я всё потактово рассчитал». И еще могут обвинить в том, что проект сделан «как попало» (раз не сидел, такты команд не подсчитывал).
Работу на асме, более длинную, чем десяток команд, в любом случае лучше не асм-вставкой в С делать, а отдельным асм-файлом. Регистры можно, причём и без асма, вручную разместить ключевые переменные. Смотреть в документацию на компилятор. Но, как уже писали, далеко не всегда это удобно (avr-gcc, например, для такой цели отдаёт только от R2 до R9), да не всегда и нужно.shads писал(а):Да если надо будет то распихаю по разным, пока в этом проблемы нет. Вопрос, в том как в программе на С вставить ассемблерный блок, в частности обработчик прерываний.
...
А можно на С рарезервировать некоторые регистры контроллера, чтобы С их не использовал, обозвать эти регистры именами, и использовать из С и из Асма эти регистры совместно? Тогда основная прога будет на С, а к ней просто прилепить файл обработки прерываний написанный на Асме.....


