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

QSYS. Прерывание Parallel I/0.

Приветствую!
Выполнил настройку прерывания 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;
}

//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

Set.jpg

Изменено пользователем Jetrano

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


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

В 21.01.2024 в 15:34, sazh сказал:

А дребезг контактов как убираете?

В обработчике прерывания? Никак не убираю. Рассчитывал на RC-цепочку. Разве она совсем бесполезна?

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


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

1 час назад, Jetrano сказал:

 Рассчитывал на RC-цепочку.

Если PG15 выход, то где там RC цепочка. В общем дребезг кнопки надо убрать.

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


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

В 21.01.2024 в 18:23, sazh сказал:

Если PG15 выход, то где там RC цепочка. В общем дребезг кнопки надо убрать.

Добро. Спасибо!

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


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

3 минуты назад, Jetrano сказал:

Добро. Спасибо!

Честно признаться, при работе с Плис у меня нет кнопки. Раньше дребез я устранял RS триггером (ТМ2). На R и S входы вешал резисторы к питанию, к R  и S входа подключал 3х позиционную кнопку, центральный контакт сидел на 0. И он подключался то к R, то к S. Это расписано у Тицца и Шенка в первом издании. В Вашем случае я набросал проект. Может поможет. (Настроить разрядность счетчика с помощью параметра, чтоб где то 50 мс - 200 отработать).

Может поможет.

debounce.zip

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


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

В 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. При многократном нажатии на кнопку никаких "иголок" не было,
но примерно в каждом десятом случае, при отпускании кнопки присутствовал короткий импульс.
Конечно, в идеале и его не должно быть, но всё же далеко не всегда это происходило.
Соберу "кнопку" по другой схеме, проверю.
Спасибо за проект, попробую разобраться.

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


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

Всевозможных плат с FPGA много и на некоторых установлены кнопки с обычной обвязкой (резисторы, конденсаторы), а то и вовсе имеющие только подтяжку к плюсу или минусу питания.
Такие кнопки пригодны только для того чтобы считывать их состояние, а в качестве источника прерывания необходимо подключать их через регистр, транзистор.
 

5.png

Изменено пользователем Jetrano

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


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

11 часов назад, Jetrano сказал:

Всевозможных плат с FPGA много и на некоторых установлены кнопки с обычной обвязкой (резисторы, конденсаторы), а то и вовсе имеющие только подтяжку к плюсу или минусу питания.
Такие кнопки пригодны только для того чтобы считывать их состояние, а в качестве источника прерывания необходимо подключать их через регистр, транзистор.
 

5.png

 

На этой схеме кнопка с обвесом -  подано на шинный формирователь. Просто буфер. Причем это МОП структура, неиспользованные входы должны подключаться к питанию или общему. Ко всем схема надо подходить критически.

Я имел ввиду следущее: Дребезг контактов — Википедия (wikipedia.org).

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


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

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

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

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

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

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

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

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

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

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