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
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
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.
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
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)
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
@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.
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
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
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
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.
Rowley verwendet das gcc-Backend. Das Problem sitzt sicherlich woanders.
@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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.