реклама на сайте
подробности

 
 
> c8051F350 обработка прерываний на ассемблере, Помогите задать вектор прерывания
Marser
сообщение Jul 6 2009, 06:32
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 162
Регистрация: 12-09-08
Из: Казань
Пользователь №: 40 143



Здравствуйте, уважаемые разработчики.
Кто нибудь знает, как написать подпрограмму обработки прерываний таймера на ассемблере? То есть как написать подпрограмму я знаю, а как задать контроллеру вектор прерывания, чтобы при возникновении прерывания выполнялась именно эта подпрограмма, не понятно.
На С это делается просто :Timer_ISR() interrupt 10.
Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
alberto
сообщение Jul 6 2009, 11:11
Сообщение #2





Группа: Новичок
Сообщений: 1
Регистрация: 6-07-09
Пользователь №: 50 959



Цитата(Marser @ Jul 6 2009, 12:32) *
Здравствуйте, уважаемые разработчики.
Кто нибудь знает, как написать подпрограмму обработки прерываний таймера на ассемблере? То есть как написать подпрограмму я знаю, а как задать контроллеру вектор прерывания, чтобы при возникновении прерывания выполнялась именно эта подпрограмма, не понятно.
На С это делается просто :Timer_ISR() interrupt 10.
Заранее спасибо.

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

...
...

; сам обработчик
timer:
...
...
reti
Go to the top of the page
 
+Quote Post
Marser
сообщение Jul 6 2009, 11:13
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 162
Регистрация: 12-09-08
Из: Казань
Пользователь №: 40 143



Спасибо, очень помогло!
Go to the top of the page
 
+Quote Post
Harbinger
сообщение Jul 9 2009, 12:58
Сообщение #4


старший лаборант
******

Группа: Свой
Сообщений: 2 702
Регистрация: 30-09-05
Из: ЮЗЖД
Пользователь №: 9 097



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


--------------------
Китайская комплектация - европейское качество! ;)
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 9 2009, 13:10
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



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

Цитата(Harbinger @ Jul 9 2009, 15:58) *
Резервируем переменную для адреса перехода ...
Перед запуском таймера переменную, разумеется нужно проинициализировать
Инициализация и изменение переменной TimerVector должны производиться при запрещенных прерываниях
Go to the top of the page
 
+Quote Post
Harbinger
сообщение Jul 9 2009, 13:54
Сообщение #6


старший лаборант
******

Группа: Свой
Сообщений: 2 702
Регистрация: 30-09-05
Из: ЮЗЖД
Пользователь №: 9 097



Цитата(Палыч @ Jul 9 2009, 16:10) *
Забыли сказать, что функции, на которые перенаправляется вектор, должны заканчиваться по RETI

Поправил ещё до того, как увидел Ваше сообщение. smile.gif
Цитата
Инициализация и изменение переменной TimerVector должны производиться при запрещенных прерываниях
Естественно.
Похожее извращение и с AVR делал.


--------------------
Китайская комплектация - европейское качество! ;)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 02:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01403 секунд с 7
ELECTRONIX ©2004-2016