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

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Néztem azt a variációt is. Csak nem értetettem.
Mert Ncoef = 1 volt? (For 1 to 1)-nek pedig nem láttam értelmét!

Ez már kész!

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

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

$crystal = 16000000

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

$baud = 19200

'-------------------------------------------------------------------------------
'                                       ADC
'-------------------------------------------------------------------------------
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Const Ncoef = 5
Const Dcgain = 128

Dim Acoef(ncoef) As Word

Dim Bcoef(ncoef) As Integer

Acoef(1) = 5055
Acoef(2) = 20222
Acoef(3) = 30333
Acoef(4) = 20222
Acoef(5) = 5055

Bcoef(1) = 8192
Bcoef(2) = -19411
Bcoef(3) = 18956
Bcoef(4) = -8639
Bcoef(5) = 1535

Dim Iiry(ncoef) As Dword                                    ' //output samples
Dim Iirx(ncoef) As Word                                     '//input samples
Dim N As Byte , Ir As Byte
Dim Adcw As Word , Iirw As Word

Declare Function Iir(byval Newsample As Word)as Word

Do
   For Ir = 1 To Ncoef
      Adcw = Getadc(1)
      Iirw = Iir(adcw)
'     Waitms 20               'Vajon kel ide WAIT? Vagy elég időt tölt az "Iir" rutinba?
   Next Ir
   Print Iirw

Loop

End                                                         'end program

Function Iir(byval Newsample As Word)as Word
   Local Dw As Dword
   Local Dw2 As Dword
'    //shift the old samples
    For N = Ncoef To 1 Step -1
       IirX(n) = IirX(n - 1)
       IirY(n) = IirY(n - 1)
    Next N
'    //Calculate the new output
    IirX(1) = Newsample
    IirY(1) = Acoef(1) * IirX(1)

    For N = 1 To Ncoef
        Dw = Bcoef(n) * Iiry(n)
        Dw2 = Acoef(n) * Iirx(n)
        Dw2 = Dw2 - Dw
        Iiry(1) = Iiry(1) + Dw2
    Next N
    Iiry(1) = Iiry(1) / Bcoef(1)

    Iir = Iiry(1) / Dcgain                                  'Return=

End Function
Még meg kel oldani, hogy az X, Y tengelyt felváltva számolja ki.

:D
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

"Amúgy, hogy lásd mit is csinál valójában, tedd meg azt,
hogy terminálban, kiíratod a nyers és a szűrt értéket is.
Aztán ábrázold őket."

Ehhez esetleg valaki más jobban értene!?

Lelkes segítő kerestetik!

:)
Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

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

Print nyers adat!

Print szűrt adat.

Aztán excel a barátod:)

Van annak értelme, mert csak egy késleltetett kimeneti érték van visszacsatolva(IIR esetében!). Az egyik leírásban benne van, amit linkeltem.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Nen JÓ!
Print??
X: 3004 Y: 6515
X: 463 Y: 2080
X: 6543 Y: 5290
X: 4224 Y: 4242
X: 4244 Y: 3938
X: 1851 Y: 5189
X: 7631 Y: 3162
X: 1846 Y: 4551
X: 6620 Y: 4574
X: 3496 Y: 5003
X: 3929 Y: 3985
X: 2650 Y: 3911
X: 6026 Y: 3952
X: 347 Y: 2037
X: 6271 Y: 4777
X: 2645 Y: 4825
X: 4804 Y: 2396
X: 2194 Y: 5679
X: 5250 Y: 1694
X: 2190 Y: 3832
X: 7003 Y: 5575
X: 1134 Y: 429
X: 5101 Y: 4953
X: 2166 Y: 3039
X: 3468 Y: 2084
X: 2520 Y: 5928
X: 7154 Y: 3350
X: 2503 Y: 5343
X: 6893 Y: 4956
X: 2209 Y: 3714
X: 5595 Y: 4815
X: 2870 Y: 2628
X: 4664 Y: 5523
X: 1300 Y: 2320
X: 5682 Y: 4168
X: 573 Y: 4758
X: 6137 Y: 1447
X: 2443 Y: 5886
X: 5176 Y: 1965

Hozzá sem érek közben!

:cry:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

És a Program:

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

