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

 
 
> Прерывание не вызывается повторно
Anub
сообщение Jul 10 2008, 14:20
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 26-05-08
Пользователь №: 37 825



ATMEGA16

Такая вот проблема. Изначально МК находится в спящем режиме, при 0 на int1 вызывается прерывание которые выводит мк из спящего режима, После чего повторно вызвать прерывание не удается. Регистры которые я задавал-
MCUCR - 01100000
GICR - 10000000
При этом int1 становится обычным выводом, т. к. специально написанная тестовая функция показала что так оно и есть. Похоже что я где то чего то не прописал?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
defunct
сообщение Jul 10 2008, 14:49
Сообщение #2


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Anub @ Jul 10 2008, 17:20) *
Похоже что я где то чего то не прописал?

Вы не сказали на чем пишете. Да и код привести было бы не плохо, чтобы не гадать
Go to the top of the page
 
+Quote Post
Anub
сообщение Jul 10 2008, 14:58
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 26-05-08
Пользователь №: 37 825



Цитата(defunct @ Jul 10 2008, 18:49) *
Вы не сказали на чем пишете. Да и код привести было бы не плохо, чтобы не гадать

Пишу на Си, с кодом сложновато, но попробую
Код
//Регистры прерываний записанные в main
GICR=0x80;  
MCUCR=0x60;  
GIFR=0x00;      

// Обработка прерывания
interrupt [EXT_INT1] void ext_int1_isr(void)
{
GICR=0x80;
SREG=0x02;
PORTA=0xFF;
    for (i=0; i<=4; i++)
        {
            SYSCODE[i]=0;
        }
    for (i=0; i<=8; i++)
        {
            CORRECT[i]=0;
        }
    PR=0;
    while(PIND==0xF3){};
    scan();
}
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 10 2008, 15:59
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



MCUCR = 0x80; <-- Посмотрите в ДШ флажки ISCxx (врятли вам нужен Level Sensitive int).
GIFR = 0x00; <-- это не обязательно (тем более сброс флагов делается записью "1", а "0" - не имеет никакого эффекта).

SREG=0x02; <--- Уберите это!!

while(PIND==0xF3){}; <-- здесь возможно подвисание.

в остальном все Ок


давайте попробуем Int настроить как Edge Triggered (а не Level Sensitive), и в обработчике просто перевернуть значение порта A.
Код
#define ISC11 3

MCUCR = 0x60 | (1 << ISC11); // int1 on falling edge  (----\int___)
GICR = 0x80;

interrupt [EXT_INT1] void ext_int1_isr(void)
{
    static char x = 0;
    x = ~x;
    PORTA = x;
}
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 01:32
Рейтинг@Mail.ru


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