Forum: Mikrocontroller und Digitale Elektronik LPC21xx und Interrupts


von Alex (Gast)


Lesenswert?

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?

von Alex (Gast)


Lesenswert?

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.

von Alex (Gast)


Lesenswert?

Da sich an meinem Problem leider noch nichts geändert hat, wage ich es
einmal, den Beitrag nochmal nach vorne zu pushen.

von Rufus T. Firefly (Gast)


Lesenswert?

Mal mit 'nem Debugger nachgesehen, was geschieht? Dank des
JTAG-Interfaces sollte das doch eigentlich möglich sein ...

von Yagan Z. Dongobar (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

@ 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

von Rufus T. Firefly (Gast)


Lesenswert?

Meinst Du mit "Cross Studio" Rowley Crossworks? Da hatte ich bislang
andere Erfahrungen mit gemacht ...

von Sepp (Gast)


Lesenswert?

Ihr Schnullis solltet vielleicht mal abklären, von welchen Controllern
Ihr redet.
Yagan von 210x und Du von 21xx. Da gibt es Unterschiede...

von Alex (Gast)


Lesenswert?

@Sepp

LPC2129

@Rufus

Verwendest du auch einen Wiggler, wie er hier im Shop erhältlich ist?
Vielleicht mache ich ja auch irgendwas grundlegend verkehrt.

von Yagan Z. Dongobar (Gast)


Lesenswert?

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




>

von Rufus T. Firefly (Gast)


Lesenswert?

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.

von Alex (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.