Перейти к содержанию
    

c8051F350 обработка прерываний на ассемблере

Здравствуйте, уважаемые разработчики.

Кто нибудь знает, как написать подпрограмму обработки прерываний таймера на ассемблере? То есть как написать подпрограмму я знаю, а как задать контроллеру вектор прерывания, чтобы при возникновении прерывания выполнялась именно эта подпрограмма, не понятно.

На С это делается просто :Timer_ISR() interrupt 10.

Заранее спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте, уважаемые разработчики.

Кто нибудь знает, как написать подпрограмму обработки прерываний таймера на ассемблере? То есть как написать подпрограмму я знаю, а как задать контроллеру вектор прерывания, чтобы при возникновении прерывания выполнялась именно эта подпрограмма, не понятно.

На С это делается просто :Timer_ISR() interrupt 10.

Заранее спасибо.

В ассемблерном проекте делаю так: в секции CODE задается вектор:

org 2bh ; адрес вектора - фиксированный для

ljmp timer ; переход на обработчик

 

...

...

 

; сам обработчик

timer:

...

...

reti

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Собственно, вектор можно и оперативно перенаправлять, с целью заставить таймер выполнять различные функции в различных режимах работы устройства. Резервируем переменную для адреса перехода (скажем, 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вектор можно и оперативно перенаправлять, с целью заставить таймер выполнять различные функции в различных режимах работы устройства.
Забыли сказать, что функции, на которые перенаправляется вектор, должны заканчиваться по RETI

 

Резервируем переменную для адреса перехода ...

Перед запуском таймера переменную, разумеется нужно проинициализировать

Инициализация и изменение переменной TimerVector должны производиться при запрещенных прерываниях

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Забыли сказать, что функции, на которые перенаправляется вектор, должны заканчиваться по RETI

Поправил ещё до того, как увидел Ваше сообщение. :)

Инициализация и изменение переменной TimerVector должны производиться при запрещенных прерываниях
Естественно.

Похожее извращение и с AVR делал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...