MicroCHIP.RU
Главная Документация Отладочные средства Справочник Поиск Ссылки
 Новости   Конференция   Контакты 
 

Прерывание в прерывании

 Нoвaя темa  |  Наверх  |  Перейти к теме  |  Поиск  |  Правила  |  Вход 

ВНИМАНИЕ!
Вы просматриваете архив форума.

Этот форум работает только в режиме просмотра и поиска.

Действующий форум переведен на новый движок и
находится по адресу www.microchip.su

 Прерывание в прерывании
Автор: sergant ()
Дата:   21/04/2004 11:40

Помогите ламеру!!!!

Возможно ли на Си htрicc для процессоров PIC16 сделать одно прерывание глобальным,
а все остальные используемые в проекте локальными, т.е. во времы обработки локальных
возможен выход на обработку глобального, а обработке глобального локальные не мешают.

В инфе на htpicc по этому поводу написано как-то непонятно даже с переводчиками(язык не знаю).

Если что-либо подскажите,подкинете или подтолкнёте в правильном направлении то буду очень
благодарен.


 
 Re: Прерывание в прерывании
Автор: TSV ()
Дата:   21/04/2004 12:08

Ну, можно попробовать сделать так: глобальное прерывание разрешаешь
аппаратно (т.е. взводишь соотв. бит в регистрах INTCON и PIE1), а другие
просто опрашиваешь по флагам:
  if (RBIF == 1)
    {........
          }
  if (INTF == 1)
    {........
          }

Я так думаю....


 
 ты хочешь-то чего?
Автор: Vova ()
Дата:   21/04/2004 12:11

вложенные прерывания хочешь сделать?

скажу, что в принципе (как я себе представляю) можно, но
накладные расходы (сохранение контекста дважды или еще больше, время входа в прерывание) большими
получаются и не кузяво это, да и плюс ко всему на чистом си я бы даже и не начинал - обработчик на асме бы делал
...


 
 Re: ты хочешь-то чего?
Автор: sergant ()
Дата:   21/04/2004 12:29

Именно вложенные и по возможности на Си (если восможно такое сделать).

Сам я только начинаю программировать, и сразу на си (асмовский код прочитать могу без труда, но
писать не продовал)

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


 
 ууу
Автор: Vova ()
Дата:   21/04/2004 12:51

если только начинаешь программировать, то я бы тебе не советовал. чес слово.

для пик16 вложенные
прерывания очень и очень гемморойно. это если в общем случае, а если ....
может это чтонить навеет
http://www.microchip.ru/phorum/read.php?f=2&i=31603&t=31603

но мой тебе совет - организуй
прогу иначе - чтобы этого не требовалось.


 
 Re: ууу
Автор: NickB ()
Дата:   21/04/2004 14:06

На ПИК16 сделать вложенные прерывания невозможно в приципе
Не удасться сохранить контекст
Переходи на 18 серию


 
 Re: ууу
Автор: Andrey ()
Дата:   21/04/2004 14:35

NickB писал(а):

> На ПИК16 сделать вложенные прерывания невозможно в приципе
> Не удасться сохранить контекст
> Переходи на 18 серию
Ну зачем так категорично?
Что мешает?
Если только собственная невнимательность ну может ещё
с Си будут какие трудности.


 
 действительно. просим док-в.
Автор: Vova ()
Дата:   21/04/2004 14:41

отчего ж не возможно??

попал на вектор. сохранил "в" и статус и фср гденить. проверил уже ли в
прерывании (если надо, типа чтобы обработку одного и того же прерывания не запускать пока не отработал
обработчик этого прерывания) и чего обрабатываем. сохранил все что нужно в программном стеке.
переместил "в", статус и фср в него же ... чего там еще ... подумать надо аккуратненько ... выяснил
источник прерывания, сбросил флаг, пошел его обрабатывать, разрешил глобальные прерывания
...

где подвох?


 
 Re: действительно. просим док-в.
Автор: NickB ()
Дата:   21/04/2004 15:32

Никакого подвоха нет.
Попробуйте сохранить W. Для этого отводится по 1 байту в каждом из банков и туда
сохраняем W. Затем все остальное.
A если прерывания будут вложенные - необх по 1 адресу для каждого уровня
Ну и как вы определите куда сохраняться на испортив STATUS?




 
 Re: действительно. просим док-в.
Автор: next ()
Дата:   21/04/2004 15:45

Все делается запросто, "ловкость рук и никакого мошенничества".
Только вот "на.уя попу гармонь"?
Это что за задача где такое понадобится?


 
 Re: действительно. просим док-в.
Автор: Andrey ()
Дата:   21/04/2004 15:55

NickB писал(а):

> Никакого подвоха нет.
> Попробуйте сохранить W. Для этого отводится по 1 байту в каждом
> из банков и туда сохраняем W. Затем все остальное.
> A если прерывания будут вложенные - необх по 1 адресу для
> каждого уровня
> Ну и как вы определите куда сохраняться на испортив STATUS?

Какие проблемы?
-Войдя в прерывание,установить флаг F
-В нужном месте разрешить новое(вложеное) прерывание
-Когда оно случится,в первую очередь проверить F (BTFSS RGFL,F)
-Если окажется что это вложение заработало,то сохраняться в
другие (запасные) ячейки.STATUS и W от этого не испортятся.
А если банк только один,тогда ещё проще.

org 0x04
BTFSS RGFL,F
go to m1
movwf temp_w1
swapf status,w
movwf temp_st1
go to <вложенное действие>

