www.mikrocontroller.net

Forum: FPGA, VHDL & Co. Cypress FX2LP Interrupt Problem


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe mit dem Cypress FX2LP folgendes Problem:

Eine USB-Interruptroutine soll durch eine Serial0-ISR unterbrochen 
werden. Zur Zeit arbeitet die CPU aber zuerst den USB-Interrupt ab und 
beginnt danach mit der seriellen ISR.
Eigentlich sollte das doch anders laufen, da der Interrupt für den 
seriellen Port standardmäßig eine höhere Priorität hat.

Oder muss ich die Prioritäten erst irgendwo festlegen?

Gruß
Daniel

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst beim Einsprung in die unterbrechbare ISR den Interrupt erst 
wieder aktivieren. Bei nahezu allen µC wird der standardmäßig erst mal 
deaktiviert. Die priorität gibt ja nur an, welche zuerst abgearbeitet 
wird, wenn jetzt beide gleichzeitig anstehen. Das ist z.B. der Fall, 
wenn du eine andere ISR abarbeitet, die nicht unterbrochen wird, und in 
der Zwischenzeit kommen die Ints für Serial und USB. Dann wird nach dem 
Ende der nicht-unterbrechbaren ISR zuerst die mit der höchsten Priorität 
angesprungen.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Christian, das scheint so nicht ganz zu stimmen. In der techn. 
Referenz steht folgender Satz:

"The EZ-USB executes the ISR to completion unless another interrupt of 
higher priority occurs."

Aber ich probier deinen Tipp mal aus...

Thx!

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs grad mal probiert, es bringt auch nix den Interrupt gleich am 
Anfang der Routine zu clearen...

Autor: die ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal ins blaue: bist du dir sicher, dass der UART höher priorisiert ist? 
Mir ist so als wenn der USB mit den höchsten hat.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Interrupt für den ersten seriellen Port hat die Priorität 5 und die 
ganzen USB-Interrupts teilen sich die 8 ...

Autor: die ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, hab gerade nachgeschaut. Hast du mal das IP und EIP Register 
kontrolliert?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du sollst ja nicht das Int-Flag des USB löschen, sondern den globalen 
Interrupt erst mal wieder einschalten. Ich müsste mich jetzt auch erst 
durch das Manual wühlen, aber ich vermute das GIE wird abgeschaltet, 
wenn eine ISR gestartet wird. Das macht ja meist der Compiler beim 
Eintritt in die ISR. Da müsstest du im Keil oder SDCC Manual mal 
schauen, was beim ISR-Start passiert.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ die ???

Was soll ich da genau kontrollieren?

@ Christian

Ich weiß nicht genau was du meinst. Ich habe jetzt mal versucht das 
EA-Bit (Global interrupt enable) neu zu setzen. Hat aber auch nichts 
geändert...

Autor: die ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Öööhm, ob du versehentlich dem USB Interrupt eine höhere Priorität 
gegeben hast?

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö, in den Regs da passt alles... Aber das hat mich auf ne Idee 
gebracht.

Hab jetzt ne Lösung gefunden:

Der FX2LP unterstützt noch ne andere Art von Interrupt-Priorisierung. 
Man kann entweder Low oder High Priority zuweisen. Ich hab jetzt in der 
ISR die unterbrochen werden soll dem Interrupt (welcher unterbricht) die 
High Priority gegeben. So geht es...

Allerdings gefällt mir die Lösung nicht 100%ig, da ich in der 
Diplomarbeit dafür gerade stehen muss warum ich das so gemacht hab. Und 
ich weiß halt nicht warum es anders nicht funzt :-(

Autor: Valerij Matrose (fpga-dev)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Daniel,

Eigentlich ist alles ganz einfach: der 8051 in dem FX2 hat nur drei 
Piorisierungsstufen, die bewirken können, daß sich ein bereits in der 
Verarbeitung befindliches Interrupt mit niedriger Priorität von einem 
mit höheren Priorität unterbrochen wird. Die höchste (highest) Stufe ist 
für USB wakeup reserviert, also bleiben nur high und low Prioritäten.

Tretten mehrere Interrupts gleicher Priorität (s.oben) gleichzeitig auf, 
wird anhand der "natürlichen" Priorität (1-12) entschieden, in welcher 
Reihenfolge diese zeitlich nacheinander abgearbeitet werden.

Gruß,

fpga-dev

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso, das klingt logisch.

Vielen Dank euch allen!!!

Gruß
Daniel

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
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
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 bestätigst du, die Nutzungsbedingungen anzuerkennen.