Я как-то делал вот так.
1. на PIO заведены 4 тумблера.
Модуль вышлет прерывание при изменении любого разряда на регистре PIO. Это будет отражено в регистре pio_edge_cap(как-то так).
Нажмите для просмотра прикрепленного файла2. функция прерывания выводящая код с 4 тумблеров на 4 светодиода.
Код
void handle_buttons_ISR()
{
unsigned int led;
led = IORD(BUTTONS_BASE, 0x00)); // захват данных из регистра pio
IOWR(LED_BASE, 0, led ); // запись данных в регистр led
IOWR(BUTTONS_BASE, 3, 0x00)); // обнуляется регистр pio_edge_cap
}
3. регистрируем прерывание по адресу в основной программе.
Примерно так.
Код
int main (void)
{
IOWR(BUTTONS_BASE, 2, 0x0F); //маска прерываний, разрешает прерывание при изменение всех 4х бит
IOWR(BUTTONS_BASE, 3, 0x00); // сбрасывается регистр pio_edge_cap
alt_ic_isr_register( NULL, BUTTONS_IRQ, handle_buttons_ISR, NULL, 0x00 );
while (1)
{
}
return 0;
}
ПС если не хотите с этим морочиться, то перед записью просто проверяйте, что d10 изменился после записи.
Например так.
Код
d10 = IORD_ALTERA_AVALON_PIO_DATA(DATA_PIO_BASE);
if (d10_tmp != d10)
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE , d10);
}
d10_tmp= d10;