Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

134 Часть 11. Программирование микроконтроллеров АVR на ассемблере условии, конечно, что эта другая модель будет поддерживать такие же прерыва­ ния - INT2, например, есть не у всех Mega) . Ставить именно двухбайтовую коман­ ду jmp вместо rjmp также необязательно - как и в случае команд cal l / rcall , до­ пустить ошибку в объеме ассемблерного кода сложно, а в случае неправильного употребления на ошибку вам укажут. Причем jmp, как и call, в младших моделях вовсе отсутствует. Не следует также высчитывать конец таблицы прерываний по их общему числу и указывать начало кода в абсолютном значении адреса - в других моделях это обя­ зательно будет другое значение, т. к. количество прерываний различается, в то вре­ мя как константа INT _ VECTORS _ s r zE уже указывает на правильный адрес дЛ я любого контроллера. ВНИМАНИЕ/ При использовании прерываний не забывайте после всех установок устанавливать общий флаг разрешения прерываний командой sei . Следует учесть, что если не использовать никаких прерываний, кроме самого пер­ вого (сброса), то команду sei можно не указывать . В этом случае стоящая на первом месте в программе команда rjmp RESET, очевидно, вырождается в простой безусловный переход на метку. Общая схема обработки аппаратных прерываний следующая. При возникновении любого прерывания флаг r регистра SREG аппаратно сбрасывается, тем самым за­ прещая обработку других прерываний. При нормальном течении событий он авто­ матически устанавливается опять, когда обработка прерывания заканчивается (по команде reti ) . Отметим, что при необходимости этот флаг можно «вручную» уста­ новить в подпрограмме-обработчике (напрямую или командой sei ) , разрешив вло­ женные прерывания . После сброса флага r контроллер определяет, запрос на обра­ ботку какого именно прерывания произошел, - это делается по флагу конкретного прерывания, _ который также автоматически устанавливается при возникновении прерывания (например, для таймеров эти флаги находятся в регистре т r FR или ETIFR, для внешних прерываний - в регистре GIFR или E I FR и т. п. ) . Отметим, что эти регистры при инициализации МК рекомендуется очищать, что делается записью единиц (не нулей ! ) : ser temp ; temp=$ FF out GIFR, temp ; сбросить флаги внешних прерываний out TIFR , temp ; сбросить флаги прерываний таймеров Критично это только в случае, когда мы вообще используем прерывания, и их непреднамеренное возникновение может что-то испортить, иначе можно этим пре­ небречь . После определения типа прерывания контроллер автоматически вычисляет адрес соответствующего вектора прерывания . Перед тем как перейти по вектору преры­ вания, МК сбрасывает флаг произошедшего прерывания (тем самым разрешая его на будущее) и автоматически сохраняет содержимое счетчика команд в стеке.

RkJQdWJsaXNoZXIy MTExODQxMg==