нюанс в прерываниях, спасите :\

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 136
Зарегистрирован: Ср янв 23, 2013 10:58:31

Сообщение 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.
обьясните плиз почему так происходит, или даите ссыль , ато нифига не могу наити по этому поводу, а логика не прет :'(
СПАСИБО!
Реклама
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

http://radio-stv.ru/wp-content/uploads/ ... _kniga.pdf

Вот. Скачайте себе и больше ничего не выдумывайте. И Протеусу на слово никогда не верьте (если, конечно, Вы не планируете ограничить свое обучение морганием светодиодами).
Fucking static initialization order fiasco
Контактная информация:
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1811
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Dessp, книжка это, конечно, хорошо, но если можете, то читайте спецификацию в оригинале.

Возврат из прерывания должен выполняться инструкцией reti. Можно и по другому, но надо всё понимать досконально, что, где, как, зачем и почему. Иначе можете попасть в "лес из грабель" :)

Чтобы возврат из прерывания работал нормально надо установить указатель стека. В приведённом кусочке кода этого не видно (опущено намерено?).

Соответствующий флаг прерывания автоматически сбрасывается либо при входе в прерывание, либо при выходе из обработчика по reti. Обычно. Может зависеть от настроек конкретной периферии. В любом случае, как я написал выше, смотрите спецификацию на соответствующий МК.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Встал на лапы
Сообщения: 136
Зарегистрирован: Ср янв 23, 2013 10:58:31

Сообщение Dessp »

народ ну что вы, книжки я читал, а спецификация, я читаю все по даташиту.

я привел кусок кода который именно имеет интерес. стек инициализируется автоматически или принудительно через SPL регистр (atiny2313)

вот по конкретному отвветте пжл если знаете. ато или или не устраивает.

а вот если протеус врет, то как попробовать? только реально прошивать?

п.с. дело именно в том что не хочу я через reti, мне надо чтобы при выходе из прерывания флаг не сбрасывался.
Реклама
Эиком - электронные компоненты и радиодетали
Мудрый кот
Аватара пользователя
Сообщения: 1811
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Dessp писал(а):народ ну что вы, книжки я читал, а спецификация, я читаю все по даташиту
О! Это другое дело! :beer:
Dessp писал(а):только реально прошивать?
В симуляторе студии прогнать. Там симуляция, по идее, должна быть аккуратнее.

Может классическим методом обойтись - в прерывании флаг выставлять в регистре или в памяти?
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Встал на лапы
Сообщения: 136
Зарегистрирован: Ср янв 23, 2013 10:58:31

Сообщение Dessp »

во первых спасибо за ваше время.

во вторых, давайте по порядку... никак не могу найти ответ не в даташите не в интернете... когда обнуляется флаг прерывания? (например INT0)?
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1811
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение 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.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Встал на лапы
Сообщения: 136
Зарегистрирован: Ср янв 23, 2013 10:58:31

Сообщение Dessp »

ну вот, я тоже так подумал. но этого именно там не сказано. в переводе это озночает, что флаг будет сброшен когда прерывание будет исполнено, так?

ну так прерывание можно и закончить командой ret. собственно поискав в интернете нашел такое:

http://www.avrfreaks.net/forum/sei-ret- ... ic&t=34160

тут говориться что sei + ret = reti функционально.

тоесть, ret тоже завершает прерывание, только различие в том , что не ставит флаг I в SREG, я прав?

тогда вопрос, почему флаг в регистре прерывание остаеться, когда я пишу только ret? (пример моего когда, эмулированнй в протеусе)????

Это баг протеуса, мне записать контроллер и в реале посмотреть?
Мудрый кот
Аватара пользователя
Сообщения: 1811
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Повторюсь.
Kavka писал(а):Может классическим методом обойтись - в прерывании флаг выставлять в регистре или в памяти?
Чем вызвана такая нужда в отсутствии сброса флага?
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

Досконально не проверял, но по Евстифееву флаг сбрасывается при переходе к обработчику прерывания, а не по факту его выполнения. В таком случае команды ret и reti вообще не должны на флаг влиять ни коим образом (команда reti влияет только на установку флага разрешения прерываний). Проверять лучше в железе - будет хоть какая-то гарантия.
Fucking static initialization order fiasco
Контактная информация:
Встал на лапы
Сообщения: 136
Зарегистрирован: Ср янв 23, 2013 10:58:31

Сообщение Dessp »

kavka нужда есть всвязи с ADC, но уже суть не в этом , а в понимании.


не знаю что там по евстигнееву, а по протеусу, флаг в начале прерывания НЕ СБРАСЫВАЕТЬСЯ!!!

хорошо, сегодня займусь проверкой на железе.
ks0
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Сообщение ks0 »

Dessp писал(а): надеюсь что после выхода из прерывания сново будет вход в прерывание и так до бесконечности (флаг же не стирается через ret),
Kavka писал(а):When an edge or logic change on the INT0 pin triggers an interrupt request
Я вот сомневаюсь, что будет повторный вход в прерывание
Мудрый кот
Аватара пользователя
Сообщения: 1811
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

ks0, ну да, может быть определяется именно смена состояния, а не наличие статической "еденички".
Pink-Pank писал(а):по Евстифееву флаг сбрасывается при переходе к обработчику прерывания
Прерывания по таймеру сбрасывают флаги прерываний таймеров именно при входе в прерывание.
Dessp писал(а):хорошо, сегодня займусь проверкой на железе.
Ждём.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Встал на лапы
Сообщения: 136
Зарегистрирован: Ср янв 23, 2013 10:58:31

Сообщение 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 не помогла :D)
Встал на лапы
Сообщения: 136
Зарегистрирован: Ср янв 23, 2013 10:58:31

Сообщение Dessp »

собрал свою схему ADC написал прогу и все работает, а в протеусе не работает... это печаль, ибо на лекциях я преподаю студентам и у меня там стоит протеус, на нем я предворительно показываю и говорю им чтобы они дома тестили свои программы на протеусе, а он блин сам такие просты преограммы не правильно эмулирует :(

может подскажете что нить получше протеуса?
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1315
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

Сообщение НАПАЛМ »

Макетка+цифровой осцил :)))
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

на лекциях я преподаю студентам
чему-то плохому детей учите... Отсутствует сохранение - восстановление контекста прерываний, задержка в прерывании наоборот, присутствует. ай я яй... :(
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Какая связь между АЦП и выходом из прерывания через жопу, я так и не понял. По-моему, рановато вам других учить...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Встал на лапы
Сообщения: 136
Зарегистрирован: Ср янв 23, 2013 10:58:31

Сообщение Dessp »

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

п.с. по сушеству кто то ответит?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18786
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Ответить

Вернуться в «AVR»