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

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.

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.