Forum: Mikrocontroller und Digitale Elektronik LPC2129 (ARM) EINT Problem


von Jürgen E. (sid)


Lesenswert?

Hallo ich bins mal wieder G,

für mein aktuelles Projekt brauche ich u.a. einen RC5 Empfänger. Um
diesen zu realisieren zu können muss ich externe Interrupts verwenden,
damit wenn ein Signal kommt er es sofort verarbeiten kann. Dazu habe
ich den IR Empfänger an den Pin P0.30 (EINT3) gehängt und würde nun
gerne auf eine negative flanke triggern. Was ich folgendermassen
gemacht habe:

  EXTMODE = (1<<3);
  EXTPOLAR = ~(1<<3);  //falling edge
  VICIntSelect &= ~( 1 << VIC_EINT3 );
  VICIntEnable = ( 1 << VIC_EINT3 );
  VICVectCntl2 = 0x20 | VIC_EINT3;
  VICVectAddr2 = (unsigned)eint3ISR;
  PINSEL1|=(1<<29);      //P0.30 als EINT3
  PINSEL1&=~(1<<28);

(Zusätzlich läuft momentan noch ein TIMER und ein UART IRQ, des
weiteren sind beide SPIs und der UART0 aktiv und noch ein paar
unwichtigere sachen.)

So weit so gut, doch oben geschriebene Code funktioniert nicht, weil er
ständig bei den ersten 2 Zeilen abkackt. Wenn ich die raus nehme
(EXTMODE EXTPOLAR), also activ low level, dann geht alles wunderbar.
Gut in meinem Fall momentan reicht es wenn ich auf ein activ low level
triggere, aber ich würde doch gerne wissen was da faul ist. Im MAN
heißt es dazu nur das das dazugehörige Bit im VICIntEnable Register
nicht gesetzt sein darf bevor man in die EXT... Register schreibt. Aber
das berücksichtige ich ja... ich hab sogar schon mal alle Interrupts
vorher löschen. Und die globalen Interrupts werden eh erst viel später
aktiviert.

Wie dem auch sei habe ich schon alle  möglichen Zeilen vertauscht und
eine Nacht dran rum probiert, immer mit dem gleichen Ergebnis: ersten 2
Zeilen auskommentieren => es geht, sonst nicht. Und das ist mist!

Kann mir wer helfen?
Jürgen

von A.K. (Gast)


Lesenswert?

Lies mal die Release Notes vom LPC2129 (aka Bugliste)!

von Jürgen E. (sid)


Lesenswert?

bing *brett vom kopf nehm*
I forgot: buggy µCs G

Danke für die schnelle Antwort.

Also hier der aktuelle funktionierende Code (falls es wen
interessiert):

  VPBDIV=0;
  EXTMODE = (1<<3);
  VPBDIV=VPBDIV_VAL;
  VPBDIV=0;
  EXTPOLAR = ~(1<<3);  //falling edge
  VPBDIV=VPBDIV_VAL;
  VICIntSelect &= ~( 1 << VIC_EINT3 );
  VICIntEnable = ( 1 << VIC_EINT3 );
  VICVectCntl2 = 0x20 | VIC_EINT3;
  VICVectAddr2 = (unsigned)eint3ISR;
  INT_EN;


VPBDIV muss(!!) man auf 0 gesetz werden bevor man ein(!) Register
beschreiben kann.

THX
Jürgen

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.