Taster entprellen

Gast #2467065
Lesenswert?

hallo ich habe die Tasterentprell Routine von peter dannegger wie sie 
hier ist, 
http://www.mikrocontroller.net/articles/Entprellung#Warteschleifen-Verfahren

 ausprobiert das geht auch alles wunderbar aber wenn ich  meine Uart 
routine mit einfüge geht nur noch die Uart aber keine tasten auswertung 
mehr

 for (;;)
  {
   c = uart_getchar(); //hole daten vom Uartpuffer ab

   if( get_key_short( 1<<KEY1 ))
      LED_PORT ^= 1<<LED1;

    if( get_key_long( 1<<KEY1 ))
      LED_PORT ^= 1<<LED2;

    // single press and repeat

    if( get_key_press( 1<<KEY2 ) || get_key_rpt( 1<<KEY2 )){
      uint8_t i = LED_PORT;

      i = (i & 0x07) | ((i << 1) & 0xF0);
      if( i < 0xF0 )
        i |= 0x08;
      LED_PORT = i;
    }
  }
}
#2467504
Lesenswert?

Die Tastenfunktion ohne Repeat merkt sich den Tastendruck, bis er 
abgeholt wird.
Die Tastenfunktion mit Repeat setzt voraus, daß die Mainloop schneller 
als die Repeat-Zeit ausgeführt wird.


Ein unbedingtes getchar() in der Mainloop ist (fast) immer ein ganz 
böses Foul.
Deshalb gibt es oft auch eine Funktion, die erstmal anzeigt, ob 
überhaupt was im Puffer ist.


Peter
#2472713
Lesenswert?

ICH schrieb:
> schade das die tasterentprellung nun bei mir nich geht
> die routine in asm geht ja zusammen mit meinen uart
> das is natürlich mist dann

Sie geht mit Sicherheit.
Aber deine uart_getchar() wird halt nicht mitspielen.

Aber solange du den Code nicht herzeigst, ist das halt alles nur Raten 
im Wald.

Nochmal: Deine uart_getchar() DARF nicht auf das Eintreffen eines 
Zeichens warten! Du musst sie eben so gestalten, dass das nicht 
passiert, sondern die uart_getchar() einen Code zurückliefert, an dem 
der Aufrufer erkennen kann: Kein Zeichen an der UART eingetroffen. Zb 
könnte die eine 0 liefern, weil 0 in einem Text nicht vorkommen kann.

Deine main Loop sieht dann so aus:
1
 for (;;)
2
  {
3
   c = uart_getchar(); //hole daten vom Uartpuffer ab
4
   if( c != 0 ) {
5
     // Verarbeite das Zeichen von der UART
6
   }
7

8
   if( get_key_short( 1<<KEY1 ))
9
     ...

und die uart_getchar muss natürlich entsprechend geändert werden. Wie 
das dann aussehen kann, kann man aber nicht sagen, weil du der 
Aufforderung deinen Code herzuzeigen nicht nachkommst. Wir fragen das ja 
nicht zum Spass oder weil wir dich ärgern wollen.

Grundsätzlich: Dein Programm soll nirgends auf irgendetwas warten! Nur 
so kannst du die Illusion erzeugen, dass dein µC mehrere Dinge 
gleichzeitig tun kann bzw. mehrere Eingaben gleichzeitig überwachen 
kann.

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