khorght 0 3 июня, 2014 Опубликовано 3 июня, 2014 · Жалоба Здравствуйте,уважаемые. Никак не получается заставить работать 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 не срабатывает, прерывание не выстреливает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zig 34 30 июня, 2014 Опубликовано 30 июня, 2014 · Жалоба Попробуй добавить к инициализации 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); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться