Cypress FX2LP Interrupt Problem

Gast #842845
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
#842871
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.
Gast #843098
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!
#843250
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.
Gast #843299
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...
Gast #843935
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 :-(
#843988
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren