Hallo, mache gerade meine ersten Schritte mit einem ARM-MC. Alles funktioniert soweit super, nur die Nutzung von Interrupts bereitet Probleme. Sobald ich diese global aktiviere, schießt sich der Controller ab. void adc_isr (void) _attribute_ ((interrupt ("IRQ"))); void adc_isr (void) { VICVectAddr = 0; unsigned int temp = ADDR; } void adc_init (void) { VICIntSelect &= ~(1<<18); VICVectCntl1 = (1<<5) | 18; VICVectAddr1 = (unsigned int) adc_isr; VICIntEnable = (1<<18); } Löse ich jetzt eine AD-Wandlung aus und gebe vorher die Interrupts (IRQ) global frei dann verabschiedet sich das Teil. unsigned int adc_get (unsigned int pin) { ADCR = (1<<pin) | (ADCLK_DIV<<8) | (1<<21) | (1<<24); while (!(ADDR & (1<<31))); return ((ADDR>>6) & 0x03FF); } Habe analog schon probiert mit dem Timer0 zyklisch Interrupts erzeugen zu lassen, führt natürlich zum selben Ergebnis ... Jemand eine Idee?
Achso, MEMMAP ist natürlich auch korrekt (?) konfiguriert. MEMMAP = 1; //interrupt vectors reside in flash //MEMMAP = 2; //interrupt vectors resid in SRAM Die Einstellungen für die PLL sowie PCLK und MAM korrelieren nicht mit der oben beschriebenen Problematik.
Da sich an meinem Problem leider noch nichts geändert hat, wage ich es einmal, den Beitrag nochmal nach vorne zu pushen.
Mal mit 'nem Debugger nachgesehen, was geschieht? Dank des JTAG-Interfaces sollte das doch eigentlich möglich sein ...
Alex, möglicherweise fehlt die Initialisierung des VIC? Ein Code-Fragment dazu: // // Interrupt controller initalization. // void LPC210xInitVIC() { // Setup interrupt controller. VICProtection = 0; // Disable all interrupts but the one used for the ROM monitor VICIntEnClear = 0xffffffbf; VICDefVectAddr = (unsigned int)&DefDummyInterrupt; } Ciao, Yagan
@ Rufus Bei Verwendung des Cross-Studio kann man den Wiggler irgendwie vergessen. Die Erkennung passt soweit, auch das Programm kann man raufladen (per JTAG). Geht es aber ans ernsthafte debuggen kann man das Ding irgendwie vergessen. Es ist nicht möglich, dieses simple Programm zu analysieren: int main (void) { int temp = 0; for (;;) { temp++; } } Wenn ich jetzt temp unter Locals zum beobachten einstelle und im Schrittbetrieb arbeite, so geht die Sache spätestens nach dem 10. Schritt schief. Dann kommt bspw. die Meldung "can't locate instruction". Eine Möglichkeit die IO-Register zu beobachten scheint es auch nicht zu geben. Es können nur r0-r12 und ein paar wenige andere angesehen werden. @Yagan Deine Initialisierung verstehe ich nicht ganz. VICProtection ist nach einem Reset immer Null (laut Datenblatt). Dann deaktivierst du alle Interruptvektoren bis auf Nummer 5. In meinem Datenblatt steht dort der Timer1?! Das dritte Statement mit der Default ... sollte für mich eigentlich keine Rolle spielen, da ich nur "vectored interrupts" verwenden möchte. In allen bisherigen Codebeispielen, die mir vorliegen, stand nie ein '&' vor der Funktion, welche ich als Vektoradresse eintrage. Was ist nun richtig? Alex
Meinst Du mit "Cross Studio" Rowley Crossworks? Da hatte ich bislang andere Erfahrungen mit gemacht ...
Ihr Schnullis solltet vielleicht mal abklären, von welchen Controllern Ihr redet. Yagan von 210x und Du von 21xx. Da gibt es Unterschiede...
@Sepp LPC2129 @Rufus Verwendest du auch einen Wiggler, wie er hier im Shop erhältlich ist? Vielleicht mache ich ja auch irgendwas grundlegend verkehrt.
Alex, > Deine Initialisierung verstehe ich nicht ganz. > VICProtection ist nach einem Reset immer Null (laut Datenblatt). Man kann beim Debuggen nicht immer davon ausgehen, dass der Registerzustand noch der gleiche ist, wie nach Reset. Das ist eine Filosofie für robusten Code. > Dann deaktivierst du alle Interruptvektoren bis auf Nummer 5. > In meinem Datenblatt steht dort der Timer1?! VICIntEnClear = 0xffffffbf; deaktiviert alle Interrupts ausser #6 (UART0 für den Monitor). > Das dritte Statement mit der Default ... sollte für mich > eigentlich keine Rolle spielen, da ich nur "vectored interrupts" > verwenden möchte. Das ist wieder robuster Code. Falls durch einen Fehler doch ein non-vectored interrupt auftritt, kann man das Problem leichter erkennen. > In allen bisherigen Codebeispielen, die mir > vorliegen, stand nie ein '&' vor der Funktion, welche ich als > Vektoradresse eintrage. Was ist nun richtig? Hier stimme ich Dir zu. Das '&' ist an dieser Stelle redundant, aber nicht falsch. Ciao, Yagan >
Ja, ich verwende einen Olimex'schen Wiggler-Nachbau. Ich habe auch einen Original-Macraigor-Wiggler untersucht - diesbezüglich besteht kein Unterschied. Unter Windows XP/2K scheint Rowley Crossworks die einzige Software zu sein, die mit einem Parallelport-JTAG-Adapter à la Wiggler brauchbare Ergebnisse liefert; der Macraigor'sche OCD Commander ist nur in der langsamsten Einstellung dazu zu bewegen, was anderes als Fehlermeldungen (und damit meine ich nicht den ominösen Fehler 43) auszuspucken.
@Yagan Na ok, da dass Debugging nicht über die serielle Schnittstelle läuft entfällt das bei mir. @Rufus Hast du der IDE noch irgendwelche Spezialeinstellungen verpasst, damit sie ohne rumzumucken arbeitet? Gibt es eine Möglichkeit sämtliche Register zu betrachten?
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.