Forum: FPGA, VHDL & Co. NIOSII io interrupts einbinden


von Kleinerunistudent (Gast)


Lesenswert?

Hallo Leute,
Ich habe da ein kleines Problem mit dem NIOS II Prozessor und zwar soll 
ich eine interrupt Routine aufrufen wenn ich einen von 2 Buttons Drücke 
in Quartus habe ich diese dann button_pio genannt. Ich habe soweit alles 
im SOPC Builder richtig eingestellt und mein Button IRQ ist 2.
Bloß weiß ich nicht wie der Aufruf in c aussehen muss ich habe folgendes 
geschrieben:
1
void init_button()
2
{
3
4
printf("\nButton Initializing interrupts\n");
5
alt_irq_init(BUTTON_PIO_IRQ); 
6
alt_irq_register(BUTTON_PIO_IRQ, 0, button_function);
7
8
}

Wobei "button_function" die function ist welche bei einem interrupt 
aufgerufen werden soll. Leider Passiert dieses nicht.

Über Hilfe währe ich dank bar.

Mit Freundlichem Gruß,

Kleinerunistudent

von Ben (Gast)


Lesenswert?

poste doch mal deine isr, dort liegt sicherlich der Bock begraben !
Ben

von SeriousSam (Gast)


Lesenswert?

Ist der PIO auch richtig konfiguriert? Der hat noch eine Interruptmask.

von Kleinerunistudent (Gast)


Lesenswert?

@Ben
wo finde ich den isr ? weiß grade nicht ganz so was das sein soll ?

@SeriousSam
wo kann ich den sehen ob der interrupt richtig konfiguriert ist ?
interruptmask? muss ich die noch einbinden ?

von Kleinerunistudent (Gast)


Lesenswert?

Hi Leute,

habe mich jetzt etwas schlaugemacht über die interrupts und die ISR mein 
problem ist jetzt folgendes er initializiert die isr erst wenn ich einen 
knopf drücke(?) und das Lauflicht läuft erst los wenn ich denn knopf 
andauernt festhalte und dann auch nur in eine richtung. Ich habe 
folgenden Code :
---> Main
1
int main(void)
2
{
3
init_button_pio();
4
5
   while(1)
6
  {
7
    led_function();
8
  }
9
return 0;
10
}
---> isr
1
// An ISR to Service a Button PIO Interrupt
2
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
3
static void button_function(void* context)
4
#else
5
static void button_function(void* context, alt_u32 id)
6
#endif
7
{
8
9
  volatile int* edge_capture_ptr = (volatile int*) context;
10
11
  *edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);
12
13
  IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0);
14
15
  IORD_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE);
16
17
  if(IORD_ALTERA_AVALON_PIO_DATA(BUTTON_PIO_BASE) == 1)
18
  {
19
    if(direction == 1)
20
      direction = 0;
21
22
    else
23
      direction = 1;
24
25
  }
26
  else if(IORD_ALTERA_AVALON_PIO_DATA(BUTTON_PIO_BASE) == 2)
27
  {
28
    if(speed > 20000)
29
      speed /= 5;
30
31
    else
32
      speed = 200000;
33
  }
34
35
}
---> Button Registring
1
// Registering the Button PIO ISR with the HAL
2
static void init_button_pio()
3
{
4
void* edge_capture_ptr = (void*) &edge_capture;
5
6
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0x2);
7
8
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x0);
9
10
#ifdef ALT_ENHANCED_INTERRUPT_API_PRESENT
11
alt_ic_isr_register(BUTTON_PIO_IRQ_INTERRUPT_CONTROLLER_ID,BUTTON_PIO_IRQ,button_function,edge_capture_ptr,0x0);
12
#else
13
alt_irq_register(BUTTON_PIO_IRQ, edge_capture_ptr ,button_function);
14
#endif
15
printf("\nButton Initializing interrupts\n");
16
}

Ich danke euch schonmal im voraus für eure Hilfe.

Mit Freundlichem Gruß,
Kleinerunistudent

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.