4 vezetékes rezisztív érintőképernyő olvasása

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
csanaszb
Újonc
Újonc
Hozzászólások: 10
Csatlakozott: 2010. december 4. szombat, 7:00

4 vezetékes rezisztív érintőképernyő olvasása

Hozzászólás Szerző: csanaszb »

Sziasztok!

Miután egy ideje sikertelenül próbálkozom a címben említett fajtájú érintőképernyő olvasásával, így hozzátok fordulok.
A Bascom oldalán lévő AN #148-as leírás alapján indultam el. Mivel nekem egy Atmega8-as chipem van ezért első lépésként a portf-et portc-re cseréltem, mivel ezen a chipen itt található az ADC. Így a képernyőt nyomkodva a legkülönfélébb értékeket kapom a pozíciótól függetlenül. Ezután eszembe jutott, hogy mintha olvastam volna valahol hogy az ADC portján lévő I/O kimenetek egyszere nem vagy nem megfelelően működnek. Ezért kipróbáltam hogy mi van ha az 5 voltos lábat vagy az 5 voltos lábat és Gnd lábakat is külön kivezetem egy másik portra. Így már sikerült elérni hogy kisebb pontatlansággal, de ugyanazokat az értékeket kapom vissza ha ugyanott nyomom a képernyőt. Van vele azonban egy másik probléma. Az x értéke például az egyik oldalon 250-től 10-terjed ami nekem tökéletes, azonban a másik oldalon ha párhuzamosan az előzővel húzom a kezem, akkor 80-tól 5-ig terjednek az értékek. Mintha nem egyenlő utat járnék be a két oldalt.
Próbálkoztam még többféle bekötéssel, olvasással, de ennél csak rosszabb eredményt kaptam.
Arra kérlek titeket hogy ha van meglévő programrészletetek amit szívesen megosztanátok, vagy ötletetek a problémára osszátok meg velem.
Csak hobbiként foglalkozom az avr-el, ezért lehet hogy valami egészen egyértelmű dolgot hibáztam.

Üdv:
SzA
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Hozzászólás Szerző: SanyiSay »

Bascom oldalon lévő minta teljesen jó, nekem is lényegében az fut.
Persze szokás szerint ki kell bogozni a lényeget, túl van bonyolítva.

Nekem az okozott gondot, hogy az AREF lábon ha VCC volt, akkor az érzékelő felület csak egy része volt pontos. Tettem rá 10K-s Potit fesz osztónak azzal beállítom a megfelelő értéket és szépen megy.
Ezt ki is lehet számolni, hisz a touch felület is csak egy osztó.
Valamint van a tekered a potit és megvan az érték módszer. :)

Prell-t itt is kezelni kell. Ami az érzékelés gyorsaságát kicsit visszaveszi.

Programot ha kell felteszem, csak akkor érthető formába kell ráznom.

Elvileg a nyomáserősséget is tudod mérni csak akkor, mind a 4 lábat mérned kell, és összehasonlítani. Ezt nem próbáltam csak tervben volt.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Lineáris kalibrálás?
Aref=Vcc -> bizonytalan. ha biztosra akarsz menni, akkor az ARef lábra külső feszültségreferencia....
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Hozzászólás Szerző: SanyiSay »

Lehet nekem sem a Prell miatt hozza a tétova eredményeket. :)
Avatar
csanaszb
Újonc
Újonc
Hozzászólások: 10
Csatlakozott: 2010. december 4. szombat, 7:00

Hozzászólás Szerző: csanaszb »

Próbálgattam még egy kicsit, hogy mi alapján változnak az értékek. Nézzük az x értéket. Ha közvetlenül az adc-re kötött oldal mentén húzom az ujjam, akkor az x 20-tól kb 250-ig vesz fel értéket a 0-255-ös tartományból ami nekem teljesen jó. Viszont ha y irányban távolodok ettől az éltől, akkor csökken az érték, ha erősebben nyomom akkor pedig nő. Y-nál ugyanez.
Az atmel leírásában olvastam, hogy a nem mért rétegek kivezetéseit Hi-Z állapotba kell állítani. Gondolom azért hogy ezen a rétegen már ne legyen feszültségosztás. Viszont az alapján amit írtam, szerintem ez nem sikerült. Ha jól értettem a leírásokból a Hi-Z állapotot a láb bemenetre, majd 0-ra állításával érhetem el.
SanyiSay: ha neked nem gond, szívesen megnézném a programod, csak tanulhatok belőle.
Avatar
SanyiSay
Elektronbűvölő
Hozzászólások: 1031
Csatlakozott: 2009. február 28. szombat, 7:00

Hozzászólás Szerző: SanyiSay »

