Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Внешний контроллер прерываний
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
Alex_Pol
Я бы решал так. Тинька 2313. В цикле опрашиваю порт В, если что то изменилось - байт состояния порта через УАРТ в главный контроллер, и пусть он с ним разбирается.
klop
Цитата(Alex_Pol @ Mar 7 2007, 15:03) *
Я бы решал так. Тинька 2313. В цикле опрашиваю порт В, если что то изменилось - байт состояния порта через УАРТ в главный контроллер, и пусть он с ним разбирается.


Довольно разумный подход но только если прерывания возникают не слишком часто.
Alex_Pol
Цитата(klop @ Mar 7 2007, 14:05) *
Довольно разумный подход но только если прерывания возникают не слишком часто.
В ТЗ было заявлено 1 мс. smile.gif Времени с. головой хватит
Dopler
Цитата(prottoss @ Mar 7 2007, 14:53) *
Во первых, как я уже говорил выше, ноги все (почти) заняты, а мне надо 8 полноценных прерываний. Во вторых, про то, что я собираюсь цеплять 8259 речи не было. Я вопрошал про аналоги, и ВООБЩЕ, есть ли таковые (КП) в природе. А то что я не работал с ПЛИСинами, не говорит о том, что я сам, либо с чьей то помощью, не смогу реализовать собственный КП

Тогда я что-то не понял, вы ведете речь о меге128 у которой 64 вывода, которые и так все заняты, вам советуют применить мегу1280 у которой 100 выводов, т.е. у нее 32 дополнительных вывода по сравнению со 128.

Цитата
Ну про 6 баксов и сто ножек Вы, конечно, загнули :-)


Посмотрел в прайс. Я думал max7000 умерли безвозвратно, ан нет, еще есть...
Я давно перешел на MAX II, а там действительно самый маленький - 100 ног, 6$.
Dog Pawlowa
Цитата(SasaVitebsk @ Mar 7 2007, 14:21) *
1) Эта книга является найболее точной, полной, грамотной из всех мной использованной. Это как раз тот редкий случай, когда очевидно, что авторы точно знают о чём пишут. А также они знают как изложить свои знания на бумаге. Ничего лишнего - всё кратко и точно. Тоэтому, прошу, не надо охаивать авторов и книгу, которую вы даже не читали.
2) Формально вы правы. Мы "подменили понятия" с zltigo. Я бы предпочёл выражение "выразились не точно". smile.gif Я имел ввиду то, что они в этот момент сидят на шине данных. Скажем понятие захвата шины действительно более подходит к ПДП. С другой стороны вы тоже осуществляете "тут пропаганду безграмотности". Вот пример: "Сигнал INTA работает как признак, означающий, что контроллеру нужно передать вектор. И микроконтроллер своей логикой сразу после сохранения старого значения счетчика команд помещает этот вектор в счетчик команд". МК не читает вектор, а читает по INTA код команды перехода по вектору. Причём это может быть и код команды RST. Поэтому, я считаю что я выразился точнее.

Я в те годы заказывал и читал все книги, относящиеся к микроконтроллерам, и эта книга действительно не самая плохая. Были гораздо хуже. В которых, как сейчас помню, писалось про "программируемый контроллер системной шины". В этой просто размытость понятий. По себе знаю - человек или пишет книги, или же непосредственно работает, и ему не до книг wink.gif

Что касается Вашей поправки... Мы о каком контроллере прерываний говорим? 8259 или 8259A? В каком режиме?
Действительно, все начиналось с 8080 и 8259, сигнал INTA варабатывался в течение трех циклов шины, и первым кодом был код 0CDh - код команды вызова подпрограммы. Потом появился процессор 8086, с другой системой команд, и появился контроллер 8259A. Разработчики исключили первый байт из последовательности получения вектора прерывания в режиме 8086, поскольку он не информативен и никогда не был информативен(микропроцессор и так знает, что он делает - получает вектор прерывания). Он, вероятно, был введен для упрощения структуры микроконтроллера. Быть может, какие-то извращенцы и использовали его для передачи в микроконтроллер других команд. Если Вы настаиваете на значимости этого факта, и найдете случаи такого использования, не буду с Вами спорить. smile.gif
_Bill
Цитата(Dog Pawlowa @ Mar 6 2007, 13:15) *
Про захват шины загнули, конечно...
Сигнал INTA работает как признак, означающий, что контроллеру нужно передать вектор.
И микроконтроллер своей логикой сразу после сохранения старого значения счетчика команд помещает этот вектор в счетчик команд.

