www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ARM LPC2138 Eingang lesen IO0PIN


Autor: Ruprecht (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
__irq void isr_button_int3(void)
{
  delayMS(20);
  if (IO0PIN & (1 << 9)) 
  {    
    ButtonThreePressed = TRUE;
  }
}

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

Autor: Frank N. (arm-fan)
Datum:

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

Autor: Ruprecht (Gast)
Datum:

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

Autor: Ruprecht (Gast)
Datum:

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

Autor: Frank N. (arm-fan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ist die variable "ButtonThreePressed" volatile?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Verlagere die Wartezeit aus der Interruptroutine in den Usercode.

#define DEBOUNCETIME 20

volatile char ButtonThreePressed;

__irq void isr_button_int3(void)
{
  ButtonThreePressed = (IO0PIN & (1 << 9)) ? TRUE : FALSE;
}

int get_ButtonThree(void)
{
  char ButtonThree = ButtonThreePressed;
  delayMS(DEBOUNCETIME);
  return ButtonThree == ButtonThreePressed;
}


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.

Autor: Ruprecht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein:
#ifndef TRUE
  #define TRUE 1
#endif
#ifndef FALSE
  #define FALSE 0
#endif

int ButtonOnePressed, ButtonTwoPressed, ButtonThreePressed, iStateEntry, toggle;

...und voll global

Autor: Frank N. (arm-fan)
Datum:

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

Autor: Ruprecht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefan,

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

Gruß

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

int get_pin_nine(void)
{
  return (IO0PIN & (1 << 9)) ? TRUE : FALSE;
}


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

Autor: Ruprecht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Cool,
  if (IO0PIN & (1 << 9)) 
  {    
    ButtonThreePressed = TRUE;
  }

dieser Code in meiner EINT3 Routine zerschießt auch EINT2 und EINT1.
__irq void isr_button_int1(void)
{
  ButtonOnePressed = TRUE;
}

__irq void isr_button_int2(void)
{
    ButtonTwoPressed = TRUE;
}

__irq void isr_button_int3(void)
{
  //delayMS(20);
  if (IO0PIN & (1 << 9)) 
  {    
    ButtonThreePressed = TRUE;
  }
}

volatile bringt leider keine Besserung.

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.