www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPC21xx und Interrupts


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex (Gast)
Datum:

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

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: Yagan Z. Dongobar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: Sepp (Gast)
Datum:

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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Yagan Z. Dongobar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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




>

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.