В порядке уточнения. Вектором прерывания принято называть любую информацию от периферийного устройства, которая позволяет идентифицировать источник запроса на прерывание. В частности, такой информацией может быть специальная инструкция типа RST или CALL, которая действительно может быть передана в счетчик команд процессора. Именно эти команды выдает контроллер прерываний типа 8259 в ответ на выдачу процессором сингнала подтверждения прерывания INTA.
В других случаях, в качестве вектора прерывания может быть использовано смещение относительно начала таблицы векторов прерывания. В этих случаях в счетчи команд заносится соответсвующи адрес, выбираемый из таблицы векторов.
Alex_Pol
Цитата(Dog Pawlowa @ Mar 7 2007, 15:51) *
Быть может, какие-то извращенцы и использовали его для передачи в микроконтроллер других команд.
А это как? CD (CALL), вроде как аппаратно было впендюрено в ВН59, или путаю чего?
m16
Цитата(Alex_Pol @ Mar 7 2007, 17:22) *
А это как? CD (CALL), вроде как аппаратно было впендюрено в ВН59, или путаю чего?

всё так , а таблица векторов задаётся программно с шагом в 4 байта , если не ошибаюсь
_Bill
Цитата(Alex_Pol @ Mar 7 2007, 17:22) *
А это как? CD (CALL), вроде как аппаратно было впендюрено в ВН59, или путаю чего?

Вся информация заносится в контроллер программно. Во-первых, задается вид вектора прерываний: RST или CALL. Во-вторых, адресная часть инструкций CALL заносится в контроллер прерывания, опять же, по программе. Ведь 8259 не зря же называется программируемым.
SasaVitebsk
Последним постом вы сами себя и опровергаете. Команда CALL и команда RST (RST0-RST7 кстати).

Цитата(_Bill @ Mar 7 2007, 18:12) *
В порядке уточнения. Вектором прерывания принято называть любую информацию от периферийного устройства, которая позволяет идентифицировать источник запроса на прерывание. В частности, такой информацией может быть специальная инструкция типа RST или CALL, которая действительно может быть передана в счетчик команд процессора. Именно эти команды выдает контроллер прерываний типа 8259 в ответ на выдачу процессором сингнала подтверждения прерывания INTA.
В других случаях, в качестве вектора прерывания может быть использовано смещение относительно начала таблицы векторов прерывания. В этих случаях в счетчи команд заносится соответсвующи адрес, выбираемый из таблицы векторов.


Не надо передёргивать. НИКОГДА КОМАНДА НЕ ЯВЛЯЛАСЬ ВЕКТОРОМ. Действительно не плодите безграмотность. Вдумайтесь что вы пишете:
Цитата
...инструкция типа RST или CALL, которая действительно может быть передана в счетчик команд процессора

На экзамене за такое ставят 2 бала без дополнительных вопросов. Вы вообще себе счётчик команд представляете? Если представляете зачем пишете ахинею?

Цитата
Быть может, какие-то извращенцы и использовали его для передачи в микроконтроллер других команд. Если Вы настаиваете на значимости этого факта, и найдете случаи такого использования, не буду с Вами спорить.

Я настаиваю на значимости данного факта. Это вполне увязывается с моими постами о примитивности построения данного микропроцессорного комплекта. Я не пробовал подсовывать МП другие команды. Но думаю, что они бы выполнились.
Ещё раз повторяю, что остальные базовые микросхемы комплекта (речь идёт о 8080) оставляли такое же ощущение. (Простоты решения)
prottoss
Цитата(SasaVitebsk @ Mar 7 2007, 17:21) *
2) Формально вы правы. Мы "подменили понятия" с zltigo. Я бы предпочёл выражение "выразились не точно". smile.gif
Добавлю что кроме "подменили понятия" zltigo просто побрызгал слюной smile.gif Наверное не может забыть тот спор, где я массив запихал в функцию в качестве аргумента smile.gif

Цитата(SasaVitebsk @ Mar 7 2007, 17:21) *
Я имел ввиду то, что они в этот момент сидят на шине данных. Скажем понятие захвата шины действительно более подходит к ПДП.
Если Вы имели ввиду, что КП в это время сидит на шине, тогда и про внешнюю память можно сказать, что она захватывает шину smile.gif . ИМХО захват шины, это когда устройство захватывает не саму шину, а УПРАВЛЕНИЕ шиной
SasaVitebsk
Цитата(prottoss @ Mar 8 2007, 16:58) *
Цитата(SasaVitebsk @ Mar 7 2007, 17:21) *
Я имел ввиду то, что они в этот момент сидят на шине данных. Скажем понятие захвата шины действительно более подходит к ПДП.
Если Вы имели ввиду, что КП в это время сидит на шине, тогда и про внешнюю память можно сказать, что она захватывает шину smile.gif . ИМХО захват шины, это когда устройство захватывает не саму шину, а УПРАВЛЕНИЕ шиной


