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


von Thomas (Gast)


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++;
    }
  }
}

von 2916 (Gast)


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.

von Roland (Gast)


Lesenswert?

> Tasten macht man sicher nie im Interrupt, sondern mit dem System Timer


Das ist schlicht Quatsch. Kommt auf die Anwendung an !

mfg
Roland

von Thomas (Gast)


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

von Peter D. (peda)


Lesenswert?


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.