mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AT91 - Tasten -- lange und kurze "Drücker"


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe dieses kleine Programm geschrieben um meine Tasten auszuwerten, daß 
ganze passiert in meiner Inerrupt Subroutine und funktioniert soweit 
ganz gut, aber jetzt würde ich gerne auch lane tastendrücker asuwerten!

Wie kann ich dan nam besten machen?
Timer?, 2. Interrupt?
Das mit dem delay funktioniert irgendwie nicht?


void timer0_c_irq_handler(void)  {
  volatile AT91PS_TC     pTC = AT91C_BASE_TC0;    // pointer to timer 
channel 0 register structure
  volatile AT91PS_PIO    pPIO = AT91C_BASE_PIOA;    // pointer to PIO 
register structure
  unsigned int       dummy;            // temporary
  uint8_t presscounter,i;
  dummy = pTC->TC_SR;                  // read TC0 Status Register to 
clear interrupt

  if  ((pPIO->PIO_ODSR & LED1) == LED1)  {
    pPIO->PIO_CODR = LED1;              // turn LED1 (DS2) on
  } else  {
    pPIO->PIO_SODR = LED1;              // turn LED1 (DS2) off
  }
  bouncer++;
  if ((AT91F_PIO_GetInput(AT91C_BASE_PIOA) & BUT_left ) != BUT_left ) 
{
    i = bouncer ;
    delayisr(500000);
    if ((AT91F_PIO_GetInput(AT91C_BASE_PIOA) & BUT_left ) == BUT_left) 
{
      pressedkey = 1;
    } else {
      pressedkey = 2;
    }

  }
  if ((AT91F_PIO_GetInput(AT91C_BASE_PIOA) & BUT_right ) != BUT_right ) 
{
    pressedkey = 2;
    bouncer++;
  }
  if ((AT91F_PIO_GetInput(AT91C_BASE_PIOA) & BUT_menu ) != BUT_menu ) 
{
    pressedkey = 3;
    bouncer = 0;
    if ((AT91F_PIO_GetInput(AT91C_BASE_PIOA) & BUT_menu ) != BUT_menu ) 
{
      pressedkey = 4;
      bouncer++;
    }
  }
}

Autor: 2916 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tasten macht man sicher nie im Interrupt, sondern mit dem System Timer 
im Main. Ein tasten druck ist erkannt falls zwei ticks hintereinander 
gedrueckt ist, nachdem vorher nicht gedrueckt war. Fuer einen langen 
Tastendruck zaehlt man noch etwas raf.

Autor: Roland (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Tasten macht man sicher nie im Interrupt, sondern mit dem System Timer


Das ist schlicht Quatsch. Kommt auf die Anwendung an !

mfg
Roland

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

der Problemsteller nochmal!

Wie kann ich nun imDetail diesen langen Drücker herausfinden?
Ein Timer löst einen Interrupt aus, der wiederrum in diese Funktion 
springt.
But_x sind meine Tasten und bouncer eine Variable die hochgezählt wird!

Ich stehe auf dem Schlauch und brauche nur einen kleinen Tip, vielen 
Dank.

Gruß

thomas

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

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.