Peter Danneggers Entprellroutine in Bascom

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Peter Danneggers Entprellroutine in Bascom

      Hallo,

      für ein zukünftiges µC Projekt mit LCD und Bediener-Menü per Tasten-Navigation habe ich mich im www nach existierenden (Basic-) Routinen zur Tastenauswertung umgesehen. Sehr schick und sehr elegant kommt da die C-Routine von Peter Danneger daher, welche im Mikrocontroller.net publiziert wurde.
      Es existiert sogar eine Komfortroutine, welche neben der softwareimplementierten Tastenentprellung sogar noch die Auswertung von Tastenstatus, Tastenflanke, kurz oder lang gedrückt und eine Wiederholfunktion bei gedrückter Taste bietet. Und das ganze für bis zu acht Taster gleichzeitig.

      Leider bin ich zu unbegabt, als dass ich so was selbst auf die Beine stellen könnte. Der C-Code ist aber so gut kommentiert, dass ich mir schon vorstellen kann das ganze nach Bascom zu portieren. Falls ich eine gleichwertige (Bascom-)Basic-Lösung im www übersehen haben sollte, wäre ich für einen Hinweis sehr dankbar.

      Ansonsten würde ich die Portierung des C-Codes nach Bascom angehen.

      Grüße KH
    • @'ceperiga
      Die Debounce-Lösung ist ja nur ne nett verpackte delay-Geschichte. So weit ich weiß beträgt die Wartezeit je Abfrage 25ms. Bei 8 Tastern sind das dann 200ms. Ich meine, wir werden alle älter und ich selbst bin ja auch nicht mehr der jüngste... So viel Zeit möchte ich nicht mit warten verbringen... :D

      @djmsc
      Also, die Geschichte mit dem Schieberegister hat was. Besonders cool finde ich die 127/128er-Auswertung. Bin ja echt neidisch auf Leute, die sich so was geniales ausdenken können. Echt!

      Diese Lösung liefert ja den entprellten Tastenstatus bei 0/255 und eine press/release Funktion durch die 127/128er Auswertung.

      Vielen Dank schon mal für die Vorschläge, ich denk mal drüber nach...
    • Es stimmt auch nicht, dass für die Abfrage eine Wartezeit anfällt. Keine Taste gedrückt, wird auch nicht gewartet. Was allerdings fehlt ist die lang/kurz Unterscheidung des Tastendrucks.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • @caargoo
      Vielen Dank für den Code Schnipsel. Läuft...
      Gut gefällt mir, dass er für mich recht gut nachvollziehbar ist. Hat aber immensen Recourcenverbrauch. Auch kann die Verweildauer bei 8 Tastern in der Timer-ISR für zeitkritischen Sachen schon schwierig sein. Wären zwar ohnehin noch ein paar Sachen nachzuarbeiten, aber aus Grundlage durchaus hilfreich. Vielen Dank nochmal!

      @all
      Hab natürlich zwischenzeitlich mit dem Code von Herrn Dannegger angefangen, die Entprellung läuft bereits. Hoffe bis heut abend was vorzeigen zu können, auch wenn mein Programmierstil nicht sehr elegant ist.
    • Hallo,

      hier zunächst mal ein Demo-Programm, welches nur die Einfachversion der Dannegger'schen Tastenentprellung macht. Nachher kommt noch die Komfortversion mit erweiterter Tastenauswertung. Ich denke, so ist mein Programmierchaos besser nachvollziehbar.

      Nochmall zur Info:
      Die Dannegger'sche Tastentenprellung entprellt bis zu 8 Taster in einem Rutsch, da sie mit Byte-Operationen arbeitet. Die eigentliche Entprellroutine befindet sich in einem Timer-Interrupt und soll idealerweise alle 5..50ms aufgerufen werden. Die Funktion der originalen C-Routine ist bestens im www beschrieben.

      Grüße KH


      Quellcode

      1. '*******************************************************************************
      2. '*** Testprogramm zur Entprellung von maximal acht Tasten ***
      3. '*** nach der Methode von Peter Dannegger, programmiert in C ***
      4. '*** veröffentlicht im Mikrocontroller.net ***
      5. '*******************************************************************************
      6. '*******************************************************************************
      7. '*** Author: screwdriver ***
      8. '*** Erzeugt am: 17.08.2018 ***
      9. '*** ***
      10. '*** Letze Änderungen ******************************************************
      11. '*** ***
      12. '*******************************************************************************
      13. '*******************************************************************************
      14. '*******************************************************************************
      15. '*** Hardware-Konfiguration ***
      16. '*******************************************************************************
      17. 'Controller
      18. $regfile = "m16def.dat"
      19. $crystal = 1e6
      20. $hwstack = 32 ' default use 32 for the hardware stack
      21. $swstack = 10 ' default use 10 for the SW stack
      22. $framesize = 40 ' default use 40 for the frame space
      23. 'Timer0 in CTC Mode 1ms
      24. tccr0 = bits(cs00 , cs01 , wgm01) 'Prescale=64, Mode=CTC
      25. OCR0 = 155 'Vergleichswert für 10ms
      26. TIMSK = bits(ocie0) 'Enable Interrupt Timer0
      27. on oc0 isr_timer0
      28. 'LCD
      29. Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7
      30. config lcd = 16 * 4
      31. cursor off , noblink
      32. LcdLed Alias Portd.7 : Config LcdLed = Output : Set LcdLed
      33. '*******************************************************************************
      34. '*** Taster festlegen ***
      35. '*******************************************************************************
      36. 'Taster
      37. config porta = input : porta = 255
      38. KEYPORT alias PINA
      39. const Key_Left = 4 'PinA.4
      40. const Key_Right = 5 'PinA.5
      41. const Key_Up = 6 'PinA.6
      42. const Key_Down = 7 'PinA.7
      43. '*******************************************************************************
      44. '*** Dimension Variablen ***
      45. '*******************************************************************************
      46. dim KeyPin as byte 'Eingelesene Tasten
      47. dim KeyState as byte 'Entprellter Tastenstatus
      48. dim KeyPress as byte 'Tastendruck, Pos. Flanke
      49. dim CT0 , CT1 as byte 'Hilfsvariable
      50. dim i as byte
      51. '*******************************************************************************
      52. '*** Unterprogramme ***
      53. '*******************************************************************************
      54. config submode = new 'Keine vorherige Deklaration mehr nötig!
      55. '*******************************************************************************
      56. function get_key_press(byval key_mask as byte) as byte
      57. disable interrupts
      58. key_mask = key_mask and KeyPress
      59. KeyPress = KeyPress xor key_mask
      60. get_key_press = key_mask
      61. enable interrupts
      62. end function
      63. '*******************************************************************************
      64. '*******************************************************************************
      65. '*** HAUPTPROGRAMM ***
      66. '*******************************************************************************
      67. enable interrupts 'Globale Interruptfreigabe
      68. Cls 'LCD löschen
      69. do
      70. locate 1 , 1
      71. lcd "KeyPin " ; bin(KeyPin) 'Nicht entprellter Tastenstatus am Port, invertiert
      72. locate 2 , 1
      73. lcd "KeyState" ; bin(KeyState) 'Entprellter Tastenstatus
      74. locate 3 , 1
      75. lcd "KeyPress" ; bin(get_key_press(bits(Key_Left , Key_Right , Key_Up , Key_Down))) 'Tastendruck Ereignis, Positive Flanke
      76. loop
      77. end
      78. '*******************************************************************************
      79. '*** ISR TIMER0 ***
      80. '*******************************************************************************
      81. isr_timer0: 'Timer0 im CTC Mode
      82. '// key changed ?
      83. KeyPin = 255 - KEYPORT
      84. i = KeyState xor KeyPin
      85. '// reset or count ct0
      86. CT0 = CT0 and i
      87. CT0 = 255 - CT0
      88. '// reset or count ct1
      89. CT1 = CT1 and i
      90. CT1 = CT0 xor CT1
      91. '// count until roll over ?
      92. i = i and CT0
      93. i = i and CT1
      94. ' // then toggle debounced state
      95. KeyState = KeyState xor i
      96. '// 0->1: key press detect
      97. i = KeyState and i
      98. KeyPress = KeyPress or i
      99. return
      Alles anzeigen
      5