Touchpad 16fach ganz einfach

    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!

    • Touchpad 16fach ganz einfach

      Ja, ganz einfach.
      Beim freundlichen Chinesen gibt es Touch-Tastenfelder mit 16 Tasten und einem Chip drauf, der das ganze steuert.
      Auf dem Chip steht 8229BSF, dabei handelt es sich um einen TTP229.
      Der Chip liest die Tasten aus und stellt sie über eine 2-Draht-Schnittstelle zur Verfügung. (Bild roter Kringel)
      Es handelt sich um ein einfaches 16 Bit Schieberegister, das sich automatisch durch eine Pause von 2ms zurücksetzt.
      Die 16 Tasten entsprechen dabei den jeweiligen Bits im Schieberegister.

      Das Tastenfeld wird durch Brücken/Jumper konfiguriert, dabei müssen die Brücken 3, 4 und 5 geschlossen werden.
      Ich hab das im Bild gelb eingekringelt.

      Tastenfeld_Touch.jpg

      Das Programm liest die Daten mit 2 beliebigen Pins aus aus und stellt fest, welche Taste gedrückt wurde.
      Die Ausgabe erfolgt hier über ein I2C Display.

      Mein anfänglicher Fehler war, das Touchpad an den I2C Bus zu klemmen, laut Datenblatt sollte er das können.
      Leider wird der I2C Bus aber durch die Antwort des Schieberegisters unbrauchbar.
      Ich musste feststellen, der Chip kann prinzipiell I2C, aber der Anschluss SLSERT, um den Modus einzustellen, ist bei diesem Chipgehäuse nicht verfügbar.

      BASCOM-Quellcode: Tastenfeld Touch

      1. $regfile = "m328pdef.dat"
      2. $crystal = 16000000
      3. $hwstack = 80
      4. $swstack = 80
      5. $framesize = 100
      6. $baud = 38400
      7. $lib "YwRobot_Lcd_i2c.lib" 'LCD Lib
      8. Config Pinb.5 = Output 'Board LED
      9. Led Alias Portb.5
      10. '******************* I2C Display ************************
      11. Const Pcf8574_lcd = &H4E 'Adresse des I2C-LCDs, je nach Baustein und Adresse!
      12. Dim Lcd_backlight As Byte '1 an, 0 aus.
      13. '****************** Initialisierung ***********************
      14. Config Scl = Portc.5 'I2C Pins
      15. Config Sda = Portc.4 'I2C Pins
      16. Config Lcd = 20 * 4 'muss nicht unbeding angegeben werden
      17. Config I2cdelay = 10 '100 kHz
      18. I2cinit
      19. Waitms 100
      20. Initlcd
      21. Waitms 100
      22. Lcd_backlight = 1 'Beleuchtung Einschalten
      23. Cls
      24. Led = 1
      25. Waitms 100
      26. Dim I As Word
      27. Dim Index As Byte
      28. Dim Tasten1 As Byte
      29. Dim Tasten2 As Byte
      30. Dim Tasten1_alt As Byte
      31. Dim Tasten2_alt As Byte
      32. Dim Tastendruck As Bit
      33. Touchclock Alias Portb.4 'Touchfeld Clock In
      34. Ddrb.4 = 1
      35. Touchdaten Alias Pinb.3 'Touchfeld Data Out
      36. Touchclock = 1
      37. Print "I2C Adresse "
      38. For Index = 2 To 254 Step 2 'I2C Teilnehmer am Bus feststellen
      39. I2cstart
      40. I2cwbyte Index
      41. If Err = 0 Then
      42. Print Index
      43. I2cstop
      44. End If
      45. Next
      46. Led = 0
      47. Locate 1 , 1
      48. Lcd "Touch Tastenfeld"
      49. '******************** Hauptprogramm ***********************
      50. Do
      51. Shiftin Touchdaten , Touchclock , Tasten1 , 2 'Tasten einlesen
      52. Shiftin Touchdaten , Touchclock , Tasten2 , 2
      53. Tastendruck = 0
      54. If Tasten1 <> Tasten1_alt Then Tastendruck = 1 'Wurde eine Taste gedrückt?
      55. If Tasten2 <> Tasten2_alt Then Tastendruck = 1
      56. Tasten1_alt = Tasten1
      57. Tasten2_alt = Tasten2
      58. Waitms 3 'mind 2ms Erholzeit für Tastenfeld - bei viel Code und LCD nicht nötig
      59. For I = 0 To 7 ' Umrechnen Variable in Tastennummer
      60. If Tasten1.i = 0 Then
      61. Index = I + 1
      62. End If
      63. Next
      64. For I = 0 To 7
      65. If Tasten2.i = 0 Then
      66. Index = I + 9
      67. End If
      68. Next
      69. If Tastendruck = 1 Then 'Aktion bei Tastendruck
      70. Print Bin(tasten1) ; " " ; Bin(tasten2)
      71. Locate 2 , 1
      72. Lcd " Taste Nr:"
      73. If Index < 10 Then Lcd " "
      74. Lcd Index
      75. End If
      76. Loop
      77. End
      Alles anzeigen
    • Hallo,
      Danke für das sehr nützliche Programm. Bin froh, wenn es weitergeht.
      habe inzwischen ebenfalls feststellen müssen, daß die Verbindung zwischen Tastatur und controller nicht über I2c geht.
      Das ist ganz einfach feststellbar mit einem I2c-Scanner (siehe Anhang). Findet er eine verwertbare Slave-Adresse, wird diese auf dem LCD-Display ausgegeben.

      Noch eine Frage: Wo bekommt man diese Librarys z.B. $ lib "YwRobot_lcd_i2c.lib" oder $ lib "Key_i2c.lib" oder $ lib "I2c_twi.lbx" ??
      Ich arbeite mit der Demo-Version von Bascom.

      Danke an alle die mir hier geantwortet haben.
      Cosi
      Dateien
      • I2C Scanner.jpg

        (144,29 kB, 36 mal heruntergeladen, zuletzt: )
    • Hallo Michael,
      habe alles genau nachgebaut und das Script ebenfalls. Nur mein LCD wird nicht durch I2c angesteuert. Das ist auch nicht das Problem.
      Die Touch-Tastatur ist in 2 Teile geteilt, was auch im Programm durch "Tasten1" und "Tasten2" sichtbar wird. "Tasten1" sind die Tasten 1-8, "Tasten2" sind die von 9-16.
      Bei mir zeigen die Tasten 9 bis 16 unten den richtigen Index an, also 9 für Taste 9 usw.
      Die Tasten 1 bis 8 zeigen aber ebenfalls 9 für Taste 1 an, 10 für Taste 2 usw.
      Ich habe deshalb mal in der Display-Zeile 1 mir "Lcd Bin(Tasten1)" bzw. "Lcd Bin(Tasten2)" anzeigen lassen.
      Ohne Tastendruck sieht dies so aus; 11111111 11111111. Die erste Reihe gilt für Tasten1, die zweite Reihe für Tasten2
      Drücke ich eine Taste aus Tasten1, dann sieht es beispielsweise so aus: 11111110 11111111. Das war Taste 1: Der Index zeigt leider nicht "1", sondern 13
      Wird eine Taste aus Tasten2 gedrückt, dann sieht es so aus: 11111111 11111101; das war Taste 10: Der Index zeigt auch 10.
      Die Unterscheidung zwischen den beiden Tastenreihen funktioniert zwar, nur der Index stimmt hier nicht.
      Ich konnte keinen Fehler finden. Mein Listing hänge ich an und auch das Prgramm
      Wäre schön, wenn es eine Lösung gibt.
      Danke und freundliche Grüße
      Cosi
      Dateien
      • Tasten 2.jpg

        (129,27 kB, 36 mal heruntergeladen, zuletzt: )
      • Tasten 3.jpg

        (103,19 kB, 30 mal heruntergeladen, zuletzt: )
      • 1AF Tastaturmodul Touch.bas

        (1,78 kB, 23 mal heruntergeladen, zuletzt: )