m1:
здесь всё как в обычном прерывании
movwf temp_w
swapf status,w
movwf temp_st
.....
bsf rgfl,f
bsf intcon,gie
.....
..... здесь может быть или не быть вложенное прерывание
bcf intcon,gie
bcf rgfl,f

retfie

ИМНО лучше обойтись вообще без вложений


 
 Re: действительно. просим док-в.
Автор: NickB ()
Дата:   21/04/2004 16:25

RGFL - это что у вас?
Если это переменная то Ваш код работает только в однобанковой конфигурации


 
 Re: Прерывание в прерывании
Автор: NickB ()
Дата:   21/04/2004 16:31

Хотя... наверное Вы правы
Только переменную для флага надо зеркалировать на все банки
И все же лучше использовать ПИК18 - 2 уровня честных и приоритетных
Да и по одному из уровней можно организовать вложенность если пожертвовать
одним их регистров-указателей


 
 Re: действительно. просим док-в.
Автор: Andrey ()
Дата:   21/04/2004 16:32

NickB писал(а):

> RGFL - это что у вас?
> Если это переменная то Ваш код работает только в однобанковой конфигурации
Это регистр флагов по адресу 0х70 в PIC16F876 :)

А что в однобанковой конфигурации сейчас уже никто не работает7
У меня большинство девайсов именно на мелких(однобанковых) пиках...
...вопрос-то как стоял?

А с 18-ми ...проблема с их наличием + цена
и с наличием у них 8 ногих процев



Отправка отредактированного (21/04/2004 16:34)


 
 прерывание для звука
Автор: sergant ()
Дата:   21/04/2004 16:43


Прерывания от TMR2 для звуковой сигнализации.
Также прерывание от TMR0 для динамической индикации и клавиатуры.
Внешнее прерывание (очень медленное).

При включённом звука слышится небольшой , но отчётливый треск

Вставил несколько проверок флага от TMR2.
Выбросил лишнее из прерывания от TMR0 и вставил проверку флага внешнего преравания


Звуковой сигнал больше не трещит и все работает

Хорошая мысля приходит апосля...


 
 все ж написано уже
Автор: Vova ()
Дата:   21/04/2004 16:47

если внимательно присмотреться ...


 
 Re: Прерывание в прерывании
Автор: НикН ()
Дата:   21/04/2004 17:24

Возможен другой подход - когда глобальные прерывания очень часто, и в них обязательно надо
попасть вовремя - для всех остальных прерываний (они возникают гораздо реже и не так критичны
во времени) при обработке только сбрасываем флаг и выставляем свой дополнительный флаг,
который обрабатываем в фоне.




 
 В том то и вопрос: где сохранять?
Автор: Bill ()
Дата:   21/04/2004 17:36

Точка входа то одна, и прежде чем начать проверку что за прерывание, нужно сначала сохранить
регистры и статус. А где? Область сохранения уже занята. Можно организовать программный стек, но
накладные затраты по времени будут слишком велики. А с учетом того, что выявление источника запроса
на прерывание делается программно, то реакция системы на внешние события будет очень низкой.
Так что, лучше последовать совету перейти на PIC18, или обойтись без вложенного прерыания.


 
 хто готов на подвиг? ;)
Автор: Vova ()
Дата:   21/04/2004 17:40

из любви к искусству? и в аналы, так сказать, истории войдет ...

выкладайте готовый рабочий пример
вложенных прерываний (шоб типа менеджер задач присутствовал), случай хочется как можно более общий
;)

а можно еще и с приоритетами ... хотя совсем уж монстр получится, приоритеты пусть будут
определяться порядком проверки флагов.



у меня как-то была даже мысля сварганить вытесняющую
ось ... да-да, именно вытесняющую. в общем виде, конечно, не получится, но если все задачи будут
call'ить по хитрому
(http://www.microchip.ru/phorum/read.php?f=2&i=10365&t=10060#reply_10365) и return'ить
соответственно тоже, а передача управления от задачи к задаче хитрым менеджером ... хотя
возвращаться-то (продолжать задачу с места прерывания) в тоже место не получится ... нее ...
вытесняющая никак не выходит :) но как разминка для ума - прикольно :)


 
 я ж предложил уже.
Автор: Vova ()
Дата:   21/04/2004 17:43

по входу в прерывание сохраняться-то будет в одно и тоже место, но до разрешения глобальных прерываний
все эти регистры переписываются в другое место, чтобы не затереть ...


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


 
 а еще Andrey предлагал
Автор: Vova ()
Дата:   21/04/2004 17:57

по входу ветвиться btfss-goto и как бы два независимых обработчика, каждый сохраняет и
восстанавливает из своего места ... а там же можно и еще поветвиться ... ;)


но размаха нет, хочу
менеджер хитрый :)


 
 Re: а еще Andrey предлагал
Автор: Andrey ()
Дата:   21/04/2004 18:18

Vova писал(а):

> но размаха нет, хочу
> менеджер хитрый :)
:)
Но хитрый менеджер займет много места и время...как-то это :(

В том примере... я делал как-то на 876,именно вложеное прерывание сильно захотелось.
Сделал,работало, но потом репу почесал и выкинул вообще все прерывания,
получилось и быстрее и вроде даже компактнее и уж явно проще.
Наверное тут компромисс нужен,задача-> организация решения-> тип процессора
и сильно навороченые вложения просто не потребуются НИКОГДА.


 
 Я посмотрел
Автор: Bill ()
Дата:   21/04/2004 18:21

Насчет btfss это хорошо придумано. Но в остальном, хлопот полон рот. Овчинка выделки не стоит.


 
 piclist - nested interrupts
Автор: Vova ()
Дата:   19/07/2004 15:54

http://www.piclist.com/techref/microchip/sstack.htm