Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   1206 / 1320
(#) Attila86 válasza Droot hozzászólására (») Dec 14, 2015 /
 
Szia!

Idézet:
„Tehát XPT2046 Touch IC van rajta. Kérlek erősíts meg abban, hogy ezt nem kell inicializálni”

Nem, úgy emlékszem hogy az XPT2046-ot nem kell inicializálni.
Idézet:
„a PENIRQ láb akkor kerül alacsony szintre, ha a kijelzőt megérintik, ekkor az SPI buszon kiküldött 0xD0-ra visszaküldi a megérintett X koordinátát, majd a 0x90-re visszaküldi a megérintett Y koordinátát”

Igen. Bár a hexa kódokban nem vagyok biztos így fejből, de igen, így működik.
Idézet:
„a visszaküldött érték pedig 16 bit”

Én úgy emlékszem hogy lehet 8 bitesen meg talán 12 bitesen használni.
Idézet:
„A touch IC BUSY lába pedig akkor kerül magas szintre, amikor a CS aktív”

Na ezt nem tudom, én a BUSY lábat nem használtam.

Idézet:
„A kijelző kapcsolási rajzát olvasva (csatolmány), látom, hogy van benne egy stab IC aminek se típusa se semmilye és sehol sem írják, hogy mekkora feszültséget kaphat minimum és maximum a Vcc és GND lábak között. Erről tudsz valamit?”

Rövidre zárom a kérdést: Úgy fogod megkapni az Ebay-ről hogy a panelon az U1 nincs beültetve.
Idézet:
„A JP2-es jumpert leforrasztva, a LED+t a Vcc-vel összekötve és a LED_PWM lábra PWM-el lehet szabályozni a háttérvilágítás erősségét, igaz?”

Igen, én is így szabályozom a dsPIC-kel a fényerőt a kijelzőn.
Idézet:
„Grafikai dolgokat próbáltál már vele, például egy objektumot mozgatni a kijelzőn?”

Nem, én csak szövegeket írtam ki rá és különböző alakzatokat (vonal, téglalap, kör) jelenítettem meg rajta. Illetve BMP-t rajzoltattam ki a memóriakártyáról. Ezen a videón látszik hogy nagyjából miket csináltam én eddig a kijelzővel. Mondjuk a videón pont egy másik típusú (sokkal rosszabb minőségű) kijelző van, de ugyan ezeket csináltam a nagyobbikkal is: Bővebben: Link
(#) Attila86 hozzászólása Dec 14, 2015 /
 
Rotációs enkódert szeretnék kezelni. Pontosabban azt szeretném hogy a PIC kezelje.
Agyaltam rajta hogy hogyan lehetne jól megcsinálni és arra jutottam hogy a legtutibb megoldás az állapotgép lehet. Írtam is egyet, de sajnos a gyakorlatban nem akar működni. Sokszor nem léptet és sokszor pedig többet lép mint kellene. Teljesen használhatatlan... Nem értem hogy miért nem működik.
Az enkóderem alaphelyzetben az A és a B kivezetésein is H szintet ad, a forgás közben az iránytól függő sorrendben L szint lesz rajtuk. Az enkódernek 24 lépése van és ezeknél mechanikusan picit arretálja magát, ilyenkor van mindkét lábán H szint. A PIC az enkóder mindkét lábát megszakításból figyeli, az A lábat az INT1-el, a B lábat pedig az INT2-vel. Az állapotgép az enkóder helyzetének változását úgy követi, hogy a két megszakításnak folyamatosan változtatgatja az élét. Az állapotgép az enkóder hét különböző állapotát különbözteti meg, és azt hogy épp melyik állapotban van, azt az "EnkoderAllapot" nevű előjeles változóban tárolja. Alaphelyzetben 0 az értéke, és ez -3-ig és +3-ig tud elmenni, eme hét állapot közt oda-vissza lépkedve követi az állapotgép az enkóder helyzetét. Ha -3 alá, vagy +3 fölé lép, akkor ismét 0 lesz az állapot és ilyenkor történik a tényleges léptetése a léptetendő változónak amely most épp a "DACL" nevet viseli.
Elvileg ennél hatékonyabb enkóder-kezelés nincs, mert itt magát a pergést is követi elméletileg az állapotgép így fals léptetés vagy léptetés kimaradás elméletileg nem történhet. A gyakorlatban viszont sajnos szinte csak ezek történnek. Mi lehet a gond?
  1. //Állapot:| 0|-3|-2|-1| 0| 1| 2| 3| 0|
  2. //      --+--+--+--+--+--+--+--+--+--+  
  3. //      A:| 1| 0| 0| 1| 1| 0| 0| 1| 1|
  4. //      --+--+--+--+--+--+--+--+--+--+
  5. //      B:| 1| 1| 0| 0| 1| 1| 0| 0| 1|
  6.  
  7. void __attribute__ ((interrupt, no_auto_psv)) _INT1Interrupt(void)    //Enkóder A megszakítása:
  8. {
  9.     IFS1bits.INT1IF=0;  //INT1 flagbit törlése
  10.     if(EnkoderAllapot==0 && INTCON2bits.INT1EP==1) //Ha a 0-ás állapotban vagyunk és az A-n lefutó él történt, akkor:
  11.     {
  12.         EnkoderAllapot=1;       //Az enkóder az 1. állapotban, azaz A alacsony, B magas szintű és A prelleghet
  13.         INTCON2bits.INT1EP=0;   //"Enkóder A" megszakítás mostantól felfutó élre történjen!
  14.         INTCON2bits.INT2EP=1;   //"Enkóder B" megszakítás mostantól lefutó élre történjen!
  15.         IFS1bits.INT2IF=0;      //"Enkóder B" megszakítás flagbitjének törlése
  16.     }
  17.     else if(EnkoderAllapot==1 && INTCON2bits.INT1EP==0)  //Ha az 1.-es állapotban voltunk és a A-n felfutó él történt, akkor:
  18.     {
  19.         EnkoderAllapot=0;       //Az enkóder a 0. állapotban, azaz A és B magas szintű és A prelleghet
  20.         INTCON2bits.INT1EP=1;   //"Enkóder A" megszakítás mostantól lefutó élre történjen!
  21.         INTCON2bits.INT2EP=1;   //"Enkóder B" megszakítás mostantól lefutó élre történjen!
  22.         IFS1bits.INT2IF=0;      //"Enkóder B" megszakítás flagbitjének törlése
  23.     }
  24.     else if(EnkoderAllapot==2 && INTCON2bits.INT1EP==0)  //Ha az 2.-es állapotban voltunk és a A-n felfutó él történt, akkor:
  25.     {
  26.         EnkoderAllapot=3;       //Az enkóder a 3. állapotban, azaz A magas, B alacsony szintű és A prelleghet
  27.         INTCON2bits.INT1EP=1;   //"Enkóder A" megszakítás mostantól lefutó élre történjen!
  28.         INTCON2bits.INT2EP=0;   //"Enkóder B" megszakítás mostantól felfutó élre történjen!
  29.         IFS1bits.INT2IF=0;      //"Enkóder B" megszakítás flagbitjének törlése
  30.     }
  31.     else if(EnkoderAllapot==3 && INTCON2bits.INT1EP==1)  //Ha a 3.-as állapotban voltunk és a A-n lefutó él történt, akkor:
  32.     {
  33.         EnkoderAllapot=2;       //Az enkóder a 2. állapotban, azaz A és B alacsony szintű és B prelleghet
  34.         INTCON2bits.INT1EP=0;   //"Enkóder A" megszakítás mostantól felfutó élre történjen!
  35.         INTCON2bits.INT2EP=0;   //"Enkóder B" megszakítás mostantól felfutó élre történjen!
  36.         IFS1bits.INT2IF=0;      //"Enkóder B" megszakítás flagbitjének törlése
  37.     }
  38.     else if(EnkoderAllapot==-1 && INTCON2bits.INT1EP==1)  //Ha a -1.-es állapotban voltunk és a A-n lefutó él történt, akkor:
  39.     {
  40.         EnkoderAllapot=-2;      //Az enkóder a -2. állapotban, azaz A és B alacsony szintű és A prelleghet
  41.         INTCON2bits.INT1EP=0;   //"Enkóder A" megszakítás mostantól felfutó élre történjen!
  42.         INTCON2bits.INT2EP=0;   //"Enkóder B" megszakítás mostantól felfutó élre történjen!
  43.         IFS1bits.INT2IF=0;      //"Enkóder B" megszakítás flagbitjének törlése
  44.     }
  45.     else if(EnkoderAllapot==-2 && INTCON2bits.INT1EP==0)  //Ha a -2.-es állapotban voltunk és a A-n felfutó él történt, akkor:
  46.     {
  47.         EnkoderAllapot=-1;      //Az enkóder a -1. állapotban, azaz A magas, B alacsony szintű és A prelleghet
  48.         INTCON2bits.INT1EP=1;   //"Enkóder A" megszakítás mostantól lefutó élre történjen!
  49.         INTCON2bits.INT2EP=0;   //"Enkóder B" megszakítás mostantól felfutó élre történjen!
  50.         IFS1bits.INT2IF=0;      //"Enkóder B" megszakítás flagbitjének törlése
  51.     }
  52.     else if(EnkoderAllapot==-3 && INTCON2bits.INT1EP==0)  //Ha a -3.-es állapotban voltunk és a A-n felfutó él történt, akkor:
  53.     {
  54.         EnkoderAllapot=0;       //Az enkóder a 0. állapotban, azaz A és B magas szintű és A prelleghet
  55.         INTCON2bits.INT1EP=1;   //"Enkóder A" megszakítás mostantól lefutó élre történjen!
  56.         INTCON2bits.INT2EP=1;   //"Enkóder B" megszakítás mostantól lefutó élre történjen!
  57.         IFS1bits.INT2IF=0;      //"Enkóder B" megszakítás flagbitjének törlése
  58.         if(DACL>0) DACL-=1;
  59.     }
  60. }
  61.  
  62. void __attribute__ ((interrupt, no_auto_psv)) _INT2Interrupt(void)    //Enkóder B megszakítása:
  63. {
  64.     IFS1bits.INT2IF=0;  //INT2 flagbit törlése
  65.     if(EnkoderAllapot==0 && INTCON2bits.INT2EP==1)  //Ha a 0.-es állapotban voltunk és a B-n lefutó él történt, akkor:
  66.     {
  67.         EnkoderAllapot=-1;       //Az enkóder a -1. állapotban, azaz A magas, B alacsony szintű és B prelleghet
  68.         INTCON2bits.INT1EP=1;   //"Enkóder A" megszakítás mostantól lefutó élre történjen!
  69.         INTCON2bits.INT2EP=0;   //"Enkóder B" megszakítás mostantól felfutó élre történjen!
  70.         IFS1bits.INT1IF=0;      //"Enkóder A" megszakítás flagbitjének törlése
  71.     }
  72.     else if(EnkoderAllapot==-1 && INTCON2bits.INT2EP==0)  //Ha a -1.-es állapotban voltunk és a B-n felfutó él történt, akkor:
  73.     {
  74.         EnkoderAllapot=0;       //Az enkóder a 0. állapotban, azaz A és B magas szintű és B prelleghet
  75.         INTCON2bits.INT1EP=1;   //"Enkóder A" megszakítás mostantól lefutó élre történjen!
  76.         INTCON2bits.INT2EP=1;   //"Enkóder B" megszakítás mostantól lefutó élre történjen!
  77.         IFS1bits.INT1IF=0;      //"Enkóder A" megszakítás flagbitjének törlése
  78.     }
  79.     else if(EnkoderAllapot==-2 && INTCON2bits.INT2EP==0)  //Ha a -2.-es állapotban voltunk és a B-n felfutó él történt, akkor:
  80.     {
  81.         EnkoderAllapot=-3;      //Az enkóder a -3. állapotban, azaz A alacsony, B magas szintű és B prelleghet
  82.         INTCON2bits.INT1EP=0;   //"Enkóder A" megszakítás mostantól felfutó élre történjen!
  83.         INTCON2bits.INT2EP=1;   //"Enkóder B" megszakítás mostantól lefutó élre történjen!
  84.         IFS1bits.INT1IF=0;      //"Enkóder A" megszakítás flagbitjének törlése
  85.     }
  86.     else if(EnkoderAllapot==-3 && INTCON2bits.INT2EP==1)  //Ha a -3.-as állapotban voltunk és a B-n lefutó él történt, akkor:
  87.     {
  88.         EnkoderAllapot=-2;      //Az enkóder a -2. állapotban, azaz A és B alacsony szintű és B prelleghet
  89.         INTCON2bits.INT1EP=0;   //"Enkóder A" megszakítás mostantól felfutó élre történjen!
  90.         INTCON2bits.INT2EP=0;   //"Enkóder B" megszakítás mostantól felfutó élre történjen!
  91.         IFS1bits.INT1IF=0;      //"Enkóder A" megszakítás flagbitjének törlése
  92.     }
  93.     else if(EnkoderAllapot==1 && INTCON2bits.INT2EP==1)  //Ha az 1.-es állapotban voltunk és a B-n lefutó él történt, akkor:
  94.     {
  95.         EnkoderAllapot=2;       //Az enkóder a 2. állapotban, azaz A és B alacsony szintű és B prelleghet
  96.         INTCON2bits.INT1EP=0;   //"Enkóder A" megszakítás mostantól felfutó élre történjen!
  97.         INTCON2bits.INT2EP=0;   //"Enkóder B" megszakítás mostantól felfutó élre történjen!
  98.         IFS1bits.INT1IF=0;      //"Enkóder A" megszakítás flagbitjének törlése
  99.     }
  100.     else if(EnkoderAllapot==2 && INTCON2bits.INT2EP==0)  //Ha az 2.-es állapotban voltunk és a B-n felfutó él történt, akkor:
  101.     {
  102.         EnkoderAllapot=1;       //Az enkóder a 1. állapotban, azaz A alacsony, B magas szintű és B prelleghet
  103.         INTCON2bits.INT1EP=0;   //"Enkóder A" megszakítás mostantól felfutó élre történjen!
  104.         INTCON2bits.INT2EP=1;   //"Enkóder B" megszakítás mostantól lefutó élre történjen!
  105.         IFS1bits.INT1IF=0;      //"Enkóder A" megszakítás flagbitjének törlése
  106.     }
  107.     else if(EnkoderAllapot==3 && INTCON2bits.INT2EP==0)  //Ha a 3.-as állapotban voltunk és a B-n felfutó él történt, akkor:
  108.     {
  109.         EnkoderAllapot=0;       //Az enkóder a 0. állapotban, azaz A és B magas szintű és B prelleghet
  110.         INTCON2bits.INT1EP=1;   //"Enkóder A" megszakítás mostantól lefutó élre történjen!
  111.         INTCON2bits.INT2EP=1;   //"Enkóder B" megszakítás mostantól lefutó élre történjen!
  112.         IFS1bits.INT1IF=0;      //"Enkóder A" megszakítás flagbitjének törlése
  113.         if(DACL<65535) DACL+=1;
  114.     }
  115. }
(#) Attila86 válasza Attila86 hozzászólására (») Dec 14, 2015 /
 
Ahogy látom nem túl átlátható a kód így a fórumban, talán így jobb:
(#) Attila86 válasza Attila86 hozzászólására (») Dec 14, 2015 /
 
Dehogy jobb, sajnos a fórummotor lekicsinyíti a képet. Itt van az eredeti:
(#) Zsolt2 válasza Attila86 hozzászólására (») Dec 14, 2015 /
 
Valamilyen prellmentesites van a bemeten?
(#) Attila86 válasza Attila86 hozzászólására (») Dec 14, 2015 /
 
Ja igen: természetesen mindkét láb digitális bemenet, mindkettőre be van kapcsolva belső felhúzóellenállás, az egyikre az INT1 van odakapcsolva, a másikra pedig az INT2, ezeknek a megszakításai engedélyezve vannak és ezen megszakítások prioritása a legmagasabb. Mondjuk az ördög nem alszik, inkább mutatom:
  1. //Láb irányok:
  2.     TRISBbits.TRISB5=1;             //enkóder A
  3.     TRISBbits.TRISB6=1;             //enkóder B
  4.     TRISBbits.TRISB7=1;             //enkóder gomb
  5.     //Felhúzóellenállások:
  6.     CNPU2bits.CN27PUE=1;        //felhúzóellenállás bekapcsolása a CN27-re (RB5 láb, enkóder A)
  7.     CNPU2bits.CN24PUE=1;        //felhúzóellenállás bekapcsolása a CN24-re (RB6 láb, enkóder B)
  8.     CNPU2bits.CN23PUE=1;        //felhúzóellenállás bekapcsolása a CN23-ra (RB7 láb, enkóder gomb)
  9.     //PPS:
  10.     RPINR0bits.INT1R=5;         //Az RP5 (a PIC 41-es lába) lesz az INT1 bemenet (enkóder A)
  11.     RPINR1bits.INT2R=6;         //Az RP6 (a PIC 42-es lába) lesz az INT2 bemenet (enkóder B)
  12.     //Megszakítások:
  13.     INTCON2bits.INT1EP=1;       //INT1 megszakítás lefutó élre törlénjen!
  14.     IPC5bits.INT1IP=6;          //Az INT1 megszakítás prioritása
  15.     IFS1bits.INT1IF=0;          //INT1 flagbit törlése
  16.     IEC1bits.INT1IE=1;          //INT1 megszakítás-engedélyezés (enkóder A)
  17.     INTCON2bits.INT2EP=1;       //INT2 megszakítás lefutó élre törlénjen!
  18.     IPC7bits.INT2IP=6;          //Az INT2 megszakítás prioritása
  19.     IFS1bits.INT2IF=0;          //INT2 flagbit törlése
  20.     IEC1bits.INT2IE=1;          //INT2 megszakítás-engedélyezés (enkóder B)
(#) Attila86 válasza Zsolt2 hozzászólására (») Dec 14, 2015 /
 
A pergésmentesítést maga az állapotgép végzi el. Illetve végezné, ha működne rendesen.
Ennél az állapotgépnél nem számít ha prelleg az enkóder, mert követi magát a prellegést is, viszont léptetni csak akkor léptet amikor ténylegesen megtörtént egy egységnyi forgatás (az enkóderem esetében 360°/24=15°).
(#) Droot válasza Attila86 hozzászólására (») Dec 14, 2015 /
 
Szia!

Köszi a választ a kijelzőhöz, adok én is egy kis segítséget!

Én a következő képp csinálnám:
Az encoder két lába és a test közé még kell 1-1 100nF-os kondi, ha most nem prelleg de ha kopik akor fog.
Az interruptot jól csinálod, egyszerűen csak a másik lábon kell figyelni, és eldönteni hogy alacsony vagy maga szinten van és ennek függvényében balra vagy jobbra lett tekerve. Nekemfelfutó élre fut le az interrupt.
A növelt változót pedig a main-ben kellene feldolgozni, tehást ott kellene kialakítani a state machine-t. Szükség lesz egy flag-re, amit az SM-ben 1-re állítasz és az SM-be csak úgy lép be ha a flag 0, az interruptban pedig a flag-et nullázni kell.

Szerk: A kódodat látva elég egy interrupt afelfutó élre és ott egy if-el kell csak figyelni a másik lábat. Nekem a gyakorlatban szoftveres prellmentesítésre nem volt szükség, elég a 100n.
A hozzászólás módosítva: Dec 14, 2015
(#) Hp41C válasza Attila86 hozzászólására (») Dec 14, 2015 /
 
Amikor átállítod a figyelendő él irányát, bejön/bejöhet a megszakítás. Le kellene tiltani, átállítani az él irányát, törölni a jelzőbitjét és újra engedélyezni.
(#) Attila86 válasza Hp41C hozzászólására (») Dec 14, 2015 /
 
Úgy érted hogy jön mondjuk egy INT1 megszakítás, belép a megszakításvektorra, ott rögtön törli az INT1 flagbitet majd míg utána ott molyol addig történik még egy INT1 megszakítás? És ahogy kilépne a megszakításból már rögtön ugrik is vissza?

Vagy úgy érted hogy benne van az INT1 megszakításban és közben jön egy INT2 megszakítás? Erre gondoltam, ezért van az "else if"-ek utolsó sorában mindig a másik megszakításforrás flagbitjének törlése. Viszont az előző eset az végülis megtörténhet.

A két megszakítás egyébként (INT1 és INT2) egymást ugye nem tudják megszakítani mert ugyan olyan erősek.
(#) Zsolt2 válasza Attila86 hozzászólására (») Dec 14, 2015 /
 
Ha engedelyezve van az "interrupt nesting", akkor egymast megszakithatja a ket egyforma prioritasu megszakitas is. Az adatlapban valahol kell legyen emlites a termeszetes prioritasu sorrendrol.
(#) Hp41C válasza Attila86 hozzászólására (») Dec 14, 2015 /
 
Az első eset a prellegés esete. Ha az első utasításként törlöd a jelzőbitet, a feldolgozás alatt bebillenhet újra.
A második eset az, amire gondoltam. Most épen az INT1 kér megszakítást és az INT2 magas szinten van. Az INT1 kiszolgálója átállítja az INT2 él irányát. Ekkor bejöhet az INT2. Ha letiltja, átállítja az élet törli az INT2 jelzőbitjét és újra engedélyezi, az él állításakor keletkező kérés nem jut érvényre.
A 16 biteseken megszakíthatják egymást.
(#) Attila86 válasza Hp41C hozzászólására (») Dec 14, 2015 /
 
Átírtam úgy ahogyan mondtad. Sajnos így is össze-vissza prelleg.
(#) Droot válasza Attila86 hozzászólására (») Dec 14, 2015 /
 
Úgy próbáltad, ahogy én ajánlottam?
(#) Attila86 válasza Droot hozzászólására (») Dec 14, 2015 /
 
Én ebben az áramkörben nem tehetek kondikat az enkóderre és nem is szeretnék. Másrészt a te megoldásod jóval primitívebb, vegyünk egy példát:
Az enkóder nyugalomban van, az A és a B lábán is magas szint van. Elkezdenéd tekerni az egyik irányba és ennek hatására az A alacsony szintre vált és megszakítást generál. A megszakításban megnézem hogy a B milyen állapotú és ha magas akkor mondjuk növelem a kívánt változót, ha alacsony akkor pedig csökkentem. Ez után prellegés miatt újra magas szintű lesz az A (a B pedig mindig is az volt), majd ismét L szintű. Ez újra megszakítást fog okozni, megint beolvasom a B-t és ismét növelem a változót. Két léptetést is érzékelt így a PIC, pedig valójában a tekerések száma nulla volt.

Ugyan ez az állapotgépnél úgy néz ki, hogy az enkóder állapota "0", és az "+1"-re, majd ismét "0"-ra, aztán megint "+1"-re és végül "0"-ra változik. A csökkenteni/növelni kívánt változó marad annyi amennyi volt.
(#) Bakman válasza Attila86 hozzászólására (») Dec 14, 2015 /
 
Én ugyan nem merültem bele ilyen mélységig, de Interrupt On Change (B0 és B1-es portra) megszakítással (egy makróra dolgoztak) nekem jól mentek az enkóderek. A és B állapotát tárolni egy változóban, majd ha megszakítás jön, összehasonlítani az előző állapottal és így el lehet dönteni, merre fordult. Igaz, nálam csak akkor működött jól, legfőképpen a prellegés miatt, ha legalább 20 MHz-en járt a PIC.
(#) Droot válasza Attila86 hozzászólására (») Dec 14, 2015 /
 
A kondi hardveres prellmentesítést végez, ezért nem prelleg. Rosszul mondtam, bocsánat most meg is néztem és le illetve felfutó élre kell interrupt. Én még azzal is megspékeltem, hogy egy timerrel méri milyen időnként jönnek megszakítások és egy bizonyos iső felett nem 5-ösével, hanem 10-esével növeli a változóm. Továbbá kivédtem hogy ha jól emlékszem 100ms-on belül nem történhet irányváltás. Szoftveres prellmentesítést nem is raktam bele, nincs szükség rá.
Videót nem csináltam, ha szeretnéd megmutatom, semeddig nem tart.
(#) Bakman válasza Attila86 hozzászólására (») Dec 14, 2015 /
 
Még egy apróság: szerintem külső, 1-5 kOhm felhúzóval zavarmentesebb lenne.
(#) Droot válasza Attila86 hozzászólására (») Dec 14, 2015 /
 
Most tudtam megnézni a videót.
Az milyen típusú kijelző?
A touch jól működik?
Szerintem a képminőség sem olyan rossz.
Hol vetted?
Ha ez is ebayes egy linket tudnál küldeni?
(#) Attila86 hozzászólása Dec 14, 2015 /
 
Közben rajzolgattam:
(#) Attila86 válasza Droot hozzászólására (») Dec 14, 2015 /
 
Azon a videón ez a kijelző látható: Bővebben: Link
Ennek a tochpadja teljesen jól működik, legalábbis annak a példánynak a touchpadja ami nekem van. A képminősége sokkal gyengébb. Rossz a betekintési szöge, kisebb a felbontása és látványosan nagyon nem homogén a háttérvilágítása.
(#) Attila86 válasza Bakman hozzászólására (») Dec 14, 2015 /
 
Nekem is eszembe jutott hogy lehet esetleg túl lassú a PIC és gyorsabban történik változás a PIC lábán mint hogy a megszakításból kilépne. De a helyzet az, hogy 70MHz-en pörög és egy 16 bites dsPIC-ről van szó aminél ráadásul csupán két órajelciklus egy utasításciklus. Az XC16 fordító persze biztos szerencsétlenkedik na de annyira lassú kódot csak nem írhat erre a pár bitbillegtetésre (megszakítás-élek és flagbitek birizgálása) hogy az nagyon jelentős legyen.
(#) Attila86 válasza (Felhasználó 15355) hozzászólására (») Dec 14, 2015 /
 
Nincsen sajnos. dsPIC33FJ128GP804-ről van szó.
(#) Droot válasza Attila86 hozzászólására (») Dec 14, 2015 /
 
Köszönöm az infót!
Kipróbálom ezt is, majd megrendelem aztán jó lesz valamire.

Annyira nem ismerem a Microchip típusválasztékát. Egy PIC32MX795F12L-el akartam a másik kijelzőt vezérelni, most nincs időm megnézni, de majd megnézem, hogy megegyezik-e a lábkiosztása, tápfesz, stb, lehet, hogy inkább dsPIC33-at használok hozzá, az olcsóbb is és van olyan, ami nem SMD, ha meg ugyan az a lábkiosztás akkor persze marad a 32 bites, de a dsPIC-nek nagyobb az órajele, amivel szórakozni szoktam az pl 125MHz-ről ketyeg. Viszont a PIC32-vel többet lehet tanulni, mert az ethernetet és az USB-t is ki akarom vezetni. Meg amúgy minden portot tüskesorra, mert már programoztam ilyet egy Ethernet Starter KIT-en és eléggé megtetszett, sok lehetőség van benne.
(#) Bakman válasza Attila86 hozzászólására (») Dec 14, 2015 /
 
Itt: Bővebben: Link (Reply #3) van egy C kód pergésmentesítésre, talán működik...
(#) benjami válasza Attila86 hozzászólására (») Dec 14, 2015 / 1
 
Ha csak szimpla mechanikus kézzel tekert enkóder kezelőszervről van szó, és egyébként is használsz valami ms nagyságrendű időzítőt legegyszerűbb abba beszúrni. 1ms sűrűséggel mintavételezve a két bemenetet és úgy feldolgozva semmilyen pergésmentesítés nem szükséges. Olyan gyorsan meg úgy sem tudod tekerni, hogy ne tudja követni.
(#) killbill válasza benjami hozzászólására (») Dec 15, 2015 / 1
 
Peldaul igy. Igaz, ez nem PIC, hanem 100MHz ARM es 100us-onkent van meghivva a fuggveny, de a lenyegen nem valtoztat. Bourns PEC-11 (mechanikus) enkodert hasznalok. Az lpc_pio... sor az enkoder ket jelet olvassa be az also 2 bitre.

  1. /*
  2.  *      Mintavetelezi az encoder-t
  3.  *      Ha forgatjak, allitja 'encoder' nevu valtozot
  4.  */
  5. void    buttons_encraster(void)
  6. {
  7. int             x;
  8. static  int     last, shift;
  9.  
  10.         x = (lpc_pio->port[BUTT_PORT].pin >> ENC_SHFT) & 3;
  11.         if(x != last){
  12.                 last = x;
  13.                 shift = ((shift << 2) | x) & 0x3f;
  14.                 if(shift == 0b111000)
  15.                         ++encoder;
  16.                 else if(shift == 0b110100)
  17.                         --encoder;
  18.         }
  19. }
(#) Kovidivi válasza killbill hozzászólására (») Dec 21, 2015 /
 
Szia!
Kipróbáltam a kódod, nagyon tetszik ez a megoldás!
Lehet, hogy elírtad, de nálam ez a sor:
"else if(shift == 0b110100) --encoder;" csak így működött: "else if(shift==0b001011) --encoder;".
Egyébként ez a megoldás nagyon stabil. Nem ugrál össze-vissza, pedig nincs is semmi kondi a rotary-n. 1mS-ként fut le az interruptom.
Köszi!
A hozzászólás módosítva: Dec 21, 2015
(#) Droot válasza killbill hozzászólására (») Dec 21, 2015 /
 
A működését el tudnád magyarázni légyszíves?
(#) Kovidivi válasza Droot hozzászólására (») Dec 21, 2015 /
 
Bővebben: Link
Ezt a képet nézd meg.
Következő: »»   1206 / 1320
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem