www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Xilinx ML07 PowerPC GPIO Interrupt


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Cihan (Gast)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

wie im Titel herauszulesen ist, habe ich einen Interrupt Problem. Meine 
vorgehensweise im Projekt war folgende:
Vorerst habe ich in ISE (VHDL) meine Hardware programmiert, funkioniert 
auch super. Anschließend habe ich in XPS ein neues Projekt kreiert und 
eine neue IP erzeugt. Die erzeugte IP habe ich mit meinen in ISE 
entwickelten Code erweitert und habe so letztendlich die fertige IP in 
XPS importiert und hinzugefügt. Nach dem ganzen vergeben der Ports und 
Adressen und dem zusammenverknüpfen habe ich meine ersten Tests in der 
SDK-Umgebung in C ausgeführt.

Nun will ich einen Interrupt von einem GPIO verwenden. Dafür habe ich in 
XPS ein GPIO mit Interrupt hinzugefügt (nur Input und 1 
Signal(Width=1)). An diesem GPIO habe ich aus meiner importierten IP 
(von mir entwickelte IP) verbunden. Anscließend habe ich den Interrupt 
ausgang des GPIOs auf den einem Interrupt-Controller angeschlossen und 
letztendlich noch den Intr-Cnt. an dem Non-Ctritical-Intr.Eingang des 
PPCs (PPC 440).

Soweit so gut, nun habe ich auf der SDK-Umgebung den Interrupt 
programmiert. Der Interrupt an sich funktioniert prima, doch warum auch 
immer wird die while-Schleife in der main nicht aufgerufen, sodass 
zyklisch ein Interrupt gemacht wird. Dies habe im Debug-Modus geprüft, 
indem ich einen Breakpoint auf die while-Schleife und eine weitere auf 
"IntrFlag = 1" gesetzt habe. Die Interrupt-Flag wird 1 gesetzt, doch die 
while schleife wird nie aufgerufen.

Die Frage zu meinem Problem ist, warum wird die while-Schleife nicht 
ausgeführt nach dem Interrupt.

hier der c-Code:
/
#include <stdio.h>
#include "xparameters.h"
#include "xil_cache.h"
#include "xintc.h"
#include "xintc_l.h"
#include "xstatus.h"
#include "xil_exception.h"
#include "intc_header.h"
#include "xbasic_types.h"
#include "xgpio.h"
#include "gpio_header.h"
#include "xbasic_types.h"
#include "gpio_header.h"
#include "gpio_intr_header.h"
#include "iic_header.h"
#include "uartlite_header.h"
#include "xsysace.h"
#include "sysace_header.h"
#include "xbasic_types.h"
#include "xbram.h"
#include "bram_header.h"
#include "xexception_l.h"
#include "xbasic_types.h"
#include "xutil.h"

#define INTC_DEVICE_ID      XPAR_XPS_INTC_0_DEVICE_ID
#define INTC_GPIO_INPUT_INTERRUPT_ID  XPAR_INTC_0_GPIO_4_VEC_ID
#define GPIO_INPUT_CHANNEL1    1

/********************* Function Prototypes *************************/
void GpioInputHandler(void *CallBackRef);

/********************** Variable Definitions ************************/
XIntc InterruptController; /* The instance of the Interrupt Controller*/

XIntc Intc_GpioInput; /* The Instance of the Interrupt Controller Driver */

static XGpio xps_gpio_ND_Gpio; /* The Instance of the GPIO Driver */
volatile u32 IntrFlag; /* Interrupt Handler Flag */

int main(void) {

  Xil_ICacheEnable();
  Xil_DCacheEnable();

  print("---Entering main---\n\r");

  XGpio_Initialize(&xps_gpio_ND_Gpio, GPIO_INPUT_DEVICE_ID);

  XIntc_Initialize(&InterruptController, INTC_DEVICE_ID);

  XIntc_Connect(&InterruptController, XPAR_XPS_INTC_0_XPS_GPIO_ND_IP2INTC_IRPT_INTR, (XInterruptHandler)GpioInputHandler, (void *) (&xps_gpio_ND_Gpio));
                     
  XGpio_InterruptEnable(&xps_gpio_ND_Gpio, GPIO_INPUT_CHANNEL1);
  XGpio_InterruptGlobalEnable(&xps_gpio_ND_Gpio);
  XIntc_Enable(&InterruptController, XPAR_XPS_INTC_0_XPS_GPIO_ND_IP2INTC_IRPT_INTR);
  XIntc_Start(&InterruptController, XIN_REAL_MODE);


  Xil_ExceptionInit();
  Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XIntc_InterruptHandler, &InterruptController);

  Xil_ExceptionEnable();

  int count = 0;
  x = 0;

  IntrFlag = 0;
  while (1) {
    if (IntrFlag !=(u32) 0) {
      IntrFlag = 0;
      xil_printf("INERRUPT IntrFlag wurde gesetzt!");
     }

   }

  print("---Exiting main---\n\r");

  Xil_DCacheDisable();
  Xil_ICacheDisable();

  return 0;
}

void GpioInputHandler(void *CallbackRef)
{
  XGpio *GpioPtr = (XGpio *)CallbackRef;

  IntrFlag = 1;

  xil_printf("INERRUPT");

  // Clear the Interrupt
  XGpio_InterruptClear(GpioPtr, GPIO_INPUT_CHANNEL1);
}

Die system.mhs und system.ucf file vom XPS-Projekt, wo die 
Portzuweisungen zu erkennen sind, sind im Anhang hinzugefügt.

Würde mich über jede Hilfe sehr freuen.

mfg Cihan

Autor: Cihan (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
keiner ne idee... :-(

Autor: Cihan (Gast)
Datum:
Angehängte Dateien:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Das Entwicklungsboard sollte natürlich ML507 statt ML07 heißen und im 
C-Code fehlt das define für "GPIO_INPUT_DEVICE_ID"
#define GPIO_INPUT_DEVICE_ID  XPAR_XPS_GPIO_ND_DEVICE_ID

ist in meinem Programm allerdings drinne, habe es nur hier ausversehen 
gelöscht.

die xparameters.h file habe ich vergessen anzuhängen.

danke im voraus für die Hilfe

Autor: Duke Scarring (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Cihan schrieb:
> Dies habe im Debug-Modus geprüft,
> indem ich einen Breakpoint auf die while-Schleife und eine weitere auf
> "IntrFlag = 1" gesetzt habe. Die Interrupt-Flag wird 1 gesetzt, doch die
> while schleife wird nie aufgerufen.
Kommt der Prozessor denn überhaupt in die while-Schleife (ohne 
Interrupt)?

Duke

Autor: Cihan Kalayci (lazoboy61)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
der Interrupt wird bei mir durch ein internes Signal in der VDDL 
Struktur verbunden mit dem GPIO (mit Interrupt) erzeugt. wenn ich das 
Signal auf einem LOW-Level halte und im DEBUG-Modus mit F6 Schrit für 
Schritt durchgehe, wird die while-Schleife aufgerufen. doch wenn ich mit 
F8 das programm durchlaufen lasse (Interrupt signal immer noch auf LOW) 
und die while-Schleife mit einem Breakpoint versehe, kommt er nicht 
rauf.

Autor: Cihan Kalayci (lazoboy61)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hat keiner eine Idee, warum die while-Schleife nicht aufgerufen wird?

Autor: Duke Scarring (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Also Interrupt = 0 und Debug-F6, while geht und
     Interrupt = 0 und Debug-F8, while geht nicht, richtig?
Das klingt für mich oberfaul. Das muß funktionieren, bevor Du mit dem 
Interrupt experimentierst.
Laß doch mal in der main/while eine LED-togglen.

Duke

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel




Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder GIF-Format hochladen.
Siehe Bildformate
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net