'  IirSzuro04.bas

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

$crystal = 16000000

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

$baud = 38400

'-------------------------------------------------------------------------------
'                                       ADC
'-------------------------------------------------------------------------------
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Const Ncoef = 3
Const Dcgain = 8

'-------------------------------------------------------------------------------
'  Touch_
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 Oldtouchx2_col As Byte
Dim Oldtouchy2_row As Byte


Dim Acoef(ncoef) As Word

Dim Bcoef(ncoef) As Integer

Acoef(1) = 8841
Acoef(2) = 17682
Acoef(3) = 8841

Bcoef(1) = 16384
Bcoef(2) = -18726
Bcoef(3) = 6763

Dim Iirxy(ncoef) As Dword                                   ' //output samples
Dim Iirxx(ncoef) As Word                                    '//input samples
Dim Iiryy(ncoef) As Dword                                   ' //output samples
Dim Iiryx(ncoef) As Word                                    '//input samples

Dim N As Byte , Ir As Byte
Dim Xadcw As Word
Dim Xiirw As Word
Dim Yiirw As Word
Dim Yadcw As Word

Declare Function Xiir(byval Newsamplex As Word)as Word
Declare Function Yiir(byval Newsampley As Word)as Word

Do
   For Ir = 1 To Ncoef
      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


      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

      Yiirw = Yiir(touch_yp)


      Touch_xp = Getadc(touchp_xp)                          ' Read the ad value for the x
      Xiirw = Xiir(touch_xp)

   Next Ir
   Print "X: " ; Xiirw ; "    Y: " ; Yiirw
   Waitms 500
Loop

End                                                         'end program

Function Xiir(byval Newsamplex As Word)as Word
   Local Dw As Dword
   Local Dw2 As Dword
'    //shift the old samples
    For N = Ncoef To 1 Step -1
       Iirxx(n) = Iirxx(n - 1)
       Iirxy(n) = Iirxy(n - 1)
    Next N
'    //Calculate the new output
    Iirxx(1) = Newsamplex
    Iirxy(1) = Acoef(1) * Iirxx(1)

    For N = 1 To Ncoef
        Dw = Bcoef(n) * Iirxy(n)
        Dw2 = Acoef(n) * Iirxx(n)
        Dw2 = Dw2 - Dw
        Iirxy(1) = Iirxy(1) + Dw2
    Next N
    Iirxy(1) = Iirxy(1) / Bcoef(1)

    Xiir = Iirxy(1) / Dcgain                                'Return=

End Function


Function Yiir(byval Newsampley As Word)as Word
   Local Dw As Dword
   Local Dw2 As Dword
'    //shift the old samples
    For N = Ncoef To 1 Step -1
       Iiryx(n) = Iiryx(n - 1)
       Iiryy(n) = Iiryy(n - 1)
    Next N
'    //Calculate the new output
    Iiryx(1) = Newsampley
    Iiryy(1) = Acoef(1) * Iiryx(1)

    For N = 1 To Ncoef
        Dw = Bcoef(n) * Iiryy(n)
        Dw2 = Acoef(n) * Iiryx(n)
        Dw2 = Dw2 - Dw
        Iiryy(1) = Iiryy(1) + Dw2
    Next N
    Iiryy(1) = Iiryy(1) / Bcoef(1)

    Yiir = Iiryy(1) / Dcgain                                'Return=

End Function
Hol a BIBI?
:roll:

