Forum: Mikrocontroller und Digitale Elektronik LPC2106: Externer IRQ will nicht


von Florian (Gast)


Lesenswert?

Hallo zusammen,


ich versuche den externen IRQ 2 zur Auswertung eines angeklemmten
Radiometrix Funkmoduls zu benutzen, aber dieses Ding will und will
einfach nicht funktionieren. Ich hab leider keine Ahnung was das sein
kann. Hier ein wenig Code:


void radio_init (void)
{
// set external interrupt2 input
PINSEL0 |= 2 << 30;

// setup the VIC ...
VICProtection = 0x0;
VICIntSelect &= (~(1 << 16));
VICIntEnable |= (1 << 16);
VICVectAddr1  = (unsigned long) radio_isr;
VICVectCntl1  = (0x20 | 0x10);
}


void  _attribute_ ((interrupt("IRQ"))) radio_isr (void)
{
  // do something with the radiomodule ...

  VICVectAddr &= (~(1 << 16));
  EXTINT &= (~(1 << 2));
}


Als FIQ laeuft ein Timer Interrupt, der auch wunderbar tut. Interrupts
sind eingeschaltet im Startup Assembler Code und das Funkmodul spuckt
auch ein Signal aus. Der Interrupt davon geht an den BUT Eingang des
Olimex LPC-P2106, der eigentlich durch das PINSEL auf EINT2 gesetzt
werden sollte.

Kann jemand helfen?



Besten Dank & Gruss
  Florian

von A.K. (Gast)


Lesenswert?

Bugliste lesen.

von Florian (Gast)


Lesenswert?

Danke fuer den freundlichen Hinweis, geht das vielleicht auch noch mit
einer KURZEN Erklaerung?

kopfschuettel

von Ppp M. (sanic)


Lesenswert?

Hallo Florian,

es gibt auf der Seite von Philips ein "Errata Sheet" zu jedem
Controller.
Das ist die angesprochene Bugliste. Das Errata Sheet findest du auf der
Seite des jeweiligen Controllers, in deinem Falle auf der Seite vom
2106.

Grüße

von Florian (Gast)


Lesenswert?

Hallo Patrick,


