реклама на сайте
подробности

 
 
> Запрет прерывания в прерывании, Глючу или я, или АВРстудия
Pyku_He_oTTyda
сообщение Jun 25 2007, 16:08
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



Настраиваю прерывание по спаду фронта, все работает.
По условию задачи при заходе в прерывание необходимо запретить это прерывание, что я и пытаюсь сделать очисткой флага INT0 регистра GICR.(мега8).При выходе из прерывания возвращаю флаг INT0.
Однако, когда я нахожусь в прерывании (флаг I и INT0 очищены) и в это время возникает условие прерывания, при выходе из прерывания я сразу же в него опять влетаю (условия прерывания уже нет).
В железе пока не проверял, оно на работе. Смотрел в студии.
Помогите разобратся в ситуации.


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Pyku_He_oTTyda
сообщение Jun 25 2007, 18:26
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



Счас кусок вырежу, выложу
Код
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/wdt.h>
#include <avr/sleep.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

//********************************************************************************
**
#define ADC_VREF_TYPE 0x40

#define REMOTE      PIND0
#define LANC_IN     PIND2

#define LANC_OUT_1        PORTB|=_BV(PORTB1);
#define LANC_OUT_0        PORTB&=~(_BV(PORTB1));

#define INT0_ENABLE       GICR |=_BV(6);
#define INT0_DISABLE      GICR &=~(_BV(6));


unsigned char sub_command = 0x18;
unsigned char command     = 0x33;
unsigned char lanc_count;
unsigned char bit_count;

//********************************************************************************
**

//********************************************************************************
**
void init_mk(void)
{
ACSR=0x80;      //запрет компаратора

DDRB=0x06;      //PB1,PB2 - выхода
PORTB=0xF9;     //подтягивающие резисторы на входах

DDRD=0xE2;      //PD1,PD5,PD6,PD7 - выхода
PORTD=0xC0;     //PD6,PD7 - установлены в "1"

DDRC=0x00;      //все входа
PORTC=0x00;     //подтягиващих резисторов нет

_wdt_write(15);

ADCSRA=0x86;                 //установка Vref для АЦП на AVCC и внешний конденсатор
ADMUX=ADC_VREF_TYPE & 0xff;

MCUCR |=(1<<ISC01);          //установка внешнего прерывания со спаду уровня
INT0_ENABLE;                 //разрешение внешнего прерывания
GIFR=0x40;
}

//********************************************************************************
******
ISR(SIG_INTERRUPT0)
{
INT0_DISABLE;
GIFR |= _BV(INTF0);         //очистка флага прерывания
   if(lanc_count==0)
   {
    
     for(bit_count=0; bit_count<8; bit_count++)
     {
        if(bit_is_set(sub_command,bit_count))
        {
        LANC_OUT_1;
        }
        else
        {
        LANC_OUT_0;
        }
    
     }
   }
INT0_ENABLE;
}
//********************************************************************************
*****
//********************************************************************************
*****
//********************************************************************************
*****
int main (void)
{
init_mk();

sei();

START:

wdt_reset();



goto START;

}


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jun 25 2007, 18:38
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Pyku_He_oTTyda @ Jun 26 2007, 02:26) *
Счас кусок вырежу, выложу
Код
//********************************************************************************
******
ISR(SIG_INTERRUPT0)
{
INT0_DISABLE;
GIFR |= _BV(INTF0);         //очистка флага прерывания
   if(lanc_count==0)
   {
    
     for(bit_count=0; bit_count<8; bit_count++)
     {
        if(bit_is_set(sub_command,bit_count))
        {
        LANC_OUT_1;
        }
        else
        {
        LANC_OUT_0;
        }
    
     }
   }
INT0_ENABLE;
}


Хе, так после того, как произошла очистка флага, ему никто не помешает снова установится, и естественно, так как в конце сервиса прерывание снова разрешается, мы, если имело место событие от внешнего прерывания, снова попадем в обработчикsmile.gif



