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

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

 

}

}

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...