Ha nem megfelelően állítod be az érintő kivezetéseit akkor valóban buta értékek jönnek ki, és valóban a nyomáserősség is szépen bezavar.
Így lehet mérni is azt. :) Csak akkor nem a pozíció lesz a pontos.

Programban lehet látni, mit kell tenned, hogy azt mérje amit kell.
Most igyekeztem hibamentes kódot feltenni. :D

Kód: Egész kijelölése

   $regfile = "m16def.dat"

   $baud = 38400   

   Config Adc = Single , Prescaler = Auto , Reference = Aref

   Enable Interrupts
   Start Adc       

   ' touch változók Koord
   Dim X As Word , Y As Word

   Do
      Gosub Readtouch
      Print X
      Print Y
      Print "--------------"
   Loop

  Readtouch:
      Config PORTA.3 = Output       ' X+
      Config PORTA.1 = Output       ' X-
      Set Porta.3   ' X+ -> 1
      Reset Porta.1 ' X- -> 0
      Ddra.0 = 0    ' Sets port F.0 as input
      Ddra.2 = 0    ' Sets port F.2 as input  because we need it now as ad input
      Waitms 20     ' Wait until the port is stable

      X = Getadc(0)       ' Read the ad value for the x
'      Waitms 3
      '--------------------------------------------------------

      Config PORTA.2 = Output       ' Y+
      Config PORTA.0 = Output       ' Y-
      Set Porta.2   ' Y+ -> 1
      Reset Porta.0 ' Y- -> 0
      Ddra.1 = 0    ' Sets port F.1 as input
      Ddra.3 = 0    ' Sets port F.1 as input  because we need it now as ad input
      Waitms 20     ' Wait until the port is stable

      Y = Getadc(3)       ' Read the ad value for the y
'      Waitms 3

   Return

End     
Avatar
csanaszb
Újonc
Újonc
Hozzászólások: 10
Csatlakozott: 2010. december 4. szombat, 7:00

Hozzászólás Szerző: csanaszb »

Na megtaláltam a hibát, az adc-vel szemközti oldal nem lett Hi-Z állapotba állítva, de nem vettem észre. Így már párhuzamosak az értékek.
Arra esetleg van ötletetek hogy miért csak 0-60-ig vesz fel értéket?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Kapcsolási rajz?
Kód?

A 60 az kicsi. Max érték 1023 lenne....
Avatar
csanaszb
Újonc
Újonc
Hozzászólások: 10
Csatlakozott: 2010. december 4. szombat, 7:00

Hozzászólás Szerző: csanaszb »

Miközben szedtem rendbe a kódot elkezdet a dolog működni. Az adc lábának logikai értékét állítottam 0-ról 1-re. Okozhatta ez a problémát?

Kód: Egész kijelölése

Readtouch:
Config Pinc.0 = Output
Config Pinc.1 = Input
Config Pinc.2 = Output
Config Pinc.3 = Input
Portc.0 = 1
Portc.1 = 0
Portc.2 = 0
Portc.3 = 1
Waitms 20
Y = Getadc(3)
Config Pinc.0 = Input
Config Pinc.1 = Output
Config Pinc.2 = Input
Config Pinc.3 = Output
Portc.0 = 0
Portc.1 = 0
Portc.2 = 1
Portc.3 = 1
Waitms 20
X = Getadc(2)
Return
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

A bekötéseid vannak összevissza - szerintem....
Avatar
csanaszb
Újonc
Újonc
Hozzászólások: 10
Csatlakozott: 2010. december 4. szombat, 7:00

Hozzászólás Szerző: csanaszb »

A bekötést a bascom példából vettem, alighanem a kódban volt káosz.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Hogy valami építő jellegű téma is legyen már az oldalon!
Van egy tapipad az alábbi teszt programmal.
A gond az vele, hogy néha rossz értékeket ad vissza!
Szerintetek mit kellene rajta módosítani?

Kód: Egész kijelölése

' TouchTeszter.bas

'$regfile = "m128def.dat"
$regfile = "m64def.dat"

$crystal = 16000000

$hwstack = 174
$swstack = 174
$framesize = 174

$baud = 19200

Declare Sub Readtouch()
Declare Sub Touch15x8()
'-------------------------------------------------------------------------------
'                                       ADC
'-------------------------------------------------------------------------------
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc



'-------------------------------------------------------------------------------
'                                    VARIABLES
'-------------------------------------------------------------------------------
'  Touch_ Csatlakozó bekötése ADC bemenetekre
Const Touchp_xp = 2                                         'Touch Oszlopok X+
Const Touchp_xm = 3                                         'Touch Oszlopok X-
Const Touchp_yp = 0                                         'Touch Sorok    Y+
Const Touchp_ym = 1                                         'Touch Sorok    Y-


