Jetrano 0 January 21, 2024 Posted January 21, 2024 (edited) · Report post Приветствую! Выполнил настройку прерывания Parallel I/O в QSYS. Создал простой обработчик прерывания в котором включается и через 200 миллисекунд отключается светодиод, снимается interrupt flag. Загрузил программу. При нажатии на кнопку происходит прерывание. Если нажать и держать кнопку более 200 миллисекунд, а затем отпустить кнопку, то вновь происходит прерывание. Почему так? Разве указанные настройки прерывания Parallel I/O не говорят о том, что прерывание должно происходить ТОЛЬКО при условии FALLING EDGE ? //-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- void KBD_IRQ_func(void* context, alt_u32 id) { printf("Hello from KBD_IRQ_func !!!\n"); IOWR(LED_RED_BASE,0,1); usleep(200000); IOWR(LED_RED_BASE,0,0); // clear interrupt flag IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KBD_PULSE_BASE,0); printf("//-----------------------//\r\n"); return; } //-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- int main() { int error; printf("Hello from Nios II!\r\n"); // enable interrupt, 1-keybutton IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KBD_PULSE_BASE, 0xF); // clear capture flag IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KBD_PULSE_BASE, 0); error = alt_irq_register(KBD_PULSE_IRQ, NULL, (void *) KBD_IRQ_func); if (error) printf("Failed to register interrut\r\n"); while (1) { } return 0; } //-------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Edited January 21, 2024 by Jetrano Quote Share this post Link to post Share on other sites More sharing options...
sazh 11 January 21, 2024 Posted January 21, 2024 · Report post А дребезг контактов как убираете? Quote Share this post Link to post Share on other sites More sharing options...
Jetrano 0 January 21, 2024 Posted January 21, 2024 · Report post В 21.01.2024 в 15:34, sazh сказал: А дребезг контактов как убираете? В обработчике прерывания? Никак не убираю. Рассчитывал на RC-цепочку. Разве она совсем бесполезна? Quote Share this post Link to post Share on other sites More sharing options...
sazh 11 January 21, 2024 Posted January 21, 2024 · Report post 1 час назад, Jetrano сказал: Рассчитывал на RC-цепочку. Если PG15 выход, то где там RC цепочка. В общем дребезг кнопки надо убрать. Quote Share this post Link to post Share on other sites More sharing options...
Jetrano 0 January 21, 2024 Posted January 21, 2024 · Report post В 21.01.2024 в 18:23, sazh сказал: Если PG15 выход, то где там RC цепочка. В общем дребезг кнопки надо убрать. Добро. Спасибо! Quote Share this post Link to post Share on other sites More sharing options...
sazh 11 January 21, 2024 Posted January 21, 2024 · Report post 3 минуты назад, Jetrano сказал: Добро. Спасибо! Честно признаться, при работе с Плис у меня нет кнопки. Раньше дребез я устранял RS триггером (ТМ2). На R и S входы вешал резисторы к питанию, к R и S входа подключал 3х позиционную кнопку, центральный контакт сидел на 0. И он подключался то к R, то к S. Это расписано у Тицца и Шенка в первом издании. В Вашем случае я набросал проект. Может поможет. (Настроить разрядность счетчика с помощью параметра, чтоб где то 50 мс - 200 отработать). Может поможет. debounce.zip Quote Share this post Link to post Share on other sites More sharing options...
Jetrano 0 January 22, 2024 Posted January 22, 2024 · Report post В 21.01.2024 в 20:05, sazh сказал: Честно признаться, при работе с Плис у меня нет кнопки. Раньше дребез я устранял RS триггером (ТМ2). На R и S входы вешал резисторы к питанию, к R и S входа подключал 3х позиционную кнопку, центральный контакт сидел на 0. И он подключался то к R, то к S. Это расписано у Тицца и Шенка в первом издании. В Вашем случае я набросал проект. Может поможет. (Настроить разрядность счетчика с помощью параметра, чтоб где то 50 мс - 200 отработать). Может поможет. debounce.zip 858 Б · 1 загрузка Вчера подключал сенсорный переключатель TTP223. С ним всё работает чётко, так как и должно работать. Осциллографа у меня нет и для того чтобы хотя бы что-то увидеть, что происходит при нажатии и отпускании обычной кнопки, воспользовался логическим анализатором Saleae Logic. При многократном нажатии на кнопку никаких "иголок" не было, но примерно в каждом десятом случае, при отпускании кнопки присутствовал короткий импульс. Конечно, в идеале и его не должно быть, но всё же далеко не всегда это происходило. Соберу "кнопку" по другой схеме, проверю. Спасибо за проект, попробую разобраться. Quote Share this post Link to post Share on other sites More sharing options...
Jetrano 0 January 23, 2024 Posted January 23, 2024 (edited) · Report post Всевозможных плат с FPGA много и на некоторых установлены кнопки с обычной обвязкой (резисторы, конденсаторы), а то и вовсе имеющие только подтяжку к плюсу или минусу питания. Такие кнопки пригодны только для того чтобы считывать их состояние, а в качестве источника прерывания необходимо подключать их через регистр, транзистор. Edited January 23, 2024 by Jetrano Quote Share this post Link to post Share on other sites More sharing options...
sazh 11 January 23, 2024 Posted January 23, 2024 · Report post 11 часов назад, Jetrano сказал: Всевозможных плат с FPGA много и на некоторых установлены кнопки с обычной обвязкой (резисторы, конденсаторы), а то и вовсе имеющие только подтяжку к плюсу или минусу питания. Такие кнопки пригодны только для того чтобы считывать их состояние, а в качестве источника прерывания необходимо подключать их через регистр, транзистор. На этой схеме кнопка с обвесом - подано на шинный формирователь. Просто буфер. Причем это МОП структура, неиспользованные входы должны подключаться к питанию или общему. Ко всем схема надо подходить критически. Я имел ввиду следущее: Дребезг контактов — Википедия (wikipedia.org). Quote Share this post Link to post Share on other sites More sharing options...