Согласен с критическими высказываниями в мой адрес.

Но надо понимать суть ощущений. Учитывая уже описанное, контроллер прерываний как бы подменял память данных в момент прерывания. Как будто после выставления запроса, вместо RD выставлялся INTA, - и всё. Такие ощущения были повсюду при работе с комплектом. Конечно при переходе на 1810 всё значительно изменилось. И 8259А(8259) и 8237(8257) и 8250(8251) и 8254(8253). Всё это были значительные шаги вперёд. В это время устанавливались понятия и комплекты. Ну и мы вмести с ними. Сейчас это уже классика. Многие из этих разработок угадываются в МК. smile.gif
upc2
Цитата(beer_warrior @ Mar 7 2007, 12:55) *
Цитата
Все это можно заменить 8 диодами и 1 конденсатором .Я так и делаю.

А как вы различаете источник?


8 линий сигналов прерываний на регистр , а оттуда диодами на вход INT.
По любому прерыванию, читается регистр и определяется источник ,и запускается
соответствующая функция обработки.

Считаю не разумно в контроллерах связываться с 59.


Цитата(Alex_Pol @ Mar 7 2007, 15:03) *
Я бы решал так. Тинька 2313. В цикле опрашиваю порт В, если что то изменилось - байт состояния порта через УАРТ в главный контроллер, и пусть он с ним разбирается.


Вот это решение мне больше нравится.
tag
[quote name='tag' post='220658' date='Mar 7 2007, 17:26'] ...а если еще внимательнее почитать и посмотреть, то... есть режим опроса, в этом случае на процессор заводится от контроллера сигнал INT, шина данных/адреса и все управляющие кроме подтверждения запроса контроллера от процессора. Когда на контроллере возникает прерывание, контроллер генерирует его для процессора, процессор не подтверждает (в этом случае захвата шины не происходит), а переводит контроллер в режим опроса и считывает номер прерывания на контроллере... [/quote] Что то я это выпустил... И, хотя, опять поправлю Вас, что НЕТУ ТО ЗАХВАТА ШИНЫ НУ НИ КАК!!!, обязательно изучу это...



PS: В дорогом магазине радиокомпонентов в моем городе 82С59 от Winbond стоит 59 рублей 96 копеек в розницу
[/quote]


...я выразился словами своего оппонента вот и все. Я создавал схему и успешно обкатал наш аналог этого контроллера + 1816ВЕ31 (разновидность I8051)...
_Bill
Цитата(SasaVitebsk @ Mar 7 2007, 21:49) *
Последним постом вы сами себя и опровергаете. Команда CALL и команда RST (RST0-RST7 кстати).

Не надо передёргивать. НИКОГДА КОМАНДА НЕ ЯВЛЯЛАСЬ ВЕКТОРОМ. Действительно не плодите безграмотность. Вдумайтесь что вы пишете:
Цитата

...инструкция типа RST или CALL, которая действительно может быть передана в счетчик команд процессора

На экзамене за такое ставят 2 бала без дополнительных вопросов. Вы вообще себе счётчик команд представляете? Если представляете зачем пишете ахинею?


На самом деле все именно так, как я написал. Команда RST N или команда CALL ISR_N как раз и являются векторами прерывания. Эти команды выдаются контроллером прерывания в ответ на сигнал INTA от процессора. И если говорить об I8080 (I8086), то система прерываний у него была сделана таким образом, что при получении сигнала запроса на прерывание процессор вместо выборки очередной команды (обращения к памяти) процессор входит в цикл прерывания, ожидая от внешнего контроллера соответствующей инструкции.
Хочу добавить, что до появления контроллера 8259 существовал контроллер прерываний I3014 (наш аналог - 589ИК14). В отличие от 8259 он не был программируемым и мог выдавать только инструкции RST N, причем значение N было жестко связано с уровнем прерывания. Приоритеты прерываний были жестко фиксированы и не могли быть изменены. 8259 был уже программируемым. Программно можно задавать не только тип генерируемой команды (RST или CALL), но и менять динамически менять уровни запросов на прерывания, маскировать отдельные запросы и т.д. и т.п.
Насчет счетчика команд. Когда выполняется инструкция типа call или jmp, то их основное назначение изменить последовательность выполнения программы. Разница состоит лишь в том, что при выполнении call старое значение счетчика команд запоминается для последующего возврата в текущую точку. А в счетчик команд записывается новый адрес, по которому передается управление в программе. Если Вы не знаете этих элементарных вещей, то советую прочитать литературу по принципам работы компьютеров или хотя бы для конкретного процессора. Ниже привожу цитату из документа doc0856.pdf фирмы Atmel:
Цитата
CALL - Long Call to a subroutine
Description:
Calls to a subroutine within the entire Program memory. The return address (to the instruction after CALL) will be stored onto the Stack. (See also RCALL).
....
Operation:
PC <- K
....
Syntax:
CALL K

