Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт июн 08, 2010 15:53:53
Потрогал лапой паяльник
Зарегистрирован: Сб сен 06, 2008 12:56:13 Сообщений: 326
Рейтинг сообщения:0
neon-f писал(а):
подскажите, если запрещаешь прерывания
Код:
#asm("cli")
в это время произходит прерывание, потом разрешаешь прерывание
Код:
#asm("sei")
- это прерывание потеряно? или после разрешения прерываний оно обработается?
Если флаг общего разрешения прерываний "I" в регистре SREG сброшен - команда #asm("cli"), то, если после этого возникают условия отдельных прерываний, устанавливаются их флаги. После общего разрешения прерываний, они обрабатываются в порядке приоритета.
в это время произходит прерывание, потом разрешаешь прерывание
Код:
#asm("sei")
- это прерывание потеряно? или после разрешения прерываний оно обработается?
Если флаг общего разрешения прерываний "I" в регистре SREG сброшен - команда #asm("cli"), то, если после этого возникают условия отдельных прерываний, устанавливаются их флаги. После общего разрешения прерываний, они обрабатываются в порядке приоритета.
Ничего не догнал. У кого нибудь примерчик будет , что бы можно было пощупать?
Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт июн 08, 2010 17:10:28
Потрогал лапой паяльник
Зарегистрирован: Сб сен 06, 2008 12:56:13 Сообщений: 326
Рейтинг сообщения:0
nsl2004 писал(а):
Ничего не догнал. У кого нибудь примерчик будет , что бы можно было пощупать?
Можно словесно. Допустим, у вас есть разрешение на прерывание по переполнению таймера0. Теперь вы запрещаете глобально все прерывания (cli). Таймер продолжает работать, разрешение на прерывание по его переполнению есть, выставляются флаги запроса прерывания. Но глобальное условие запрещает все прерывания. Флаг запроса таймера не "пропадает" и при общем разрешении прерываний (sei), он обработается. Но есть один момент. Если в период "перерыва" в прерываниях возникло несколько запросов от таймера, то выполнится только последнее.
а если такой варианнт. во время #asm("cli") - #asm("sei") происходит два разных события, например переполнение Т0 и Т2, значит подымется 2 разных флага и после #asm("sei") обработаются оба события ???
Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Вт июн 08, 2010 17:44:39
Потрогал лапой паяльник
Зарегистрирован: Сб сен 06, 2008 12:56:13 Сообщений: 326
Рейтинг сообщения:0
neon-f писал(а):
а если такой варианнт. во время #asm("cli") - #asm("sei") происходит два разных события, например переполнение Т0 и Т2, значит подымется 2 разных флага и после #asm("sei") обработаются оба события ???
Да, с учетом сказанного выше и в порядке приоритета.
Небольшое дополнение - есть все-таки флаги которые могут потеряться, их немного но все-же. Например внешнее прерывание по низкому уровню на выводе - флаг устанавливается только на время действия низкого уровня, естественно если низкий уровень произошел между командами cli и sei. Естественно если команды идут подряд, то это очень короткий промежуток и вероятность пропуска прерываний мала, но если между командами есть еще и другие - т.е время между командами не очень мало, то есть вероятность пропустить короткий импульс.
Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср июн 09, 2010 12:11:48
Потрогал лапой паяльник
Зарегистрирован: Сб сен 06, 2008 12:56:13 Сообщений: 326
Рейтинг сообщения:0
Да, такая вероятность есть. Только флаг там не устанавливается. Прерывание действует все время, пока присутствует условие, в данном случае - низкий уровень, а флаг сброшен постоянно.
ну с этим вопросом все понятно теперь такой вопрос я в прерывании подымаю "флаг" , потом в теле проверяю поднят ли, и если да, то делаю какое-то действие, а флаг сбрасываю. в качестве флага у меня обычная переменная. а как можно обойтись без переменной? где то читал что можно использовать регистры, которые сами сбрасываются после использования, но где не найду. вот как это сейчас делаю я:
Код:
bit flag=0; interrupt [TIM0_OVF] void timer0_ovf_isr(void) { flag=1; } .................... if (flag==1) {flag=0; какой то мой код ;}
Заголовок сообщения: Re: CodeVision AVR в вопросах и ответах
Добавлено: Ср июн 09, 2010 13:33:12
Потрогал лапой паяльник
Зарегистрирован: Сб сен 06, 2008 12:56:13 Сообщений: 326
Рейтинг сообщения:0
Я тоже пользуюсь таким приемом, чтобы совершить какие-то действия после возврата из прерывания. Другие пока не знаю. Переменная то, битовая, в чем проблема.
прерывание для того и существует, чтобы немедленно отреагировать на какое-то событие. только в очень редких случаях можно согласиться с тем, что событие фиксируется мгновенно, а обрабатывается затем когда-нибудь, например, при фиксации игольчатых импульсов. в других случаях надо трижды подумать, оправдан ли такой подход. можео сделать обработку события в самом обработчике прерываний, или наоборот, обойтись вообще без прерываний - методом опроса. вот смотрите: вы ставите флаг в обработчике - зачем? если запретить обработку прерывания по переполнению таймера, то не потребуется и переменная-флаг: в регистре TIFR и так при переполнении таймера установится соответствующий бит-флаг! вам остается только иной раз проверять - стоит флаг или нет. а сбросить его можно записью единички. вот и выходит, что в вашем случае нет нужды тратить память на обработчик прерывания и битовую переменную...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
bit flag=0; interrupt [TIM0_OVF] void timer0_ovf_isr(void) { какой то код связанный с динамической индикацией } interrupt [TIM1_COMPA] void timer1_compa_isr(void) { какой то код2 flag=1; } .................... if (flag==1) {flag=0; чтение ds18b20 ;}
для чтения ds18b20 использую модифицированную библиотеку, которая запрещает прерывания на время общения по 1 Wire. так вот если чтение ds18b20 делать внутри прерывания, то останавливается динамическая индикация. а если читать ds18b20 вообще без прерываний, то получается постоянное чтениедатчика, что во первых вредно точности измерения, и самое главное контроллеру некогда опрашивать кнопки. если добавить задержку delay, то до кнопок вообще дело не доходит. Вот такое кино.
в том случае, если флаг сигнализирует о том, что надо что-то сделать действительно "редкое", ваш подход оправдан. более того, долгие процедуры (а работу с датчиком быстрой не назовешь) недопустимо делать в прерывании. однако, помимо всего прочего, вам бы надо модифицировать свою функцию работы с датчиком так, чтобы прерывания запрещались только на время тайм-слота, т.е. примерно 15-20 микросекунд, а не на весь процесс обмена (порядка нескольких миллисекунд) - тогда никакого влияния на динамическую индикацию и что-либо еще работа с датчиком не окажет (20 микросекунд слишком мало, чтобы быть заметным человеку)
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
так у меня и запрещается только на время тайм-слота, поэтому динамическая индикация и не прерывается. а вот если чтение датчика делать внутри одного из прерываний, то уже не важно как и на сколько запрещать, и запрещать ли вообще, т.к. пока не обработается одно, второе все равно не наступит.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения