Forum: Mikrocontroller und Digitale Elektronik Problem LPC2106 und UART im Interrupt


von TheMason (Gast)


Lesenswert?

Hallo Leute,

ich habe ein Problem. Ich möchte den UART des LPC2106 im Interrupt Modus 
nutzen. Dazu habe ich mir den funktionierenden Timer Interrupt Code 
(Initialisierung des VIC) in das UART Demo kopiert und die 
entsprechenden anpassungen gemacht (Das enstprechende Bit im 
VicIntSelect und VicIntEnable auf IRQ gesetzt und den Channel und die 
ISR zugeordnet, und in der UART-initialisierung das Rx Data Interrupt 
gesetzt)
Der UART sendet permanent (wie in dem Demo) einen String (soll auch so 
sein).
Sobald ich aber ein zeichen eingebe hängt der Prozessor.
Ich bekomme ihn nur noch durch einen Reset wieder zum laufen.
Den Code dazu kann ich vorraussichtlich erst heute abend posten.
Ich nutze Rowley Crossworks. Sobald der Prozessor "hängt" und ich auf 
break drücke sehe ich das der Prozessor am Jump zur ISR hängt. Was kann 
da schiefgelaufen sein ?!
Das Timer Demo funktioniert und bis auf den Slot und das entsprechende 
Interrupt Bit sollte doch alles gleich sein oder hab ich da was falsch 
verstanden ?

Gruß
Rene

von mork (Gast)


Lesenswert?

Hallo Rene,

poste mal bitte den Code. Was mir jetzt so auf die schnelle einfällt: im 
Register VicIntSelect wird ausgewählt ob ein Interrupt ein IRQ oder ein 
FIQ ist. Wenn man da ein Bit setzt, wird der entsprechende interrupt ein 
FIQ.

MfG Mark

von TheMason (Gast)


Lesenswert?

hallo mork,

habe den code gerade nicht zur hand. poste ihn heute abend.
das entsprechende bit ist auf 0 (also normaler irq und nicht fiq) 
gesetzt (VicIntSelect &= ~0x40; VicIntEnable |= 0x40; VicCntrl0 = 0x26; 
).
das habe ich so aus dem timer demo von rowley übernommen.

von TheMason (Gast)


Angehängte Dateien:

Lesenswert?

hier die angedrohte main.c.

den abschnitt mit

U0IER = 0x00;
U0IIR;
U0RBR;
U0LSR;

hatte ich nurmal testhalber übernommen (hatte ein 
initialisierungsproblem des uarts in verdacht, aber dem war wohl nicht 
so).
jemand ne idee ?

gruß
rene

von TheMason (Gast)


Lesenswert?

