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

 
 
> Запрет прерывания в прерывании, Глючу или я, или АВРстудия
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
tag
сообщение Jun 29 2007, 08:10
Сообщение #6


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

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



Цитата(prottoss @ Jun 28 2007, 15:19) *
Читайте топик с начала - смысл в том, чтобы по выходу из прерывания оные больше не возникали до тех пор, пока мы не захочем, я ясно выразился?smile.gif


...читал с начала, запутался smile.gif
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, 14:19) смы...   Jun 28 2007, 12:09
||- - prottoss   Цитата(Сергей Борщ @ Jun 28 2007, 20:09) ...   Jun 28 2007, 15:13
- - 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 Текстовая версия Сейчас: 25th June 2025 - 00:52
Рейтинг@Mail.ru


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