Здесь PC - Program Counter (программный счетчик, он же счетчик команд). И вообще, читайте книги - источник знаний.
SasaVitebsk
Цитата(_Bill @ Mar 9 2007, 18:03) *
Цитата(SasaVitebsk @ Mar 7 2007, 21:49) *

Не надо передёргивать. НИКОГДА КОМАНДА НЕ ЯВЛЯЛАСЬ ВЕКТОРОМ. Действительно не плодите безграмотность. Вдумайтесь что вы пишете:

...инструкция типа RST или CALL, которая действительно может быть передана в счетчик команд процессора


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

Инструкция не может быть передана в счётчик команд! Это приведёт к вылету! В счётчик команд может быть передан только АДРЕС (то бишь вектор)!!! Это разные вещи! Принципиально разные!

Здесь можно было бы употребить термин, - инструкция типа ... выполняется микропроцессором.

Дело в том, что если вы не видете разницы, то я её вижу. Если можно ещё сослаться, что при исполнении инструкции CALL, МП пропускает код команды, а адрес записывает в счётчик команд, то с инструкцией RST - этот номер не проходит. Так как вектор закодирован в коде команды. Пусть и несложно. Любой здравомыслящий - это ясно видит.

Я прекрасно знаю принципы, не приводите разные документы себе в оправдание.
Вы сами пишете
Цитата
процессор входит в цикл прерывания, ожидая от внешнего контроллера соответствующей инструкции.


Так определитесь наконец ИНСТРУКЦИЯ или ВЕКТОР.
mse
Цитата(SasaVitebsk @ Mar 9 2007, 22:59) *
Так определитесь наконец ИНСТРУКЦИЯ или ВЕКТОР.

Инструкцыя, инструкцыя...;О) Вместо текущей команды по ШД подсовывалась ИНТх, либо, как в 59безА, CALLxxxx.
Билл имел в виду, что команда ИНТх имела фиксированные вектора в памяти. А 59 можно было программаровать куды хош.
_Bill
Цитата(SasaVitebsk @ Mar 9 2007, 22:59) *
Вы привязались к моей терминологии, я вам указал на вашу.

Инструкция не может быть передана в счётчик команд! Это приведёт к вылету! В счётчик команд может быть передан только АДРЕС (то бишь вектор)!!! Это разные вещи! Принципиально разные!

Так определитесь наконец ИНСТРУКЦИЯ или ВЕКТОР.

RST или CALL - это инструкции, а вектором в них является АДРЕСНАЯ часть. Сама инструкция передается процессору, который интерпретирует ее соответствующим образом. И если быть до конца точным, то иструкция записывается в регистр команд, а в счетчик команд заносится адресная часть инструкции (ВЕКТОР) в процессе выполнения соответствующей команды.
Я думаю, теперь мы пришли к консенсусу. Или нет?
SasaVitebsk
Так об этом и был спор. Дело в том, что уже в 8259А есть режим (для 8086) прямой передачи вектора. Это и делалось впоследствии для других процессоров. Никаких инструкций при этом не передавалось.

Кстати таким макаром, как 8259 в принципе можно работать и с другими МП. По крайней мере с 8951. Для этого надо (привожу пример для 8951 или для AVR с внешней памятью программ)
1) Внешний самодельный контроллер выставляет Int0
2) По прерыванию (Int0) МК переходит на отсутствующий адрес (Скажем FFF0).
3) По чтению с адреса контроллера (FFF0) выставляется код команды JMP xxx на вектор перехода.
4) Прерывание сбрасывается спец. обращением к контроллеру.

Таким образом можно реализовать расширенные прерывания. Время реакции будет увеличено на 2 команды JMP.

smile.gif

Хотя конечно это из разряда ПДП для AVR

http://elm-chan.org/docs/avr/avrdma_e.html
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.