Forum: Mikrocontroller und Digitale Elektronik ARM LPC2138 Eingang lesen IO0PIN


von Ruprecht (Gast)


Lesenswert?

Hallo zusammmen,

ich versuche gerade per Software meine Taster zu entprellen. Dazu wollte 
ich per EINT3 einen Interrupt auslösen, eine gewisse Zeit warten, und 
wieder nachschauen, ob der Taster immer noch gedrückt ist.
1
__irq void isr_button_int3(void)
2
{
3
  delayMS(20);
4
  if (IO0PIN & (1 << 9)) 
5
  {    
6
    ButtonThreePressed = TRUE;
7
  }
8
}

Leider wird diese Bedingung "if (IO0PIN & (1 << 9))" nie erfüllt. Packe 
ich mein "ButtonThreePressed = TRUE;" unter die if-Klammerung 
funktioniert alles. EINT3 liegt an P0.9. Ich habe keine Ahnung, was ich 
hier falsch mache.

Grüße Ruprecht

von Frank N. (arm-fan)


Lesenswert?

>__irq void isr_button_int3(void)
>{
>  delayMS(20);

Das ist schonmal ein Widersruch in sich!

Interrupt benutzen um schnellstmöglich zu reagieren und dann ein Delay 
einbauen...

Tasten pollt man per Timerinterrupt und entprellt sie auch auf dem
Wege. In der Codesammlung findet sich dazu sicher einiges.

von Ruprecht (Gast)


Lesenswert?

Hallo Frank,

das ist Quick And Dirty Code. Bitte nicht so genau nehmen :-) Ich habe 
schon vor, einen TimerIRQ zu verwenden! Nur für dieses Beispiel war es 
nicht von Belang.

von Ruprecht (Gast)


Lesenswert?

Der Artikel http://www.mikrocontroller.net/articles/Entprellung ist zwar 
schön, beantwortet aber leider nicht meine Frage. Mir geht es ja auch 
eigentlich nicht um das Entprellen. Primär möchte ich unabhängig vom 
Interrupt3 nachschauen, ob an P0.9 noch ein HighLevel liegt.

von Frank N. (arm-fan)


Lesenswert?

ist die variable "ButtonThreePressed" volatile?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Verlagere die Wartezeit aus der Interruptroutine in den Usercode.
1
#define DEBOUNCETIME 20
2
3
volatile char ButtonThreePressed;
4
5
__irq void isr_button_int3(void)
6
{
7
  ButtonThreePressed = (IO0PIN & (1 << 9)) ? TRUE : FALSE;
8
}
9
10
int get_ButtonThree(void)
11
{
12
  char ButtonThree = ButtonThreePressed;
13
  delayMS(DEBOUNCETIME);
14
  return ButtonThree == ButtonThreePressed;
15
}

Das funktioniert aber nur, wenn isr_button_int3 auf Pegelwechsel 
reagiert (beide Flanken). Wenn isr_button_int3 auf low level oder high 
level scharf ist, kommst du so nicht weiter.

von Ruprecht (Gast)


Lesenswert?

Nein:
1
#ifndef TRUE
2
  #define TRUE 1
3
#endif
4
#ifndef FALSE
5
  #define FALSE 0
6
#endif
7
8
int ButtonOnePressed, ButtonTwoPressed, ButtonThreePressed, iStateEntry, toggle;

...und voll global

von Frank N. (arm-fan)


Lesenswert?

Na, dann wärs doch mal nen Versuch wert, sie volatile zu deklarieren.
Vielleicht wird da was wegoptimiert.

von Ruprecht (Gast)


Lesenswert?

Hallo Stefan,

ich glaube, es geht nur falling-edge oder rising-edge. Zumindest laut 
Seite 29 im user manual.

Gruß

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Dann geht es so nicht. Man könnte jetzt rummurksen und hinter dem Delay 
ein Polling in die Userfunktion einbauen. Aber dagegen ist es wirklich 
schöner den Timerinterrupt zu nehmen!

> Primär möchte ich unabhängig vom
> Interrupt3 nachschauen, ob an P0.9 noch ein HighLevel liegt.

So wie im folgenden geht das nicht? Hier das volle Geschütz mit einer 
Funktion.
1
int get_pin_nine(void)
2
{
3
  return (IO0PIN & (1 << 9)) ? TRUE : FALSE;
4
}

Als Makro oder direkt im Code sollte die Abfrage auch möglich sein.

von Ruprecht (Gast)


Lesenswert?

Cool,
1
  if (IO0PIN & (1 << 9)) 
2
  {    
3
    ButtonThreePressed = TRUE;
4
  }

dieser Code in meiner EINT3 Routine zerschießt auch EINT2 und EINT1.
1
__irq void isr_button_int1(void)
2
{
3
  ButtonOnePressed = TRUE;
4
}
5
6
__irq void isr_button_int2(void)
7
{
8
    ButtonTwoPressed = TRUE;
9
}
10
11
__irq void isr_button_int3(void)
12
{
13
  //delayMS(20);
14
  if (IO0PIN & (1 << 9)) 
15
  {    
16
    ButtonThreePressed = TRUE;
17
  }
18
}

volatile bringt leider keine Besserung.

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.