LPC2106: Externer IRQ will nicht

Gast #236565
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
Gast #236569
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
#236570
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
Gast #236571
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
#236572
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
#236574
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
Gast #236575
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
#236578
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
Gast #236579
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.