niemand ne idee ?! :-(

von TheMason (Gast)


Lesenswert?

nutzt niemand den uart-rx-interrupt oder ist der fehler so trivial das 
keiner mir nen tipp geben möchte (nach dem motto : finds mal selber 
raus)

von Robert Teufel (Gast)


Lesenswert?

Hallo Rene,

zwar nicht ganz genau was Du suchst aber auf Grund starker struktureller 
Aehnlichkeit anwendbar das Beispiel fuer den LPC213x und LPC214x

Das sind eine ganze Reihe von Peripherals, wie man sie initialisiert...

Erwartungsgemaess ist das UART example unter UART.C zu finden. Das 
beispiel ist geschrieben fuer den Keil Compiler.

http://www.standardics.nxp.com/support/documents/microcontrollers/zip/code.bundle.lpc213x.lpc214x.uvision.zip

Robert

von TheMason (Gast)


Lesenswert?

@robert

danke für den link. von dem was ich bisher überflogen habe müsste mein 
code zu stimmen und eigentlich auch funktionieren.
ich schau nochmal.

von mthomas (Gast)


Lesenswert?

Da Crossworks die GNU toolchain im Hintergrund nutzt ist dies 
möglicherweise nützlich: 
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/#lpc_uart_irq

Martin Thomas

von TheMason (Gast)


Lesenswert?

habe noch ein bischen rumprobiert, und dabei folgendes festgestellt :

der timer-interrupt code funktioniert NUR dann wenn ich diesen vom timer 
interrupt demo (Olimex_LPC_P1.hzq) aus compiliere und starte. Kopiere 
ich den code in ein neues projekt (Philips LPC210X) und compiliere 
dieses so stürzt der controller beim enablen des interrupts ab.
das merkwürdige ist nur das die projektoptionen bei beiden projekten 
(olimex demo und neu erstelltes demo) gleich sind.
ist der controller abgestürzt, so kann ich mit break sehen wo er 
abgeschmiert ist. und zwar bei

irq_handler:
  b irq_handler

in der Philips_LPC210X_Startup.s.

So wie sich das für mich darstellt fehlt noch irgendetwas 
(projekt-optionen o.ä.) damit der interupt funktioniert. nur was ?!
kleiner hinweis noch : ich arbeite mit rowley für arm 1.5

hat jemand vielleicht mal einen funktionierenden code für 
timer-interrupt oder uart-interrupt ?
ich habe langsam keine idee mehr :-(

gruß
rene

von TheMason (Gast)


Angehängte Dateien:

Lesenswert?

so !

bin nunmal auf die glorreiche idee gekommen das, wenn das timer 
interrupt demo funktioniert, dann doch auch eine erweiterung für uart in 
diesem demo unter zu bringen. und siehe da : es funktioniert. der 
interrupt löst aus.
aber das problem das das NUR vom timer demo aus funktioniert besteht 
nach wie vor.
sprich : ich nehme den kompletten code aus der funktionierenden main, 
kopiere die in ein neues LPC2106 Projekt und der ARM stürzt ab, sobald 
der interrupt global enabled wird.

hat da jemand einen rat bzw. weiß was man in den projekt-optionen 
einstellen muß damit das läuft ?!

gruß
rene

von Patrick (Gast)


Lesenswert?

Hey ,du redest mir echt von der Sele. Hab genau das selbe Problem.
Kriege mit Rowley dieses verdammte UART nicht ans laufen.
Habe auch dieses Beispiel benutzt und selber versucht neue
Routinen zu schreiben. Nach fast 4 Tagen immer wieder herumprobieren 
kahm ich immer noch nicht zum Erfolg. Was für ein Wixcompiler ist das 
denn, habe ich mir gedacht!!!

Mit GCC und anderen kein Problem. Habe irgendwie den Eindruck das Rowley 
sich so garnicht an C Standars hält. Zumidest kann ich damit die GCC 
Beispiele überhaupt nicht compileieren, da fast bei jeder 2 ten Zeile 
irgendwelche
Syntaxen kommen ,die er nicht kompilieren kann. Naja und dann noch 
Javaskripe in der Projektdaei.....

dashalb mein Fazit:
Finger weg von Rowley wenn man für die LPC2000 er Serie entwickeln 
möchte.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Rowley verwendet das gcc-Backend.

Das Problem sitzt sicherlich woanders.

von TheMason (Gast)


Lesenswert?

@patrick

also so scheiße finde ich rowley gar nicht. eher im gegenteil. das 
compiler und debugger frontend funktioniert wenigstens auf anhieb (im 
gegensatz zu eclipse, jedenfalls bei mir).
das problem mit dem interrupt habe ich umgangen. ich habe mir ein 
projekt (in meinem fall das olimex_lpc_demo.hzp) in dem der timer 
interrupt funktioniert einfach für den uart angepasst und siehe da, der 
uart kommt immer schön im interrupt rein (beim senden und empfangen).
nur wenn ich selbst ein projekt aufsetze funktionieren die interrupts 
nicht (war wohl auch damals vor 2 jahren das problem, deshalb habe ich 
die arms erstmal an die seite gelegt, hätt ich das mal vorher gewusst 
... :-(()
ich werd da nochmal weiter forschen. kann ja eigentlich nichts wildes 
sein (es sei denn das frontend erstellt irgendwas falsches für den gcc).

kann dir heute abend gerne mal mein funktionierenden code geben

gruß
rene

von Patrick (Gast)


Lesenswert?

mich würde mal interessieren welche besonderen Einstellungen
man in den Projekteinstellungen benötigt ,damit das mit dem UART
funktioniert.

Schließlich möchte ich nicht immer meine Projekte auf ein bestehendes 
aufsetzen. Dieser Workaround stört mich total.

von TheMason (Gast)


Lesenswert?

mich störts auch ...

weiß aber leider nicht welche einstellungen dazu führen das der 
interrupt nicht ausgeführt wird. im moment kann ich noch damit leben.
müsste mal zwei einstellungen miteinander vergleichen.

von steffen (Gast)


Lesenswert?

schau mal ob es diverse defines in dem beispielprojekt gibt, die es bei 
deinem eigenen ned hat...
bei mir haben die hier im commom profil von der solution gefehlt

GCC_ARM7;VECTORED_IRQ_INTERRUPTS;STARTUP_FROM_RESET

gruss

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.