Danke fuer Deinen Tip. Leider konnte ich in Sheet 1.7 mit Stand vom 5.
August 2005 nichts entdecken was auf ein Problem mit dem EINT2
hindeuten wuerde. Seh ich den Wald vor lauter Baeumen nicht mehr?! :(


Gruss
  Florian

von Ppp M. (sanic)


Lesenswert?

Hallo Florian,

habe mir gerade nochmal das Errata Sheet zum 2106 angeschaut.
Da steht wirklich nichts drin.
Beim LPC2124 sieht das anders aus, sorry.
Nochmal 3 sachen:
1. Du setzt ja gar nicht EXTMODE oder EXTPOLAR ?
Soll deine ISR wirklich auf low level angesprungen werden ?
2. Du musst in EXTINT das INT-Bit löschen indem du eine 1
reinschreibst.

Bei EXTINT2 sieht das so aus:
SCB_EXTINT = 4;
3.
Einen Interrupt bestätigt man meistens so:
VICVectAddr = 0;

Grüße und viel Glück,
Patrick

von Florian (Gast)


Lesenswert?

Hallo Patrick,


Danke nochmal.

Jup, die ISR soll bei low-level angesprungen werden, das Radiometrix
Funkmodul zieht den Pin so wenn es Daten hat.

Extint Bit wird geloescht und der IRQ wird auch bestaetigt:

VICVectAddr &= (~(1 << 16));
EXTINT &= (~(1 << 2));




Gruss
  Florian

von Ppp M. (sanic)


Lesenswert?

Hallo Florian,

EXTINT Bit wird nur gelöscht wenn du eine 1 reinschreibst, nicht wenn
du eine 0 setzt.
Siehe Manual Beschreibung.
VICVectAddr könnte funktionieren.
Probier trotzdem die Variante mit VICVectAddr = 0;

Außerdem würde ich eher einen Falling Edge Interrupt machen wenn der
INT ein Low-Pegel ist.

Grüße

von Florian (Gast)


Lesenswert?

Hi,

hoppla ... EXTBIT hast Du recht. Aendert aber leider auch nix. Die = 0
Variante bringt leider auch nichts :(

Hm, Falling Edge ... wie?



Danke fuer die Hilfe.
  Florian

von Ppp M. (sanic)


Lesenswert?

Hallo Florian,

du kannst dich ja etwas an meinem Code orientieren:
  SCB_MEMMAP = 1;  //interrupt vectors reside in flash
  SCB_EXTINT=0x04; // Clear Interrupt Bits

  /* EINT2 Bug workaround */
  SCB_VPBDIV=0x0;
  SCB_EXTMODE = 4; // Edge-sensitive
  SCB_VPBDIV = VPBDIV_VAL;

  SCB_VPBDIV=0x0;
  SCB_EXTPOLAR = 4; // Rising Edge <- hier einfach auf 0 umstellen
  SCB_VPBDIV = VPBDIV_VAL;
  SCB_VPBDIV=0x0;
  SCB_VPBDIV = VPBDIV_VAL;
  VICIntEnClear = 0xFFFFFFFF;           // clear all interrupts
  VICIntSelect = 0x00000000;            // clear all FIQ selections

  VICVectAddr1=(unsigned long)extint2;
  VICVectCntl1 =(1<<5) | VIC_EINT2; // VIC EINT2 steht für 16
  VICIntEnable = (1<<VIC_EINT2); //Bit = Channel des INTs

Der Anfang der ISR:
void _attribute_ ((interrupt("IRQ"))) extint2(void){
  SCB_EXTINT = 4; //Clear Interrupt Bit
  VICVectAddr = 0;
}

Natürlich habe ich noch viel mehr Krimskrams in meinem Programm, das
sind aber die wichtigen Ausschnitte.

Grüße,
Patrick

von Florian (Gast)


Lesenswert?

Hallo Patrick,



Danke fuer Dein Codebeispiel. Leider sagt mir sowohl mein Manual als
auch mein Compiler, dass es weder ein EXTMODE noch ein EXTPOLAR
Register gibt. Die Umstellung von VPBDIV hat aber einen Effekt erzielt.
Irgendwie werden momentan wohl noch ein paar Pakete verschluckt, aber
das Funkmodul synchronisiert sich zumindest.

Langsam ein Lichtblick, ENDLICH! Ich werd mal noch ein wenig dran
rumfrickeln ...


Schoenes Wochenende!
  Florian

von Ppp M. (sanic)


Lesenswert?

Hallo Florian,

check mal bitte dein Header File ( z.B. lpc2106.h oder sowas ) ob da
irgendwo EXTMODE oder EXTPOLAR drin steht.
Die Schreibweisen unterscheiden sich sehr oft.

Grüße

von Florian (Gast)


Lesenswert?

Moin Patrick,


nope steht leider nicht drin :/
Steht auch nicht im Manual.


Schoenen Gruss
  Florian

von Ppp M. (sanic)


Lesenswert?

Hallo Floran,

mein Wissen basiert größtenteils auf den verfügbaren Funktionen vom
LPC2124. Ich habe mir eben nochmal das LPC2106 Datasheet angeschaut und
gesehen dass es diese Register wirklich nicht gibt.
Sehr bitter.
Momentan kann ich dir nicht weiterhelfen bei deinem Problem.
Falls dir hier auch keiner weiterhelfen kann wende dich doch an die
LPC2000 Group von yahoo.

Grüße

von Florian (Gast)


Lesenswert?

Heyho,


das Funkmodul laeuft ja mittlerweile, jetzt kommt der I2C dran. Da
aerger ich mich grad auch ziemlich mit rum, das liegt aber eher daran,
dass ich in diesem verf*ckten Manual von dem Picaxe LCD Display hier
die Hardware Adresse nich finde und die Seppel nur irgendwelche
Codebeispiele mit ihrer eigenen Software abgedruckt haben.

Wird schon irgendwie werden. Danke fuer Deine Hilfe :)



Schoenen Gruss
  Florian

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.