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. 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.
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)
Return
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?
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