Страница 1 из 2
нюанс в прерываниях, спасите :\
Добавлено: Пт сен 12, 2014 16:16:18
Dessp
значится так:
вот такая вор прога:
Код: Выделить всё
main:
****
register/interrupt initial
***
main:
in R16,GIFR
out PORTB,R16
;sei
rjmp main
INT_0:
in R16,GIFR
out PORTB,R16
rcall w200_mks
sbi PIND,4
;sei
;ret
reti
когда юзаю прерывание на ногу (int0) то смело вижу через протеус, что флаг в регистре GIFR становиться 0 только после выхода из прерывания (reti)
когда меняю reti на ret, то после возврашения в основную программу, вижу что флаг в регистре GIFR не становиться 0 (по прежнему 1) отюда понимаю, что ret не сбрасывает прерывание.
когда перед ret в конце прерывания пишу sei (чтобы перед выходом снова поставить флаг global interrupt) и надеюсь что после выхода из прерывания сново будет вход в прерывание и так до бесконечности (флаг же не стирается через ret), то вижу что ничего подобного, 2го раза входа в прерывание нету (sbi PIND,4 нету инверсии на выходе) и ФЛАГ ПРЕРЫИВАНИЯ СБРОШЕН В 0. вопрос, как такое происходит, кто сбрасывает флаг GIFR INT0 ?
п.с. тот же результат если я пишу sei в цикле main.
обьясните плиз почему так происходит, или даите ссыль , ато нифига не могу наити по этому поводу, а логика не прет :'(
СПАСИБО!
Re: нюанс в прерываниях, спасите :\
Добавлено: Пт сен 12, 2014 17:47:23
Pink-Pank
http://radio-stv.ru/wp-content/uploads/ ... _kniga.pdf
Вот. Скачайте себе и больше ничего не выдумывайте. И Протеусу на слово никогда не верьте (если, конечно, Вы не планируете ограничить свое обучение морганием светодиодами).
Re: нюанс в прерываниях, спасите :\
Добавлено: Пт сен 12, 2014 19:00:51
Kavka
Dessp, книжка это, конечно, хорошо, но если можете, то читайте спецификацию в оригинале.
Возврат из прерывания должен выполняться инструкцией reti. Можно и по другому, но надо всё понимать досконально, что, где, как, зачем и почему. Иначе можете попасть в "лес из грабель"
Чтобы возврат из прерывания работал нормально надо установить указатель стека. В приведённом кусочке кода этого не видно (опущено намерено?).
Соответствующий флаг прерывания автоматически сбрасывается либо при входе в прерывание, либо при выходе из обработчика по reti. Обычно. Может зависеть от настроек конкретной периферии. В любом случае, как я написал выше, смотрите спецификацию на соответствующий МК.
Re: нюанс в прерываниях, спасите :\
Добавлено: Пт сен 12, 2014 20:24:07
Dessp
народ ну что вы, книжки я читал, а спецификация, я читаю все по даташиту.
я привел кусок кода который именно имеет интерес. стек инициализируется автоматически или принудительно через SPL регистр (atiny2313)
вот по конкретному отвветте пжл если знаете. ато или или не устраивает.
а вот если протеус врет, то как попробовать? только реально прошивать?
п.с. дело именно в том что не хочу я через reti, мне надо чтобы при выходе из прерывания флаг не сбрасывался.
Re: нюанс в прерываниях, спасите :\
Добавлено: Пт сен 12, 2014 20:56:38
Kavka
Dessp писал(а):народ ну что вы, книжки я читал, а спецификация, я читаю все по даташиту
О! Это другое дело!
Dessp писал(а):только реально прошивать?
В симуляторе студии прогнать. Там симуляция, по идее, должна быть аккуратнее.
Может классическим методом обойтись - в прерывании флаг выставлять в регистре или в памяти?
Re: нюанс в прерываниях, спасите :\
Добавлено: Пт сен 12, 2014 20:59:00
Dessp
во первых спасибо за ваше время.
во вторых, давайте по порядку... никак не могу найти ответ не в даташите не в интернете... когда обнуляется флаг прерывания? (например INT0)?
Re: нюанс в прерываниях, спасите :\
Добавлено: Пт сен 12, 2014 21:21:20
Kavka
Вы не упомянули тип контроллера. Поэтому практически первый попавшийся под руку даташит - ATmega16A.
13.1.4 GIFR – General Interrupt Flag Register
> Bit 6 – INTF0: External Interrupt Flag 0
When an edge or logic change on the INT0 pin triggers an interrupt request, INTF0 becomes set
(one). If the I-bit in SREG and the INT0 bit in GICR are set (one), the MCU will jump to the corre-
sponding interrupt vector. The flag is cleared when the interrupt routine is executed.
Alternatively, the flag can be cleared by writing a logical one to it. This flag is always cleared
when INT0 is configured as a level interrupt.
Думаю, что это можно трактовать, что сброс флага будет по reti.
Re: нюанс в прерываниях, спасите :\
Добавлено: Пт сен 12, 2014 21:26:16
Dessp
ну вот, я тоже так подумал. но этого именно там не сказано. в переводе это озночает, что флаг будет сброшен когда прерывание будет исполнено, так?
ну так прерывание можно и закончить командой ret. собственно поискав в интернете нашел такое:
http://www.avrfreaks.net/forum/sei-ret- ... ic&t=34160
тут говориться что sei + ret = reti функционально.
тоесть, ret тоже завершает прерывание, только различие в том , что не ставит флаг I в SREG, я прав?
тогда вопрос, почему флаг в регистре прерывание остаеться, когда я пишу только ret? (пример моего когда, эмулированнй в протеусе)????
Это баг протеуса, мне записать контроллер и в реале посмотреть?
Re: нюанс в прерываниях, спасите :\
Добавлено: Пт сен 12, 2014 22:31:50
Kavka
Повторюсь.
Kavka писал(а):Может классическим методом обойтись - в прерывании флаг выставлять в регистре или в памяти?
Чем вызвана такая нужда в отсутствии сброса флага?
Re: нюанс в прерываниях, спасите :\
Добавлено: Пт сен 12, 2014 22:49:05
Pink-Pank
Досконально не проверял, но по Евстифееву флаг сбрасывается при переходе к обработчику прерывания, а не по факту его выполнения. В таком случае команды ret и reti вообще не должны на флаг влиять ни коим образом (команда reti влияет только на установку флага разрешения прерываний). Проверять лучше в железе - будет хоть какая-то гарантия.
Re: нюанс в прерываниях, спасите :\
Добавлено: Сб сен 13, 2014 07:56:15
Dessp
kavka нужда есть всвязи с ADC, но уже суть не в этом , а в понимании.
не знаю что там по евстигнееву, а по протеусу, флаг в начале прерывания НЕ СБРАСЫВАЕТЬСЯ!!!
хорошо, сегодня займусь проверкой на железе.
Re: нюанс в прерываниях, спасите :\
Добавлено: Сб сен 13, 2014 08:32:06
ks0
Dessp писал(а): надеюсь что после выхода из прерывания сново будет вход в прерывание и так до бесконечности (флаг же не стирается через ret),
Kavka писал(а):When an edge or logic change on the INT0 pin triggers an interrupt request
Я вот сомневаюсь, что будет повторный вход в прерывание
Re: нюанс в прерываниях, спасите :\
Добавлено: Сб сен 13, 2014 10:14:05
Kavka
ks0, ну да, может быть определяется именно смена состояния, а не наличие статической "еденички".
Pink-Pank писал(а):по Евстифееву флаг сбрасывается при переходе к обработчику прерывания
Прерывания по таймеру сбрасывают флаги прерываний таймеров именно при входе в прерывание.
Dessp писал(а):хорошо, сегодня займусь проверкой на железе.
Ждём.
Re: нюанс в прерываниях, спасите :\
Добавлено: Вс сен 14, 2014 13:28:26
Dessp
значит так, проверил: протеус разочеровал :\
при входе в процедуру прерывания, флаг прерывания снимаеться:
Код: Выделить всё
INT_0:
in R16,GIFR
out PORTB,R16
rcall w200_mks
sbis PIND,2
reti
rcall w200_mks
sbi PIND,4
rcall w200_mks1
;sei
;ldi R16,0b0100000
;end88: rjmp end88
;ser R16
;out GIFR,R16
ret
на порте B светадиоды не горели.
ret от reti отличаеться лиш тем, что ret не ставит бит глобальных прерываний в SREG. тоесть, если во время прерывания, будет еше одно такое же прерывание, то если стоит в конце ret, то после выхода из прерывания, если считать GIFR, там будет стоять флаг. ПРОВЕРЕНО.
так как протеус разочеровал, попытаюсь протестировать мою прогу с ADC в реале, потом отпишусь.
п.с. еше один вопрос... если записать в регистр флагов прерываннй единицу, от обнуляешь флаг прерывания. а если хочешь программно запустить прерывание, как поступить? (запись туда 0 не помогла

)
Re: нюанс в прерываниях, спасите :\
Добавлено: Вс сен 14, 2014 14:28:54
Dessp
собрал свою схему ADC написал прогу и все работает, а в протеусе не работает... это печаль, ибо на лекциях я преподаю студентам и у меня там стоит протеус, на нем я предворительно показываю и говорю им чтобы они дома тестили свои программы на протеусе, а он блин сам такие просты преограммы не правильно эмулирует
может подскажете что нить получше протеуса?
Re: нюанс в прерываниях, спасите :\
Добавлено: Вс сен 14, 2014 15:41:38
НАПАЛМ
Макетка+цифровой осцил

Re: нюанс в прерываниях, спасите :\
Добавлено: Вс сен 14, 2014 15:56:40
urry
на лекциях я преподаю студентам
чему-то плохому детей учите... Отсутствует сохранение - восстановление контекста прерываний, задержка в прерывании наоборот, присутствует. ай я яй...

Re: нюанс в прерываниях, спасите :\
Добавлено: Вс сен 14, 2014 18:25:13
ARV
Какая связь между АЦП и выходом из прерывания через жопу, я так и не понял. По-моему, рановато вам других учить...
Re: нюанс в прерываниях, спасите :\
Добавлено: Вс сен 14, 2014 19:52:00
Dessp
да да, великие гуру, мне с вами не сравниться. и преподовать мне вообше не зачем, я вас понял...
п.с. по сушеству кто то ответит?
Re: нюанс в прерываниях, спасите :\
Добавлено: Вс сен 14, 2014 21:05:43
ARV
По существу: не пытайтесь писать странно. Обычные программы протеус хорошо эмулирует.