Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: c8051F350 обработка прерываний на ассемблере
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
Marser
Здравствуйте, уважаемые разработчики.
Кто нибудь знает, как написать подпрограмму обработки прерываний таймера на ассемблере? То есть как написать подпрограмму я знаю, а как задать контроллеру вектор прерывания, чтобы при возникновении прерывания выполнялась именно эта подпрограмма, не понятно.
На С это делается просто :Timer_ISR() interrupt 10.
Заранее спасибо.
alberto
Цитата(Marser @ Jul 6 2009, 12:32) *
Здравствуйте, уважаемые разработчики.
Кто нибудь знает, как написать подпрограмму обработки прерываний таймера на ассемблере? То есть как написать подпрограмму я знаю, а как задать контроллеру вектор прерывания, чтобы при возникновении прерывания выполнялась именно эта подпрограмма, не понятно.
На С это делается просто :Timer_ISR() interrupt 10.
Заранее спасибо.

В ассемблерном проекте делаю так: в секции CODE задается вектор:
org 2bh ; адрес вектора - фиксированный для
ljmp timer ; переход на обработчик

...
...

; сам обработчик
timer:
...
...
reti
Marser
Спасибо, очень помогло!
Harbinger
Собственно, вектор можно и оперативно перенаправлять, с целью заставить таймер выполнять различные функции в различных режимах работы устройства. Резервируем переменную для адреса перехода (скажем, TimerVector_l и TimerVector_h - младший и старший байт соответственно).
Вместо
Код
ljmp timer

пишем
Код
push TimerVector_l
push TimerVector_h
ret; тем самым в PC оказывается значение TimerVector.

Перед запуском таймера переменную, разумеется, нужно проинициализировать, вроде:
Код
mov TimerVector_l, #LOW(gen1kHz)
mov TimerVector_h, #HIGH(gen1kHz)
;________собственно обработчики
gen1kHz:  ;bla-bla...
;...
                 reti
gen2kHz:  ;bla-bla...
;...
                        reti
blink:    ;bla-bla...
;...
                        reti
Палыч
Цитата(Harbinger @ Jul 9 2009, 15:58) *
вектор можно и оперативно перенаправлять, с целью заставить таймер выполнять различные функции в различных режимах работы устройства.
Забыли сказать, что функции, на которые перенаправляется вектор, должны заканчиваться по RETI

Цитата(Harbinger @ Jul 9 2009, 15:58) *
Резервируем переменную для адреса перехода ...
Перед запуском таймера переменную, разумеется нужно проинициализировать
Инициализация и изменение переменной TimerVector должны производиться при запрещенных прерываниях
Harbinger
Цитата(Палыч @ Jul 9 2009, 16:10) *
Забыли сказать, что функции, на которые перенаправляется вектор, должны заканчиваться по RETI

Поправил ещё до того, как увидел Ваше сообщение. smile.gif
Цитата
Инициализация и изменение переменной TimerVector должны производиться при запрещенных прерываниях
Естественно.
Похожее извращение и с AVR делал.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.