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
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.
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!
Habs grad mal probiert, es bringt auch nix den Interrupt gleich am Anfang der Routine zu clearen...
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.
Der Interrupt für den ersten seriellen Port hat die Priorität 5 und die ganzen USB-Interrupts teilen sich die 8 ...
Ja, hab gerade nachgeschaut. Hast du mal das IP und EIP Register kontrolliert?
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.
@ 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...
Öööhm, ob du versehentlich dem USB Interrupt eine höhere Priorität gegeben hast?
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 :-(
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.