Jump to content

    

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

Recommended Posts

khorght

Здравствуйте,уважаемые. Никак не получается заставить работать 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 не срабатывает, прерывание не выстреливает.

Share this post


Link to post
Share on other sites

Zig

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

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);

 

}

}

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.