Перейти к содержанию

    

AT32UC3A1256 EIC генерит ложные прерывания

Здравствуйте,уважаемые. Никак не получается заставить работать EIC с помощью Atmel ASF. Пытаюсь сделать прерывание по RISING_EDGE, схема подключения пина: пин - выход буфера - SN74LVC8T245 - вход буфера, притянутый к земле через 100кОм. Как только подаю на вход 3Вольта генерится не одно прерывание по переднему фронту а очень много прерываний, от 6 до 20 штук, проверил осциллографом, чистый сигнал, дёрганий не видно, конденсаторы повешены между всему парами питание-земля.Пытался подвесить на вход буфера кондер, ничего не изменилось. Код вот такой:

 

// Enable edge-triggered interrupt.

eic_options.eic_mode = EIC_MODE_EDGE_TRIGGERED;

// Interrupt will trigger on falling edge.

eic_options.eic_edge = EIC_EDGE_RISING_EDGE;

// Initialize in synchronous mode : interrupt is synchronized to the clock

eic_options.eic_async = EIC_ASYNCH_MODE; //EIC_ASYNCH_MODE;

// Set the interrupt line number.

eic_options.eic_line = EXT_INT0;

// Map the interrupt lines to the GPIO pin with the right peripheral functions.

gpio_enable_module_pin(AVR32_EIC_EXTINT_0_PIN, AVR32_EIC_EXTINT_0_FUNCTION);

// Disable all interrupts.

Disable_global_interrupt();

// Register the EIC interrupt handler to the interrupt controller.

INTC_register_interrupt(&eic_int_handler, D0_IRQ, AVR32_INTC_INT0);

// Init the EIC controller with the options

eic_init(&AVR32_EIC, &eic_options, 1);

// Enable the chosen lines and their corresponding interrupt feature.

eic_enable_line(&AVR32_EIC, eic_options.eic_line);

eic_enable_interrupt_line(&AVR32_EIC, eic_options.eic_line);

// Enable all interrupts.

Enable_global_interrupt();

 

 

#if __GNUC__

__attribute__((__interrupt__))

#elif __ICCAVR32__

__interrupt

#endif

static void eic_int_handler(void)

{

...

eic_clear_interrupt_line(&AVR32_EIC, eic_options.eic_line);

}

 

Менял на другие ноги и прерывания ( мало-ли) - результат тот же. Пробовал снять подтяжку и поймать прерывание по заднему фронту, опять то же самое.

Подскажите, пожалуйста в чем может быть проблема. Спасибо

 

PS.Попытка заменить на GPIO INTC, увы невозможна, использую USB, а он при попытке инициализации через INTC_init_interrupts, наглухо убивает USB. А вызов этой функции перед инициализацией USB не срабатывает, прерывание не выстреливает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуй добавить к инициализации

eic_options.eic_filter = EIC_FILTER_DISABLED;

 

А в прерывании

static void eic_int_handler(void)

{

...

if ((eic_is_interrupt_line_enabled(&AVR32_EIC, eic_options.eic_line)

&& (eic_is_interrupt_line_pending(&AVR32_EIC, eic_options.eic_line))) {

eic_disable_interrupt_line(&AVR32_EIC, eic_options.eic_line);

eic_clear_interrupt_line(&AVR32_EIC, eic_options.eic_line);

...

eic_enable_interrupt_line(&AVR32_EIC, eic_options.eic_line);

 

}

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация