mikrocontroller.net

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


Autor: Florian (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bugliste lesen.

Autor: Florian (Gast)
Datum:

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

kopfschuettel

Autor: Ppp Mmm (sanic)
Datum:

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

Autor: Florian (Gast)
Datum:

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

Autor: Ppp Mmm (sanic)
Datum:

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

Autor: Florian (Gast)
Datum:

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

Autor: Ppp Mmm (sanic)
Datum:

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

Autor: Florian (Gast)
Datum:

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

Autor: Ppp Mmm (sanic)
Datum:

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

Autor: Florian (Gast)
Datum:

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

Autor: Ppp Mmm (sanic)
Datum:

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

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Patrick,


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


Schoenen Gruss
  Florian

Autor: Ppp Mmm (sanic)
Datum:

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

Autor: Florian (Gast)
Datum:

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

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.