Forum: Compiler & IDEs Taster entprellen


von ICH (Gast)


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

von ER (Gast)


Lesenswert?

Er,

am besten ist es immer ALLES zu zeigen nicht nur den Teil der Main.

Dur wirst sicherlich gleich die Hinweise auf Zeile 42 im Deinem Programm 
sowie den Hinweis auf die defekte Glaskugel erhalten.

von Wolfgang (Gast)


Lesenswert?

Falls uart_getchar() so lange den Programmfortlauf blockiert, bis ein 
Zeichen eingetroffen ist, würde das manches erklären.

von Peter D. (peda)


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

von ICH (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

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.