Forum: FPGA, VHDL & Co. UART Interrupt in MICO32


von Bernhard P. (Gast)


Lesenswert?

Hallo,

ich habe ein Problem mit einem UART im MICO32 und hoffe das mir jemand 
helfen kann.

Ich habe den UART mit 19200Bd aufgesetzt, er funktioniert gar nicht so 
schlecht wenn ich direkt im Hauptprogramm einfach solange warte, bis ich 
meine 18 BYTE empfangen habe.
Nun möchte ich die Empfangsroutine jedoch interruptgesteuert machen, 
also wenn der UART ein BYTE empfangen soll er in die ISR "void UART_ISR 
(void)" hüpfen, damit ich die Bytes entsprechend behandeln kann, und 
habe keinen Plan wie das funktioniert.
Falls jemand ein Beispiel hat wie man die ISR für einen UART schreibt 
dann bitte postet eure Lösung.

Herzlichen Dank
Bernhard

von Arndt B. (Firma: Helion GmbH) (bussmann)


Lesenswert?

Hallo Bernhard,

da hilft es, wenn man auf die generellen Serviceroutinen zurückgreift, 
die die Interruptverarbeitung organisieren.

Im "Software Development User Guide" lm32_swdevug.pdf ab S. 193 ist der 
Prozess beschrieben.

Im Wesentlichen musst Du die ISR dem System bekannt machen: 
MicoRegisterISR

Viele Grüße
Arndt

von Bernhard P. (Gast)


Lesenswert?

Hallo Arndt,

erstmals vielen Danke für deine Antwort, habe das pdf durchforstet und 
(meiner Meinung nach) auch alles richtig gemacht, aber meine ISR wird 
einfach nicht durchlaufen!!

Hättest du vielleicht ein Beispiel wo alles drin steht das man machen 
muss um einen UART interruptfähig zu machen??

Herzlichen Dank
Bernhard P.

von Arndt B. (Firma: Helion GmbH) (bussmann)


Lesenswert?

Hallo Bernhard,

poste hier mal den C-Code, vielleicht findet sich ja eine Auffälligkeit. 
Mögliche Fehlerursachen sind:
1. Interruptnummer stimmt nicht mit der Nummer im MSB überein
2. Interrupts sind nicht freigegeben
3. Interrupt in der UART ist falsch konfiguriert -> Schau mal mit dem 
Reveal rein, ob die Interruptleitung überhaupt aktiviert wird.

Viele Grüße
Arndt

von Bernhard P. (Gast)


Lesenswert?

Hallo Arndt,

ich habe einen UART aufgesetzt mit dem Namen "uart", der IRQ ist auf 0 
gesetzt (höchste Priorität).
Im c File:
const char *UART_INSTANCE_NAME = "uart";      /* name of uart-instance 
in the platform */

und im main(void):
unsigned int IntLevel = 0;

MicoUartCtx_t *pUart = (MicoUartCtx_t 
*)MicoGetDevice(UART_INSTANCE_NAME);
MicoEnableInterrupt(IntLevel);

Bin mir jetzt nicht sicher was ich schreiben muss um die ISR zu 
initialisieren?!

Herzlichen Dank
Bernhard P.

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.