Touch TSC2046

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

    • Touch TSC2046

      Hallo,

      habe ein Display 7" mit einem Touch Controller TSC2046 und bekomme es nicht zum laufen. Mein letztes hatte den XPT2046.

      Hier meinen Code:

      'Inerupt Touch Controller:
      Const Use_touch = 1 'use Touch = 1Dim Touch_flag as bit
      On Int4 Touch_int
      Config Int4 = RISING
      Enable Int4
      Enable Interrupts

      'Pins Touch Controler
      Clock Alias PortH.3 TSC2046 Clock Pin
      Cst Alias PortE.3 'TSC2046CS Pin
      Din Alias Portg.5 'TSC2046 Dout Pin
      'bussy porth.4
      Dout Alias PortE.5 'TSC2046 Din Pin
      ' d irq port e.4
      Config Din = Input
      Config Clock = Output
      Config Cst = Output
      Config Dout = Output
      Cst = 1


      Dim Touchx As Word
      Dim Touchy As Word
      Dim X_dout As Byte '&B10010101
      X_dout = &HD0 '&B10010101
      Dim Y_dout As Byte 'H90 = B10010000
      Y_dout = &H90 'HD0 = B11010000
      Dim Ende As Byte


      Bräuchte Hilfe

      Gruß Jörg
      Files
      • A2560_SSD1963.bas

        (3.15 kB, downloaded 6 times, last: )
      • SSD1963.zip

        (20.46 kB, downloaded 5 times, last: )

      The post was edited 1 time, last by JOJO150272 ().

    • Hallo

      verwende die Display Routinen von Six1 mit den obigen Änderungen auf einem Arduino 2560 Board mit Schld und 7" Display.. Habe nur die Änderungen als Code reingestellt. (kann es gleich mal anfügen).

      Die Interupt Routine wird bei Berührung des Displays angesprungen, liefert aber in der Sub Lcd_read_touch keine Werte zurück.

      Habe die beiden Datenblätter überflogen aber keine Lösung gefunden.
    • Hallo Pluto25,

      ja es sind immer die selben Werte, auch wenn ich die Stellen auskommentiere.

      Der Anschluß des Displays ist über ein Shild verbunden mit dem Arduino Mega2560 Board. Wenn ich keinen Fehler gemacht habe, sollte die Zuweisung stimmen. Könnte es jemand nochmal überprüfen falls der Fehler auf meiner Seite sitzt.

      komputer.de/wordpress/wp-conte…2014/03/TFT_MEGA_V2.0.pdf
      electronicshub.org/wp-content/…1/Arduino-Mega-Pinout.jpg
    • Hmmm :?: Im Simulator schon.
      Da würde ich mal am Pin messen (Oscar) ob sich da was tut. Er sollte in jedem Fall antworten. (Nicht mit 0)
      Din / Dout nicht vertauscht? Din ist der Pin an dem der 2046 seine Daten bekommt danach ist Dout der mit dem er antwortet.
      Stimmt nun die Pdf sollte Dout alias Pin sein und die Software angepasste werden.
      Am schnellsten In SSD1963_declarations
      Zeile 90: Din Alias Pine.5
      Zeile 92: Dout Alias Portg.5

      PS überleben Levelshifter wenn ihr Ausgang besprochen wird?

      The post was edited 2 times, last by Pluto25 ().

    • Hallo Pluto25

      habe es mal Versucht, es tut sich aber nix, Zum messen werde ich leider erst nächstes Wochenende kommen. Ob der Levelshifter das abkann weis ich leider auch nicht.

      Weis jemand im der Runde ob es der Levelshifter kann?
    • Ich hab mal folgendes versucht:

      Source Code

      1. $regfile = "m8def.dat"
      2. $crystal = 922000
      3. $hwstack = $40
      4. $swstack = $40
      5. $framesize = $100
      6. $eepleave
      7. $baud = 9600
      8. $version 0 , 1 , 7
      9. Config Base = 0
      10. Config Serialout = Buffered , Size = 128
      11. '$sim
      12. 'b0=Db4 b1= b2=Bled b3=Mosi b4=Mi/Db5 b5=Sk/Rs b6=nc b7=nc
      13. 'c0=Scl c1=Cs c2=Din c3=Do c4=Sda c5=Slc c6=/res c7=nu
      14. 'd0=Rx d1=Tx d2=Int d3=nc d4=nc d5=Db7 d6=E d7=Db6
      15. 'Ddrb = &B00110111
      16. 'Ddrc = $c0
      17. 'Portc = $c0
      18. 'Ddrd = $ff
      19. Dim Touch_flag As Bit
      20. Clock Alias Portc.0 'XPT2046 Clock Pin
      21. Cst Alias Portc.1 'XPT2046 CS Pin
      22. Din Alias Pinc.3 'XPT2046 Dout Pin
      23. Dout Alias Portc.2 'XPT2046 Din Pin
      24. Config Din = Input
      25. Config Clock = Output
      26. Config Cst = Output
      27. Config Dout = Output
      28. Cst = 1
      29. Dim Touchx As Word
      30. Dim Touchy As Word
      31. Dim X_dout As Byte '&B10010101
      32. X_dout = &HD0 '&B10010101
      33. Dim Y_dout As Byte 'H90 = B10010000
      34. Y_dout = &H90 'HD0 = B11010000
      35. Dim Ende As Byte
      36. Dim Help_str As String * 10
      37. On Int0 Touch_int
      38. Config Int0 = Rising
      39. Enable Int0
      40. Declare Sub Lcd_read_touch()
      41. Print "Touchtest Version: " ; Version(2)
      42. Enable Interrupts
      43. Do
      44. ''' Print "Touch 01"
      45. If Touch_flag = 1 Then
      46. 'Print "Touch gedrückt"
      47. Touchx = 0
      48. Touchy = 0
      49. Call Lcd_read_touch()
      50. ' Print "Touch ausgelesen"
      51. ' Select Case Touchx
      52. ' Case 570 To 630 :
      53. ' If Touchy > 5 And Touchy < 65 Then
      54. ' Ende = 1
      55. ' End If
      56. 'End Select
      57. 'If Ende = 1 Then
      58. ' Ende = 0
      59. ' Exit Do
      60. 'End If
      61. Touch_flag = 0
      62. End If
      63. Waitms 10
      64. Loop
      65. Sub Lcd_read_touch()
      66. 'print "_Lcd_read_touch"
      67. Local Tx As Word , Ty As Word
      68. Local Res As Single
      69. Local Temp_str As String * 10
      70. Clock = 0
      71. Cst = 0
      72. Waitms 10
      73. Shiftout Dout , Clock , X_dout , 1 , 8 , 40
      74. Waitms 5
      75. Shiftin Din , Clock , Touchx , 1 , 16 , 40
      76. Shiftout Dout , Clock , Y_dout , 1 , 8 , 40
      77. Waitms 5
      78. Shiftin Din , Clock , Touchy , 1 , 16 , 40
      79. Cst = 1
      80. 'print "Touch X - " ; Touchx ; " - " ; X_dout
      81. 'print "Touch Y - " ; Touchy ; " - " ; Y_dout
      82. Tx = Touchx And &B0111_1111_1111_1000 '12Bit markieren
      83. Print "x:" ; Bin(tx) ;
      84. Shift Tx , Right , 3 '3x rechts schieben max Wert bei 12Bit 4095
      85. 'Print "x-l1= " ; Tx
      86. If Tx > 100 Then 'TX für X=1 z.b. 100 und 4030 für X=800
      87. Tx = Tx - 100 'TX - 100 = 0 4030 - 100 = 3930
      88. Else 'differens 3930 / 800 = 4.91
      89. Tx = Tx - Tx
      90. End If
      91. Res = Tx / 4.91
      92. Touchx = Int(res)
      93. Ty = Touchy And &B0111_1111_1111_1000
      94. Print " y:" ; Bin(ty)
      95. Shift Ty , Right , 3
      96. ' Print "y-l1= " ; Ty
      97. If Ty > 299 Then
      98. Ty = Ty - 300
      99. Else
      100. Ty = Ty - Ty
      101. End If
      102. Res = Ty / 7.37
      103. Touchy = Int(res)
      104. ' If Touchx < 801 Then
      105. Help_str = "X "
      106. Temp_str = Str(touchx)
      107. Help_str = Help_str + Format(temp_str , "0000")
      108. Print Help_str ; ", ";
      109. ' End If
      110. ' If Touchy < 481 Then
      111. Help_str = "Y "
      112. Temp_str = Str(touchy)
      113. Help_str = Help_str + Format(temp_str , "0000")
      114. Print Help_str
      115. ' End If
      116. 'Waitms 5'00
      117. Touch_flag = 0
      118. End Sub
      119. Touch_int:
      120. Touch_flag = 1
      121. ' Call Lcd_text( "Touch" , 370 , 10 , 2 , Yellow , Black)
      122. ' "Touch interupt"
      123. Return
      Display All
      Jedoch kommt ziemlicher Blödsinn raus. :S Nur antippen x=0 y= max (0111...1000). ;(
      Beim drüberzittern kommen wenig plausible Werte. Es ist vermutlich wichtig den richtigen Zeitpunkt zwischen Int und auslesen zu finden. (Anderes Display - gleicher Touch-Controller)
    • Ich hab festgestellt das es erheblich weniger Druck braucht den Int auszulösen als auch Werte zu erfassen. Wenn dann Werte kommen braucht es noch etwas bis der x-Wert stabil ist. Manchmal auch Ausreißer in der Position, selten ein fehlender y-Wert.
      Das Ergebnis:

      Source Code

      1. $regfile = "m8def.dat"
      2. $crystal = 922000
      3. $hwstack = $40
      4. $swstack = $40
      5. $framesize = $100
      6. $eepleave
      7. $baud = 38400
      8. $version 0 , 4 , 18
      9. Config Base = 0
      10. Config Serialout = Buffered , Size = 128
      11. Tclk Alias Portc.0 'XPT2046 Clock Pin
      12. Tcs Alias Portc.1 'XPT2046 CS Pin
      13. Tout Alias Pinc.3 'XPT2046 Dout Pin
      14. Tin Alias Portc.2 'XPT2046 Din Pin
      15. Config Tout = Input
      16. Config Tclk = Output
      17. Config Tcs = Output : Tcs = 1
      18. Config Tin = Output
      19. Dim Tfl As Byte
      20. Dim Txw As Word , Tyw As Word , Txa As Word
      21. Dim Txmax As Word : Txmax = 3300
      22. Dim Tymin As Word : Tymin = 350
      23. Dim Tfx As Byte : Tfx = $d0
      24. Dim Tfy As Byte : Tfy = $90
      25. On Int0 T_isr Nosave
      26. Config Int0 = Rising
      27. Enable Int0
      28. Declare Sub Lcd_read_touch()
      29. Print "Touchtest Version: " ; Version(2)
      30. Enable Interrupts
      31. Do
      32. If Tfl = 1 Then
      33. Txw = 0
      34. Tyw = 0
      35. Do
      36. Call Lcd_read_touch()
      37. Incr Tfl
      38. If Txw > 20 Then ' x gültig?
      39. ' If Txa = Txw Then ' x Ausreißer aussortieren
      40. ' gut für 8bit bei 12 zu hakelig
      41. If Tyw < 4095 Then Tfl = 200 'y gültig?
      42. ' End If
      43. ' Txa = Txw
      44. End If
      45. Loop Until Tfl > 10
      46. End If
      47. If Tfl = 200 Then
      48. If Txw > Txmax Then Txmax = Txw ' Nullpunkte anpassen
      49. Txw = Txmax - Txw
      50. If Tyw < Tymin Then Tymin = Tyw
      51. Tyw = Tyw - Tymin
      52. Txw = Txw * 5 ' Auf Displayformat bringen(240x320)
      53. Shift Txw , Right , 6
      54. Tyw = Tyw * 3
      55. Shift Tyw , Right , 5
      56. Print "x " ; Str(txw) ; " y " ; Str(tyw)
      57. Tfl = 0
      58. End If
      59. Loop
      60. Sub Lcd_read_touch()
      61. Tclk = 0
      62. Tcs = 0
      63. Waitms 2 '
      64. Shiftout Tin , Tclk , Tfx , 1 ' , 8 , 10 bei Clock > 4Mhz
      65. Shiftin Tout , Tclk , Txw , 1 ' , 8 , 10
      66. Shiftout Tin , Tclk , Tfy , 1 ' , 8 , 10
      67. Shiftin Tout , Tclk , Tyw , 1 ' , 8 , 10
      68. 'Print Txw ; " ";
      69. Shift Txw , Right , 3
      70. Shift Tyw , Right , 3
      71. 'Print Txw
      72. Tcs = 1
      73. End Sub
      74. T_isr:
      75. !push r16
      76. !ldi r16,1
      77. !sts {tfl},r16 ' Tfl = 1
      78. !POP r16
      79. Return
      Display All
      Oder die geschmeidigere 8Bit Version:
      Files
      • Touch_3.bas

        (2.16 kB, downloaded 2 times, last: )
    • Hallo Pluto25, hallo hkipnik,


      erstmal sorry das ich mich jetzt erst melde, hatten auf der Arbeit am Freitag einen sehr schlimmen Arbeitsunfall, war und bin ein bischen durch den Wind.


      So nun habe ich das Touch nun zum laufen bekommen nach dem tauschen der Pins wie von hkipnik beschrieben. Danach kamm immer der Y Wert und für den X Wert habe ich immer null bekommen. Mit der Funktion von Pluto25 kamen dann zuverlässig beide Werte, der X Wert braucht deutlich mehr Druck als der Y Wert. Bei leichter Berührung des Touch kommt nur der Y Wert, für X kommt dann immer 0. Warum es mit der Funktion von Six1 nicht funktioniert versuche ich mal herauszubekommen.


      Habe es nun jetzt so gelöst:


      On Int4 Touch_int
      Config Int4 = LOW LEVEL
      Enable Int4
      .........


      Do
      If Touch_flag = 1 Then
      Touchx = 0
      Touchy = 0
      Call Lcd_read_touch()
      Do
      Waitms 5
      Loop Until PinE.4 = 1 'Interupt 4
      Enable Int4
      Select Case Touchx 'Auswertung Touch Button Ende
      Case 570 To 630 :
      If Touchy > 5 And Touchy < 65 Then
      Ende = 1
      End If
      End Select


      If Ende = 1 Then
      Ende = 0
      Exit Do
      End If
      Touch_flag = 0
      End If
      Loop


      ........



      Touch_int:
      Disable Int4
      Touch_flag = 1
      Return
    • Irgendwie kommen da keine Glücksgefühle auf :( . Das ist alles recht zeit/rechenaufwändig mit nur mäßigem Erfolg/Trefferquote. Ein Telefontastenfeld würde vielleicht noch gehen (wobei bei jedem Druck geprüft werden muß ob er überhaupt registriert wurde und wenn ob richtig), eine Tastatur im unteren Drittel wohl gar nicht.
      Hat es jemand mit brauchbarer Trefferquote oder gar ohne Fehldruck im Einsatz?

      PS @JOJO150272 Gibt es nur den einen Button?
    • Hallo Pluto25,

      habe dem Touch einige Button Bereiche zugewiessen um Pumpen oder Ventile damit zu schalten, scheint auch zufriedenstellend zu Funktionierenn. Da bei meinem Touch bei schwacher Berührung für X immer der Wert Null kommt werfe ich dann diesen Touchwert einfach weg und melde das keine Touchfunktion ausgelöst wurde, also bitte erneut drücken. Bei etwas stärkerem Drücken kommen immer die gleichen Werte, also zumindest für mich sehr zufriedenstellend.

      Und Zeitlich scheint es zumindest bis jetzt nichts auszumachen, da durch den Touch_int die Funktion nur bei Bedarf angesprungen wird.

      Gibt es den eine bessere Möglichkeit den Touch auszuwerten. Im Moment benutze ich das Touch nur zur Anzeige der Werte und sende über die Touchfunktion die Kommandos zum steuernden AM328. Alle Daten werden über Uart bis jetzt getauscht.

      Im Bild ist der grobe Aufbau der Heizung zu sehen. Ist im Moment nicht die richtige Jahreszeit um die Heizung mal ein paar Tage lahmzulegen.

      Kann mn eigentlich die Bitmap Datei auch mittels PC direkt auf die SD-Karte kopieren? Also ohne rauszuziehen und in exteren Kartenleser zu stecken.
      Files
      • Heizung.bmp

        (1.15 MB, downloaded 13 times, last: )
    • Dieses Bild ist auf dem Display und dein Toch ist gut genug alle Ventile zu treffen? a_57_04ef5ee8
      Hier kann ich evt einen Buffer treffen, spätestens die 7 oben wären eher zufallstreffer. :/

      JOJO150272 wrote:

      Kann mn eigentlich die Bitmap Datei auch mittels PC direkt auf die SD-Karte kopieren?
      Hatte ich mir auch schon überlegt aber noch keine Routine erstellt. Ich dachte Blockweise ( Ramnot daher 64Byte?) Selbst bei Deine schnelle Maschine schafft es vermutlich nicht einen Sektor zu schreiben bevor zwei Byte angekommen sind. Vielleicht mit Puffer? Die SD verträgt Interruptpausen bei Schreiben?
    • Komisch, bei diesem Touch kann ich immer wieder das gleiche Pixel (+/- 1 Pixel) treffen, die 7 Ventiele sind recht eng beieinander, da habe ich den stift genommen. Bekommst Du auf deinem Touch keine genauen Werte ? Liegt es an der Auswertung ?

      .txt Dateien habe ich bei meiner Zeitschaltuhr schon geschrieben bis ca. 3-4k. Mal schauen wie ich das damals (vor 10-12 Jahren) gemacht habe.
    • JOJO150272 wrote:

      Bekommst Du auf deinem Touch keine genauen Werte ?
      Liegt es an der Auswertung ?
      .txt Dateien
      So +-5 bei der selben Stelle aber hin und wieder grobe Ausreißer (+-100) ;(
      Vielleicht auch/oder an der nichtvorhandenen Befestigung? a_56_df238249
      Ich habe zur Zeit keine Verwendung dafür. Es ist nur "zum beschnüffeln" hier. So kann ich etwas Vorarbeit leisten damit es bereit ist wenns dann gebraucht wird. (Flashbedarf, Speed, Umwelteinflüsse)

      .txt?? Vom Avr zum PC? Das geht problemlos, der PC ist gewohnt auf irgendwas zu warten :D