Dim Touch_xp As Word , Touchx_col As Byte                   'Touch Oszlopok X+
Dim Touch_yp As Word , Touchy_row As Byte                   'Touch Sorok    Y+
Dim Oldtouchx_col As Byte
Dim Oldtouchy_row As Byte

'Dim Touch_xm As Word                                        'Touch Oszlopok X-
'Dim Touch_ym As Word                                        'Touch Sorok    Y-





Do

' Touch Bilentyűzet, és Szöveg szerkesztő Rutin (240 * 128 dot GLCD-re)
   Readtouch
   ' Sorokra, Oszlopokra bontás! 16 * 16 pontos karakter mátrix, 8 sor, 15 oszlop
   ' Ebböl a 4 - 8. sorok a virtuállis Billentyűzet.
   Touch15x8

   ' No prel!
   If Oldtouchx_col <> Touchx_col Or Oldtouchy_row <> Touchy_row Then
      If Touchx_col > 0 And Touchy_row > 0 Then
'         Print    " Touch BEHANGOLÁSA!"
         Print
         Print "VALUE  Touch_Y+ : " ; Touch_yp ;
         Print "      Sor Y: " ; Touchy_row                 ' for debugging
         Print "VALUE  Touch_X+ : " ; Touch_xp ;
         Print "   Oszlop X: " ; Touchx_col
         Print "2: Oszlop X: " ; Touchx_col ; "    Sor Y: " ; Touchy_row

         Waitms 1000


      End If
      Oldtouchx_col = Touchx_col
      Oldtouchy_row = Touchy_row
   End If

Loop

End




' -------------------------- TOUCSH vizsgálata ---------------------------------
Sub Readtouch()
   Ddrf.touchp_yp = 0                                       ' Sets port Touchp_y+ as input
   Ddrf.touchp_ym = 0                                       ' Sets port Touchp_y- as input  because we need it now as ad input
   Ddrf.touchp_xp = 1                                       ' Makes port Touchp_x+ output
   Ddrf.touchp_xm = 1                                       ' Makes port Touchp_x- output
   Set Portf.touchp_xp                                      ' Sets port Touchp_x+ High
   Reset Portf.touchp_xm                                    ' Sets port Touchp_x- Low
   Waitms 20                                                ' Wait until the port is stable
   Touch_yp = Getadc(touchp_yp)                             ' Read the ad value for the y
   Touch_yp = 1024 - Touch_yp                               ' Invert the reading
'   Waitms 20                                                ' Wait until the port is stable
'   Touch_ym = Getadc(Touchp_ym)                                     ' Read the ad value for the y
'   Touch_ym = 1024 - Touch_ym                               ' Invert the reading
'   Print
'   Print "VALUE Touch_Y+ : " ; Touch_yp '; "  VALUE Touch_Y- : " ; Touch_ym       ' for debugging

   Ddrf.touchp_xp = 0                                       ' Sets port Touchp_x+ as input
   Ddrf.touchp_xm = 0                                       ' Sets port Touchp_x- as input  because we need it now as ad input
   Ddrf.touchp_yp = 1                                       ' Makes port Touchp_y+ output
   Ddrf.touchp_ym = 1                                       ' Makes port Touchp_y- output
   Reset Portf.touchp_ym                                    ' Sets port Touchp_y- Low
   Set Portf.touchp_yp                                      ' Sets port Touchp_y+ High
   Waitms 20                                                ' Wait until the port is stable
   Touch_xp = Getadc(touchp_xp)                             ' Read the ad value for the x
   Touch_xp = 1024 - Touch_xp                               ' Invert the reading
'      Waitms 20                                             ' Wait until the port is stable
'   Touch_xm = Getadc(Touchp_xm)                                     ' Read the ad value for the x
'   Touch_xm = 1024 - Touch_xm                               ' Invert the reading

'   Print "VALUE  Touch_X+ : " ; Touch_xp '; "  VALUE  Touch_X- : " ; Touch_xm

End Sub