Nen JÓ!
Print?? Az Elöző hsz-ben! :roll:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Azt hiszem HW hiba!
Az LCD-t nem Inicializáltam alatta, és villog mint őrült!
Lehet, hogy zavarja a Touch-ot?
Viszont a 2 rutin 1-ben már nem ide való!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Le húzott LCD-vel is ilyen zajos.
Ez már a szürt érték:
X: 4527 Y: 367
X: 7179 Y: 5691
X: 768 Y: 3848
X: 5306 Y: 7064
X: 5532 Y: 6102
X: 7447 Y: 5654
X: 2314 Y: 5033
X: 7963 Y: 3480
X: 734 Y: 4950
X: 4727 Y: 6179
X: 3239 Y: 6255
X: 4871 Y: 4130
X: 3074 Y: 5538
X: 3743 Y: 1228
X: 227 Y: 6174
X: 6768 Y: 7722
X: 2517 Y: 5815
X: 5413 Y: 4942
X: 3355 Y: 4593
X: 6095 Y: 4047
X: 8187 Y: 3604
X: 5946 Y: 2440
X: 803 Y: 6232
X: 6658 Y: 6264
X: 1205 Y: 5983
X: 5131 Y: 1852
X: 3426 Y: 6573
X: 7107 Y: 6914
X: 2160 Y: 4764
X: 6682 Y: 4790
X: 4308 Y: 1622
X: 5150 Y: 4113
X: 4126 Y: 2890
X: 6852 Y: 4657
X: 929 Y: 5410
X: 5442 Y: 2450
X: 2149 Y: 4813
X: 4894 Y: 3540
X: 570 Y: 4225
X: 5609 Y: 4331
X: 1724 Y: 2847
X: 5490 Y: 5099
:?

Lehet, hogy kevés a 3*i meghivás?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Ez nagyon necces....
Az ADC bemenet és a GND közé 100 nF?

Az ADC bemenete 10k-s!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Kondi nincsen.
A bemneteken csak 120R van.

De sima 1*i olvasással is jobb volt ennél!

Feljebb vetem az olvasások számát 20-ra.
Eredmény ugyan olyan rossz!
És nagyon lassú lett!
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

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

Nem lehet hogy a GAIN-od túl nagy?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

DCGAIN = 8

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

/**************************************************************
WinFilter version 0.8
http://www.winfilter.20m.com
akundert@hotmail.com

Filter type: Low Pass
Filter model: Butterworth
Filter order: 2
Sampling Frequency: 1000 Hz
Cut Frequency: 100.000000 Hz
Coefficents Quantization: 16-bit

Z domain Zeros
z = -1.000000 + j 0.000000
z = -1.000000 + j 0.000000

Z domain Poles
z = 0.571472 + j -0.293599
z = 0.571472 + j 0.293599
***************************************************************/
#define NCoef 2
#define DCgain 8

__int16 iir(__int16 NewSample) {
    __int16 ACoef[NCoef+1] = {
         8841,
        17682,
         8841
    };

    __int16 BCoef[NCoef+1] = {
        16384,
        -18726,
         6763
    };

    static __int32 y[NCoef+1]; //output samples
    //Warning!!!!!! This variable should be signed (input sample width + Coefs width + 2 )-bit width to avoid saturation.

    static __int16 x[NCoef+1]; //input samples
    int n;

    //shift the old samples
    for(n=NCoef; n>0; n--) {
       x[n] = x[n-1];
       y[n] = y[n-1];
    }

    //Calculate the new output
    x[0] = NewSample;
    y[0] = ACoef[0] * x[0];
    for(n=1; n<=NCoef; n++)
        y[0] += ACoef[n] * x[n] - BCoef[n] * y[n];

    y[0] /= BCoef[0];
    
    return y[0] / DCgain;
}
NCoef = 2 + 1
Mert nálunk 1-el kezdödnek a Tömbök
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Szerintem ez a szűrés nem ehhez az alkalmazáshoz való.
Az alábbi lista szerint a mért értékek alig zajosak!
Viszont a Számított szűrések eredményei egészen vadak!
6 mérés után van 1 szűrés eredmény.

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


MY:  487     MX: 405
MY:  486     MX: 405
MY:  485     MX: 405
MY:  484     MX: 404
MY:  483     MX: 404
MY:  482     MX: 404
SY: 6305     SX: 4827

MY:  481     MX: 403
MY:  481     MX: 403
MY:  481     MX: 403
MY:  480     MX: 403
MY:  480     MX: 402
MY:  479     MX: 402
SY: 1507     SX: 3624

MY:  475     MX: 397
MY:  475     MX: 396
MY:  475     MX: 396
MY:  475     MX: 395
MY:  475     MX: 395
MY:  474     MX: 394
SY: 3027     SX: 8149

MY:  472     MX: 392
MY:  471     MX: 391
MY:  471     MX: 392
MY:  470     MX: 391
MY:  471     MX: 390
MY:  1023     MX: 1023
SY: 5636     SX: 3459

