An resistiven Touchpanel (4-Wire) Position ermitteln

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Interessante Variante.
      Du legst die Spannung also über beide Plains an. Also + an dem einen, und - an dem Anderen.
      Das ist eine ganz andere Vorgehensweise wie in Post #7 angegeben.

      Aber klar, warum denn nicht?
      Ohne PullDown-Widerstände müssten dann die ADC's bei nicht betätigtem Touch entweder Minimum oder Maximum liefern.

      Das muss ich mal ausprobieren, demnächst.
    • Mitch64 wrote:

      Bleiben bei deinem Code die Internen PullUp's nicht aktiv von Port K.3 und K.0 (Zeile 32/47), wenn du die Routine mehrfach aufrufst? Weil du Hibst High aus, dann schaltest du den Pin auf Eingang, ohne High wegzunehmen.

      Ach und wegen dem Projekt. Gibts da ein Video vielleicht? Bin neugierig.
      1. du hast recht, in Zeile 27 fehlt noch ein
      Portk = Portk And &HF0
      Ich habe es aus einem größerem Programm rauskopiert, da ist das verloren gegangen.

      2. weil du es bist, ich habe nur das eine Video damals gemacht, eigentlich wollte ich meinen neuen 3D Drucker ausprobieren und da musste ich was sinnvolles machen. Das steht noch so in der Ecke, wenn ich mal wieder Zeit habe....

    • Mitch64 wrote:

      Das muss ich mal ausprobieren, demnächst.
      So ich habs jetzt ausprobiert.
      Es funktioniert prima. Was noch fehlt ist das Mappen auf die Display-Größe.
      Ob der Touch bedient wird oder nicht, wird auch sehr sauber erkannt.

      Hier mein Codeschnipsel für Touch:

      BASCOM Source Code: Touch.inc

      1. ' Modul: Touch.inc
      2. ' Autor: Mitch64 © 2020
      3. ' erstellt: 18.08.2020
      4. ' Version: Test
      5. ' Anschlüsse lt. Testprogramm MCUFriend am Arduino-Uno Board
      6. ' X (Minus) = A2
      7. ' X (Plus) = D6
      8. ' Y (Plus) = A1
      9. ' Y (Minus) = D7
      10. PIN_TOUCH_XP Alias PortD.6 ' X-Plus
      11. PIN_TOUCH_YM Alias PortD.7 ' Y-Minus
      12. PIN_TOUCH_XM Alias PortC.2 ' X-Minus (ADC2)
      13. PIN_TOUCH_YP Alias PortC.1 ' Y-Plus (ADC1)
      14. Const ADC_TOUCH_X = 2 ' ADC2 (X-Minus)
      15. Const ADC_TOUCH_Y = 1 ' ADC1 (Y-Plus)
      16. Config ADC = Single , Prescaler = Auto , Reference = AVCC
      17. Dim _Touch_X as Word
      18. Dim _Touch_Y as Word
      19. ' ============================================================================
      20. Goto Modul_Touch_Exit
      21. ' ============================================================================
      22. ' ------------------------------------
      23. ' Liest Rohdaten von Touch-Panel ein
      24. ' Rückgabe: TRUE, wenn Touch berührt wird und
      25. ' speichert dann X- und Y-Position
      26. ' in Variablen _Touch_X und _Touch_Y.
      27. ' ------------------------------------
      28. Function Touch_Read() as Byte
      29. Local tmpWord as Word
      30. Set PIN_TFT_CS ' Chip Select Display
      31. ' Einstellung Datenpins (Display) merken
      32. !IN r24,DDRC
      33. !PUSH r24
      34. !IN r24,DDRD
      35. !PUSH r24
      36. ' Prüfen, ob Touch berührt wird
      37. ' Spannung wird von X-Plus nach Y-Minus angelegt (beide Plains)
      38. Config PIN_TOUCH_XP = Output : Set PIN_TOUCH_XP
      39. Config PIN_TOUCH_YM = Output : Reset PIN_TOUCH_YM
      40. Config PIN_TOUCH_YP = Input : Reset PIN_TOUCH_YP ' Tristate
      41. Config PIN_TOUCH_XM = Input : Reset PIN_TOUCH_XM ' Tristate
      42. Waitus 2
      43. tmpWord = GetADC(ADC_TOUCH_Y)
      44. If tmpWord < 5 then ' Keine Touchberührung
      45. Touch_Read = FALSE ' Rückgabewert
      46. Else ' Touch wird berührt
      47. ' X-Wert einlesen
      48. ' Spannung an Y-Plain anlegen (Polarität kann nach Bedarf gedreht werden)
      49. Config PIN_TOUCH_YP = Output : Reset PIN_TOUCH_YP
      50. Config PIN_TOUCH_YM = Output : Set PIN_TOUCH_YM
      51. Config PIN_TOUCH_XP = Input : Reset PIN_TOUCH_XP ' Tristate
      52. Config PIN_TOUCH_XM = Input : Reset PIN_TOUCH_XM ' Tristate
      53. Waitus 2
      54. _Touch_X = GetADC(ADC_TOUCH_X)
      55. ' Y-Wert einlesen
      56. ' Spannung an X-Plain anlegen (Polarität kann nach Bedarf gedreht werden)
      57. Config PIN_TOUCH_XP = Output : Reset PIN_TOUCH_XP
      58. Config PIN_TOUCH_XM = Output : Set PIN_TOUCH_XM
      59. Config PIN_TOUCH_YP = Input : Reset PIN_TOUCH_YP ' Tristate
      60. Config PIN_TOUCH_YM = Input : Reset PIN_TOUCH_YM ' Tristate
      61. Waitus 2
      62. _Touch_Y = GetADC(ADC_TOUCH_Y)
      63. Touch_Read = TRUE ' Rückgabewert
      64. End If
      65. ' Einstellung Datenpins (Display) restaurieren
      66. !POP r24
      67. !OUT DDRD,r24
      68. !POP r24
      69. !OUT DDRC,r24
      70. End Function
      71. ' ============================================================================
      72. Modul_Touch_Exit:
      73. ' ============================================================================
      Display All

      Und angewendet wird das z.B. so in der Hauptschleife:

      BASCOM Source Code: Hauptprogramm

      1. ' Hauptschleife
      2. Do
      3. ' Touch abfragen (Rohwerte)
      4. If Touch_Read() = True then
      5. Print "X: " ; _Touch_X
      6. Print "Y: " ; _Touch_Y
      7. Else
      8. Print "keine Touch-Berührung"
      9. End If
      10. Loop
      Vielen Dank für die Unterstützung an alle.