Кстати, я вообще не вижу смысла в начале обработчика запрещать, а в конце разрешать прерывания - в его теле оно и так не возникнет, Вы же не устанавливаете I в его теле

ИМХО в теле обработчика надо запрещать прерывания, и не разрешать их. А разрешать их в другом потоке, допустим, в главном цикле


--------------------
Go to the top of the page
 
+Quote Post
tag
сообщение Jun 28 2007, 07:14
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 151
Регистрация: 21-02-06
Пользователь №: 14 561



Цитата(prottoss @ Jun 25 2007, 22:38) *
Хе, так после того, как произошла очистка флага, ему никто не помешает снова установится, и естественно, так как в конце сервиса прерывание снова разрешается, мы, если имело место событие от внешнего прерывания, снова попадем в обработчикsmile.gif
Кстати, я вообще не вижу смысла в начале обработчика запрещать, а в конце разрешать прерывания - в его теле оно и так не возникнет, Вы же не устанавливаете I в его теле

ИМХО в теле обработчика надо запрещать прерывания, и не разрешать их. А разрешать их в другом потоке, допустим, в главном цикле



...смысл запрещать? ...The I-bit is cleared by hardware after an interrupt has occurred, and is set by the RETI instruction to enable subsequent interrupts. (см. datasheet на AVR) ... т.е. бит глобального разрешения/запрещения прерываний сбрасывается аппаратно при входе в прерывание и устанавливается аппаратно при выполнении иструкции RETI...
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jun 28 2007, 11:19
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(tag @ Jun 28 2007, 15:14) *
...смысл запрещать? ...The I-bit is cleared by hardware after an interrupt has occurred, and is set by the RETI instruction to enable subsequent interrupts. (см. datasheet на AVR) ... т.е. бит глобального разрешения/запрещения прерываний сбрасывается аппаратно при входе в прерывание и устанавливается аппаратно при выполнении иструкции RETI...
Читайте топик с начала - смысл в том, чтобы по выходу из прерывания оные больше не возникали до тех пор, пока мы не захочем, я ясно выразился?smile.gif


--------------------
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 28 2007, 12:09
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(prottoss @ Jun 28 2007, 14:19) *
смысл в том, чтобы по выходу из прерывания оные больше не возникали до тех пор, пока мы не захочем
Тогда перед разрешением вам надо принудительно сбросить флаг, ибо при возникновении события он установится независимо от того, было разрешено прерывание или нет.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Pyku_He_oTTyda   Запрет прерывания в прерывании   Jun 25 2007, 16:08
- - prottoss   Цитата(Pyku_He_oTTyda @ Jun 26 2007, 00:0...   Jun 25 2007, 16:32
- - Pyku_He_oTTyda   Не помогло Сбрасываю вручную INTF0(единицей), INT0...   Jun 25 2007, 16:58
- - prottoss   ЦитатаWhen an event on the INT1 pin triggers an in...   Jun 25 2007, 17:17
- - Pyku_He_oTTyda   Придется ждать завтрешнего дня   Jun 25 2007, 17:20
- - Erv&Sed   Если сбрасываеш вручную - то надо сбрасывать в 0, ...   Jun 25 2007, 17:36
- - Pyku_He_oTTyda   Флаг прерывания сбрасывается записью в него 1, так...   Jun 25 2007, 17:51
- - prottoss   А мне вот интересно - как можно после выхода из пр...   Jun 25 2007, 17:57
||- - prottoss   Цитата(Сергей Борщ @ Jun 28 2007, 20:09) ...   Jun 28 2007, 15:13
|- - tag   Цитата(prottoss @ Jun 28 2007, 15:19) Чит...   Jun 29 2007, 08:10
- - Pyku_He_oTTyda   действительно)на ровном месте... буду таймером выб...   Jun 25 2007, 18:45
- - Pyku_He_oTTyda   ЦитатаТогда перед разрешением вам надо принудитель...   Jun 28 2007, 18:18


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 15:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01456 секунд с 7
ELECTRONIX ©2004-2016