MY:  1022     MX: 1022
MY:  1023     MX: 1023
MY:  1023     MX: 1023
MY:  1023     MX: 1022
MY:  1023     MX: 1023
MY:  1022     MX: 1022
SY: 712     SX: 4075

MY:  1023     MX: 1023
MY:  1023     MX: 1023
MY:  1022     MX: 1023
MY:  1022     MX: 1022
MY:  1023     MX: 1022
MY:  1022     MX: 1023
SY: 3809     SX: 2294

MY:  1022     MX: 1023
MY:  1022     MX: 1022
MY:  1023     MX: 1023
MY:  1022     MX: 1023
MY:  1022     MX: 1022
MY:  1023     MX: 1023
SY: 5165     SX: 2549

MY:  1023     MX: 1023
MY:  1021     MX: 1022
MY:  1023     MX: 1023
MY:  1023     MX: 1023
MY:  1022     MX: 634
MY:  484     MX: 632
SY: 2291     SX: 5124


MY:  483     MX: 631
MY:  483     MX: 630
MY:  483     MX: 630
MY:  482     MX: 630
MY:  482     MX: 630
MY:  481     MX: 629
SY: 6348     SX: 1168

MY:  477     MX: 627
MY:  476     MX: 627
MY:  475     MX: 627
MY:  474     MX: 627
MY:  474     MX: 627
MY:  474     MX: 626
SY: 8045     SX: 6122

MY:  474     MX: 626
MY:  474     MX: 626
MY:  473     MX: 626
MY:  473     MX: 626
MY:  473     MX: 626
MY:  473     MX: 626
SY: 3498     SX: 1937

MY:  473     MX: 626
MY:  473     MX: 626
MY:  473     MX: 626
MY:  473     MX: 626
MY:  473     MX: 626
MY:  473     MX: 626
SY: 5922     SX: 6694

MY:  473     MX: 626
MY:  473     MX: 626
MY:  474     MX: 626
MY:  474     MX: 626
MY:  474     MX: 626
MY:  474     MX: 626
SY: 2460     SX: 1958

MY:  473     MX: 627
MY:  474     MX: 627
MY:  1022     MX: 1023
MY:  1023     MX: 1022
MY:  1023     MX: 1023
MY:  1022     MX: 1022
SY: 7707     SX: 5668

MY:  1022     MX: 1023
MY:  1022     MX: 1023
MY:  1023     MX: 1023
MY:  1022     MX: 1022
MY:  1023     MX: 1023
MY:  1022     MX: 1022
SY: 5205     SX: 4969

MY:  1023     MX: 1023
MY:  1022     MX: 1023
MY:  1023     MX: 1023
MY:  1022     MX: 1023
MY:  1022     MX: 1022
MY:  1023     MX: 1023
SY: 4303     SX: 3058
Jól látható, hogy a gond akkor van mikor a mérés sorozat közepén változik a jelszint. Ilyenkor kapunk fals átlagot ezt kellene kiszűrni!

Szerintem hagyom a fenébe a mérés sorozatok összegzését és átlagolását!
Csak lassítja a rendszert!
Egész egyszerűen Összehasonlítom az új értéket az előzővel.
És ha változik, eldobom az első változást, csak a 2. értéket veszem figyelembe.
Addigra beáll a toucsh.
8)
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Kovacsna köszönöm az oktatást és a türelmet!
Közben azért tanultam is valamicskét!
:)
Avatar
kovacsna
Pákabűvész
Hozzászólások: 208
Csatlakozott: 2008. június 3. kedd, 6:00

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

Hidd el, teljesen jó az a szűrő, ide!
Csak jól kell megválasztani a vágási frekit, meg az elnyomást!


Majd átnézem a programot, meg a számokat. Ne haragudj, de most nem futja az időből rá!

Nagyon szívesen. Azért vagyunk itt, hogy segítsünk a másiknak, ha tudunk.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

A közbe iktatott Printek miatt elcsúszik a mérési frekvencia.
Sampling Frequency: 1000 Hz
Cut Frequency: 100.000000 Hz
Amiket így állítottambe.

De a legnagyobb gond az egésszel, hogy sok proci időt elvesz!
És vannak ennél fontosabb feladatok a programban!
:(
Válasz küldése