ARM LPC2138 Eingang lesen IO0PIN

Gast #1079882
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
#1079886
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.
Persönliche Seite #1079927
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.
Persönliche Seite #1079946
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.
Gast #1079950
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren