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

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.