Forum: FPGA, VHDL & Co. Nios II interrupt unterbrechen


von Andreas M. (chillymu)


Lesenswert?

Hallo,

in der Quartus Version 9.0 war es noch möglich das ein Interrupt einen 
anderen Interrupt mit einer niedrigeren Prioriotät 
unterbricht(alt_irq_interruptible, alt_irq_non_interruptible). Bei 
Versio 12.0 ist dies nicht mehr möglich. Warum nicht und wie kann ich 
das jetzt bewerkstelligen?

Habt ihr da eine Idee.

Gruß Andreas

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Andreas M. schrieb:
> Habt ihr da eine Idee.
Mach die Interruptroutine so kurz, dass die nicht unterbrochen werden 
muss...

Was konkret macht dir Probleme? Warum brauchst du unterbrochene 
Unterbrechungen?

von Andreas Müller (Gast)


Lesenswert?

Derzeit bekomme ich sie nicht kürzer.

Das Problem ist, dass während des Interrupts Zeichen über die RS232 
kommen. Die können dann nicht verarbeitet werden und dadurch verloren 
gehen. Ich habe schon daran gedacht die RS232 auf DMA um zu stellen. Was 
hältst du davon?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Andreas Müller schrieb:
> Das Problem ist, dass während des Interrupts Zeichen über die RS232
> kommen.
Welche Baudrate?

> auf DMA um zu stellen. Was hältst du davon?
DMA wurde genau für solche Sachen gemacht: Datentransfer ohne 
CPU-Belastung. Und das ist es, was du hier willst...

: Bearbeitet durch Moderator
von Sigi (Gast)


Lesenswert?

Andreas Müller schrieb:
> Ich habe schon daran gedacht die RS232 auf DMA um zu stellen.

Probier's doch erstmal mit einem FIFO, 16 Werte sollten
für's erst reichen. Der Interrupt kann ja schon beim
ersten Zeichen ausgelöst werden.

von Andreas Müller (Gast)


Lesenswert?

Für die Uart im C-code gibt es schon ein Fifo. Der wird aber nur bei 
einem Interrupt gefüllt. Und dies ist dann das Problem. Oder meinst du 
einen Fifo im VHDL?

von Andreas Müller (Gast)


Lesenswert?

Die Baudrate ist 115200.

von Sigi (Gast)


Lesenswert?

Andreas Müller schrieb:
> Oder meinst du
> einen Fifo im VHDL?
Ja, denn ein SW-FIFO müsste per IRQ-Routine
gefüllt werden, und das ist ja gerade Dein
Problem. Ich kenne jetzt nicht Deine QSYS-IP
zur UART-Behandlung, schau mal in den zugeh.
Docs nach, evtl. lässt sich da eine FIFO
aktivieren bzw. die Anz. Elemente einstellen.

Btw.: Q9.0 hat SOPC, Q11? und höher Qsys, d.h.
Du hast andere IRQ-Komponenten. Liess Dir mal
die Docs zu IIC und VIC durch, evtl. findest Du
da eine bessere Lösung.

von Andreas M. (chillymu)


Lesenswert?

Derzeit benutze ich noch den sopc builder in v12.0. Dort gibt es ja 
einen on-chip fifo memory? Könnte ich den dafür nehmen und wenn ja wie 
mache ich das dann?

Danke.

von Sigi (Gast)


Lesenswert?

Habe mal kurz in die Docs geschaut: Leider
besitzt der Std.UART keinen internen FIFO,
was die Sache wesentlich komplizierter macht.

Leider ist es mit OnChip-FIFO nicht ganz so
einfach. Du bräuchtest neben UART und FIFO
auch noch eine Komponente, die RX-Daten
aus dem UART ins FIFO schreibt, dazu noch
die UART-Register wrappt/kappselt. Ob's da
eine fertige Komponente gibt weiss ich jetzt
nicht.

Bevor Du Dich da reinsteigest, versuch nochmal
den Weg über den VectorIrqController. Der
reagiert auf Irqs wesentlich schneller.
Und bei 115200 Baud hast Du 10KBytes Daten,
d.h max. 10.000 IRQs. Bei 100MHz-Nios sollte
das machbar sein.

von Andreas M. (chillymu)


Lesenswert?

Hallo Leute,

nach etwas suchen habe ich dann ein UART mit FIFO gefunden.

Hier findet man den und er funktioniert und man kann eine Menge 
einstellen.

http://www.alterawiki.com/wiki/FIFOed_Avalon_Uart


Ein Problem habe ich nur noch. Beim einschalten des Gerätes sendet der 
UART das Zeichen "~" einfach raus. Warum? Habt ihr da eine Idee?

von Duke Scarring (Gast)


Angehängte Dateien:

Lesenswert?

Andreas M. schrieb:
> Beim einschalten des Gerätes sendet der
> UART das Zeichen "~" einfach raus. Warum? Habt ihr da eine Idee?
Mal mit dem Oszi geschaut, was da auf der Leitung los ist?
Eine Tilde ist im ASCII-Code 0x7E und das sieht binär so aus: 0b01111110
Im Anhang ist ein Bildchen, wie das dann mit Start- und Stoppbit auf der 
Leitung aussieht.

Da beim Einschalten die FPGA-Konfiguration erst geladen wird, kann es - 
unbeabsichtigt - zu einem solchen Signal kommen.
Abhilfe schafft hier evtl. ein externer Pull-Up oder eine veränderte 
Pin-Konfiguration.

Duke

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.