Хочу чтобы при каждом нажатии кнопки (кнопка сажается на землю (спадающий фронт)), загорались а потом гасли светодиоды.
Настраиваю прерывания по кнопке.
Настойка PIO:
- Генерейт IRQ по EDGE
- Синхронизация по Спадающему фрону, Enable bit-clearing НЕ УСТАНОВЛЕН.
Текст в NIOS ECLIPSE (web 12.1)
Код
#include <altera_avalon_pio_regs.h>
#include <system.h>
#include <alt_types.h>
#include <sys/alt_irq.h>
unsigned char i;
void init_isr ();
void handle_btn();
void init_isr () // инициализация
{
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUT_BASE, 0xff);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_BUT_BASE, 0x01);
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
alt_ic_isr_register(PIO_BUT_IRQ_INTERRUPT_CONTROLLER_ID, PIO_BUT_IRQ, handle_btn, 0, 0x0);
#else
alt_irq_register( PIO_BUTTON_IRQ, 0, handle_btn);
#endif
}
void handle_btn()
{
i++;
// при первом заходе зажигание светодиодов и сброс EDGE CApture (чтобы выйти из прерывания)
if (i==1) { IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, 0x03); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUT_BASE, 0xff);}
// при втором заходе гашение светодиодов и сброс EDGE CApture (чтобы выйти из прерывания)
if (i==2) { i=0; IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, 0x00); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUT_BASE, 0xff);}
}
int main()
{
i=0;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, 0x00);
init_isr();
while (1);
return 0;
}
#include <system.h>
#include <alt_types.h>
#include <sys/alt_irq.h>
unsigned char i;
void init_isr ();
void handle_btn();
void init_isr () // инициализация
{
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUT_BASE, 0xff);
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_BUT_BASE, 0x01);
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
alt_ic_isr_register(PIO_BUT_IRQ_INTERRUPT_CONTROLLER_ID, PIO_BUT_IRQ, handle_btn, 0, 0x0);
#else
alt_irq_register( PIO_BUTTON_IRQ, 0, handle_btn);
#endif
}
void handle_btn()
{
i++;
// при первом заходе зажигание светодиодов и сброс EDGE CApture (чтобы выйти из прерывания)
if (i==1) { IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, 0x03); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUT_BASE, 0xff);}
// при втором заходе гашение светодиодов и сброс EDGE CApture (чтобы выйти из прерывания)
if (i==2) { i=0; IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, 0x00); IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BUT_BASE, 0xff);}
}
int main()
{
i=0;
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, 0x00);
init_isr();
while (1);
return 0;
}
Результат:
Светодиоды зажигаются и гаснут при каждом переключении (то есть как будто стоит срабатывание при любом изменении (ANY))
а в некоторых случаях некоторые переключения просто гинорируются....
Может кто-нибудь подскажет что нет так...
Заранее спасибо))))