marser1986 0 6 июля, 2009 Опубликовано 6 июля, 2009 · Жалоба Здравствуйте, уважаемые разработчики. Кто нибудь знает, как написать подпрограмму обработки прерываний таймера на ассемблере? То есть как написать подпрограмму я знаю, а как задать контроллеру вектор прерывания, чтобы при возникновении прерывания выполнялась именно эта подпрограмма, не понятно. На С это делается просто :Timer_ISR() interrupt 10. Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alberto 0 6 июля, 2009 Опубликовано 6 июля, 2009 · Жалоба Здравствуйте, уважаемые разработчики. Кто нибудь знает, как написать подпрограмму обработки прерываний таймера на ассемблере? То есть как написать подпрограмму я знаю, а как задать контроллеру вектор прерывания, чтобы при возникновении прерывания выполнялась именно эта подпрограмма, не понятно. На С это делается просто :Timer_ISR() interrupt 10. Заранее спасибо. В ассемблерном проекте делаю так: в секции CODE задается вектор: org 2bh ; адрес вектора - фиксированный для ljmp timer ; переход на обработчик ... ... ; сам обработчик timer: ... ... reti Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
marser1986 0 6 июля, 2009 Опубликовано 6 июля, 2009 · Жалоба Спасибо, очень помогло! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harbinger 10 9 июля, 2009 Опубликовано 9 июля, 2009 · Жалоба Собственно, вектор можно и оперативно перенаправлять, с целью заставить таймер выполнять различные функции в различных режимах работы устройства. Резервируем переменную для адреса перехода (скажем, 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 6 9 июля, 2009 Опубликовано 9 июля, 2009 · Жалоба вектор можно и оперативно перенаправлять, с целью заставить таймер выполнять различные функции в различных режимах работы устройства.Забыли сказать, что функции, на которые перенаправляется вектор, должны заканчиваться по RETI Резервируем переменную для адреса перехода ... Перед запуском таймера переменную, разумеется нужно проинициализировать Инициализация и изменение переменной TimerVector должны производиться при запрещенных прерываниях Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Harbinger 10 9 июля, 2009 Опубликовано 9 июля, 2009 · Жалоба Забыли сказать, что функции, на которые перенаправляется вектор, должны заканчиваться по RETI Поправил ещё до того, как увидел Ваше сообщение. :) Инициализация и изменение переменной TimerVector должны производиться при запрещенных прерыванияхЕстественно. Похожее извращение и с AVR делал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться