Forum: Mikrocontroller und Digitale Elektronik Button - Interrupt


von Michael (Gast)


Lesenswert?

Grüße euch,

Ich hab den Phytec LPC2294 HD 200 Evaluationsboard. Da ist ein 
Push-Button "S3" drauf, der am Pin0.20 angeschlossen ist. Ich hab es als 
externe Interruptquelle konfiguriert, doch der Button löst kein externes 
Interrupt aus. Der Quellcode:

#include <LPC22XX.H>



void fiqint (void) __fiq
{
  int var1 = 3;

  EXTINT = 0x00100000; // Clear the peripheral interrupt flag

  while(1) {
    var1 = 2;
  }
}


int main(void) {
  int var1 = 0;

  IODIR0 = 0x00100000;     // Push-Button als Eingang konfigurieren
  PINSEL0 = VICIntEnable = 0x00100000;  // Push-Button als externe
                                        // Interruptquelle konfigurieren
  VICIntSelect = 0x00100000; // Push-Button-Interrupt führt zum 
FIQ-Modus

  while(1) {
   var1 = 2;
  }

  return 0;
}

Kann mir da mal bitte jemand weiterhelfen?

von Michael (Gast)


Lesenswert?

Sry der Code ist folgender:

#include <LPC22XX.H>                        /* LPC22XX Peripheral 
Registers */


void fiqint (void) __fiq
{
  int var1 = 3;

  EXTINT = 0x00100000; // Clear the peripheral interrupt flag

  while(1) {
    var1 = 2;
  }
}


int main(void) {
  int var1 = 0;

  IODIR0 = 0x00100000;  // Push-Button als Eingang konfigurieren
  PINSEL0 = 0x00000180;
  VICIntEnable = 0x00100000; // Push-Button als externe Interruptquelle
                             // konfigurieren
  VICIntSelect = 0x00100000; // Push-Button-Interrupt führt zum 
FIQ-Modus

  while(1) {
    var1 = 2;
  }

  return 0;
}

von Peter D. (peda)


Lesenswert?

Michael schrieb:
> doch der Button löst kein externes
> Interrupt aus.

Wie stellst Du das fest?

Ne Endlosschleife im Interrupt, auf die Idee muß man erstmal kommen.
Und auf ne write-only Variable.


Peter

von Michael (Gast)


Lesenswert?

Wie ich das feststelle. Ich steppe das gesamte Programm im Debugger 
durch. Kannst du bitte etwas genauer erklären wo das Problem liegt ? 
(Ich weiß : IODIR0 muss der Pin auf 0 gesetzt werden)

gruß

von Purzel (Gast)


Lesenswert?

Einen Button detektiert man nie (!) per interrupt. Mach's im Timer 
gesteuerten Loop im Main.

von Michael (Gast)


Lesenswert?

Kannst du das mal etwas erläutern? Wieso geht das nicht?

von Michael (Gast)


Lesenswert?

Ich hab den Code aktualisiert. Aber der Button löst noch immer kein 
Interrupt aus. Bin verzweifelt. Kann mir mal jemand bitte helfen?:

void FIQ_Handler (void) __fiq
{
  EXTINT = 0x00100000; // Clear the peripheral interrupt flag

  IOCLR0 = 0x00000100;
}


int main(void) {
  int var1 = 0;

  IODIR0 = 0x00000100;                  // Push-Button als Eingang
                                        // konfigurieren und D3 als 
Ausgang
  PINSEL0 = 0x00000300;      // Push-Button als EINT3 einstellen
  EXTMODE = 0x00000008;            // Push-Button :edgesensitive-
                                        // Modus(Flankenmodus)
  EXTPOLAR = 0x0000008;      // Push-Button : Interrupt beim
                                        // Loslassen des Buttons 
(Wechsel
                                        // zum Hochpegel)
  VICIntEnable = 0x00100000;    // Push-Button als externe
                                        // Interruptquelle konfigurieren
  VICIntSelect = 0x00100000;     // Push-Button-Interrupt führt zum
                                        // FIQ-Modus

  while(1) {
     IOCLR0 = 0x00000100;
  }

  return 0;
}

von Peter D. (peda)


Lesenswert?

Niemand hat Lust, erst Datenblätter wälzen zu müssen, was Deine ganzen 
kryptischen Hexwerte bedeuten.
Irgendein Wert wird wohl falsch sein, z.B. ein falscher Pin.

Es gibt bestimmt vordefinierte Macros, die einen sprechenden Namen 
haben, benutze diese.
Dann siehst Du besser durch und ein Leser auch.


Peter

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.