'------------------------- Dekodolás 15 Oszlop / 8 Sor ---------------------------------------------------------
' Vissza Kapot Értékek: Oszlop = Touchx_col,  Sor = Touchy_row
Sub Touch15x8()
   ' Oszlopok szelektálása
   Select Case Touch_xp                                     ' For the x value
            Case 150 To 212 : Touchx_col = 1                ' The cordinates on the touchscreen determins which key is pressed for example;
            Case 213 To 260 : Touchx_col = 2
            Case 261 To 303 : Touchx_col = 3
            Case 304 To 343 : Touchx_col = 4
            Case 344 To 394 : Touchx_col = 5
            Case 395 To 435 : Touchx_col = 6
            Case 436 To 474 : Touchx_col = 7
            Case 475 To 524 : Touchx_col = 8
            Case 525 To 566 : Touchx_col = 9
            Case 567 To 614 : Touchx_col = 10
            Case 615 To 656 : Touchx_col = 11
            Case 657 To 697 : Touchx_col = 12
            Case 698 To 748 : Touchx_col = 13
            Case 749 To 789 : Touchx_col = 14
            Case 790 To 825 : Touchx_col = 15

            Case Else Touchx_col = 0
   End Select
     ' Sorok szelektálása
   Select Case Touch_yp                                     ' For the y value
            Case 280 To 336 : Touchy_row = 1                ' The cordinates on the touchscreen determins which key is pressed for example;
            Case 337 To 383 : Touchy_row = 2
            Case 384 To 430 : Touchy_row = 3
            Case 431 To 480 : Touchy_row = 4
            Case 481 To 526 : Touchy_row = 5
            Case 527 To 574 : Touchy_row = 6
            Case 575 To 620 : Touchy_row = 7
            Case 621 To 680 : Touchy_row = 8

            Case Else Touchy_row = 0
   End Select
End Sub
:idea: :?:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

ADC pontatlanság?
Én 16x olvasnék ADC-t és utána az összeget osztanám 16-l. Vagy 32 vagy 64 db:)
A wordbe belefér 65535/1024= 64x beolvasás és utána 64-l osztás. Így a zaj az eltűnik...

Az ADC 15kHz-vel olvas. Ez a 64x túlmintavétel nem okoz hibát...
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Így alakult a beolvasó rutin.
16 olvasás átlagával. Most 30 leütésből már csak 1* tévesztet!

Kód: Egész kijelölése

' -------------------------- TOUCSH vizsgálata ---------------------------------
Sub Readtouch()
   Ddrf.touchp_yp = 0                                       ' Sets port Touchp_y+ as input
   Ddrf.touchp_ym = 0                                       ' Sets port Touchp_y- as input  because we need it now as ad input
   Ddrf.touchp_xp = 1                                       ' Makes port Touchp_x+ output
   Ddrf.touchp_xm = 1                                       ' Makes port Touchp_x- output
   Set Portf.touchp_xp                                      ' Sets port Touchp_x+ High
   Reset Portf.touchp_xm                                    ' Sets port Touchp_x- Low
   Touch_yp = 0
   Waitms 20                                                ' Wait until the port is stable
   For I = 1 To 16
      Waitus 100
      Touch_yp = Touch_yp + Getadc(touchp_yp)               ' Read the ad value for the y
   Next I

   Ddrf.touchp_xp = 0                                       ' Sets port Touchp_x+ as input
   Ddrf.touchp_xm = 0                                       ' Sets port Touchp_x- as input  because we need it now as ad input
   Ddrf.touchp_yp = 1                                       ' Makes port Touchp_y+ output
   Ddrf.touchp_ym = 1                                       ' Makes port Touchp_y- output
   Reset Portf.touchp_ym                                    ' Sets port Touchp_y- Low
   Set Portf.touchp_yp                                      ' Sets port Touchp_y+ High
   Shift Touch_yp , Right , 4
   Touch_yp = 1024 - Touch_yp                               ' Invert the reading
   Touch_xp = 0
   Waitms 18                                                ' Wait until the port is stable
   For I = 1 To 16
      Waitus 100
      Touch_xp = Touch_xp + Getadc(touchp_xp)               ' Read the ad value for the x
   Next I
   Shift Touch_xp , Right , 4
   Touch_xp = 1024 - Touch_xp                               ' Invert the reading

End Sub

Esetleg még valami ötlet?
:)
Avatar
winnerbt
Elektronbűvölő
Hozzászólások: 907
Csatlakozott: 2007. március 25. vasárnap, 6:00

Hozzászólás Szerző: winnerbt »

Szerintem "prell". Amikor hozzá kezdesz érni és nem pontosan érintkezik, akkor is mérhetsz. Elég kicsi a pozíciók eltérése, tehát egy nagy hiba okozhat eltérést, mivel a beolvasási hiba bennemarad (igaz, csak 16-a). Vagy vegyél 18 mintát és legkisebb/legnagyobb eldob, maradék=/16. Vagy a readtouch előbb csak azt ellenőrizze, hogy van-e nyomás. Ha van, akkor kezdje mérni. Vagy olvasgatod a pozíciókat és ami 3x bejött (kis toleranciával), akkor az a jó. Hirtelen több ötletem nincs.
JAni
Válasz küldése