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


von Daniel (Gast)


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

von Christian R. (supachris)


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.

von Daniel (Gast)


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!

von Daniel (Gast)


Lesenswert?

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

von die ??? (Gast)


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.

von Daniel (Gast)


Lesenswert?

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

von die ??? (Gast)


Lesenswert?

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

von Christian R. (supachris)


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.

von Daniel (Gast)


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...

von die ??? (Gast)


Lesenswert?

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

von Daniel (Gast)


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 :-(

von Valerij M. (fpga-dev)


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

von Daniel (Gast)


Lesenswert?

Achso, das klingt logisch.

Vielen Dank euch allen!!!

Gruß
Daniel

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.