4 vezetékes rezisztív érintőképernyő olvasása
4 vezetékes rezisztív érintőképernyő olvasása
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
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
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.
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.
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.
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.
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.
Így lehet mérni is azt.
Programban lehet látni, mit kell tenned, hogy azt mérje amit kell.
Most igyekeztem hibamentes kódot feltenni.
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
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)
ReturnHogy 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?

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
Így alakult a beolvasó rutin.
16 olvasás átlagával. Most 30 leütésből már csak 1* tévesztet!
Esetleg még valami ötlet?

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
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
JAni
