Он и в проекте ни разу не структурированный...Programmer86 писал(а): Код под спойлером. Также приложил архив с проектом в AtmelStudio, т.к. код под спойлером получается не структурированным.
Первая грубая ошибка - из прерываний выходят по RETI, а не по RET'у. В результате код, который выполнялся при открытых прерываниях после выполнения программы прерывания продолжит исполнение при закрытых прерываниях и следующего прерывания может не произойти. То есть здесь, скорее всего, до этого успеет выполниться SEI в другом месте и до зависания дело не дойдет, но, тем не менее, в общем случае так делать нельзя.Programmer86 писал(а): Вы меня подтолкните, что может быть, я сам подправлю код.
Вторая, и еще более грубая ошибка - это то, что прерывающая программа обязана сохранять и восстанавливать регистры, которыми она пользуется. Здесь ничего подобного нет. В частности, здесь в любой момент исполнения основной программы (от SEI до CLI) могут внезапно измениться регистры Data1, Data2, Servo1 и Servo2 и, самое главное, регистр статуса SREG. Не вникал, может быть изменение регистров данных и предусмотрено, но забытый SREG приведет к тому, что, допустим, цикл Loop4_1 досчитал до конца, выполнилась команда dec TEMP2, результат получился ноль, тут прерывание, которое испортит признак Z, и вперед, цикл будет исполняться еще 256 раз. Совпадение, конечно, достаточно редкое, но рано или поздно оно произойдет и, поскольку оно редкое, будет похоже на случайный сбой.
Третья ошибка - это как раз, в тему того, о чем я вел дискуссию страницей раньше. Если полностью заполнить таблицу векторов командами (r)jmp, то нужна и вторая таблица с объявлением меток, на которые ссылаются эти RJMP. Та самая:
Код: Выделить всё
EXT_INT0:
EXT_INT1:
EXT_TIMER2_COMP:
EXT_TIMER2_OVF:
...
Это то, что бросилось в глаза. А про структурирование... На асме принято метки писать с первой позиции, а коды операций от меток через один или несколько tab'ов, чтобы они шли в колонку. Ну и комментариев в программе на асме надо писать раз в 10 больше, чем у тебя, причем структурировать в C-стиле следует именно комментарии...


