Fórum témák

» Több friss téma
Fórum » PIC kezdőknek
 
Témaindító: Placi84, idő: Okt 3, 2005
Témakörök:
- A PIC ÖSSZES Vdd és Vss (AVdd és AVss) (tápfeszültség) lábát be kell kötni!
- A táplábak mellé a lehető legközelebb 100nF-os KERÁMIA kondenzátorokat kell elhelyezni.
- Az MCLR lábat, 10kohm-mal fel kell húzni a Vdd tápfeszültségre.
- Külső kvarc használatakor 4MHz-ig XT, a fölött pedig HS konfigurációt kell beállítani.
- Stabilizált tápegységet kell használni, a kapcsoló üzemű "telefon töltő" adapterek okozhatnak hibákat.
- Programozáshoz, használj lehetőleg PICKIT2 vagy 3 programozót. Kerülendő a JDM (soros porti) programozó.
- A PIC adatlapja (PDF), tartalmazza a lábak kiosztását és a PIC minden paraméterét. Az adatlap ingyen letölthető!
- Egyes PIC típusoknál az RA4 nyitott nyelőelektródás (Csak lefelé húz L szintre, H szintet nem ad ki!)
- Ha a PGM lábat digitális ki-/bemenetnek használod, az alacsony feszültségű programozási lehetőséget le kell tiltani.
Lapozás: OK   617 / 1210
(#) Pali79 válasza fsub hozzászólására (») Jan 8, 2015 /
 
Szia!
A program szerint a nyomógomb csak az RB5-re lehet kötve, nem írtad, hogy nálad hol van. A megszakítás részben a flag bitek törlése nem a legszerencsésebb helyen van. Ha szimulátorba megnézed, jelen állapotban ha az RB5-re adott impulzus hatására a megszakítás területre megy a végrehajtás, nem tud belőle kilépni, mert a flag bitek törlését folyton átugorja. Ha a W és S visszaállítása elé teszed akkor már ki tud lépni.
(#) fsub válasza Pali79 hozzászólására (») Jan 8, 2015 /
 
Köszi a választ! Igen RB5-re van kötve a nyomógomb. Próbáltam ahogy írtad, de így sem akar úgy működni, ahogy szeretném. Úgy tűnik a szimulátor használatába is bele kell mélyednem, de nem tudom, hogy a nyomógomb pergésénél fellépő állapotváltozásokat hogyan lehetne szimulálni vele. Meg az egész megszakítást át kell gondolnom, hogy mikor milyen esemény következik be.
(#) foxi63 válasza fsub hozzászólására (») Jan 9, 2015 /
 
Megoldás lehet, hogy a nyomógomb lekérdezésekor kb,20 ciklus után megint lekérdezed, és ha azonos az érték, akkor elfogadva. Ellenben eldobva az adat.
Aztán még van egy pár módszer..
Megszakításban meg eleve necces gombokat figyelni sőt fölösleges, mert nem időkritikus.
Megszakítás a pontos és fontos dolgoknak kell, a lehető legrövidebb programmal.
üdv. Foxi
A hozzászólás módosítva: Jan 9, 2015
(#) fsub válasza foxi63 hozzászólására (») Jan 9, 2015 /
 
Azt hiszem megtaláltam a hiba forrását. Az egyik, amit tegnap írtál, hogy volt a megszakításban olyan rész, amikor a kiváltó okot jelző flag törölése elmaradt. A másik pedig, hogy a kimenetként, amire a ledet kötöttem az RB0-t definiáltam, és úgy tűnik ez nem jó ötlet volt, mert egy másik portot használva már működik a dolog. Bár azt nem értem, hogy ez miért okoz hibát, mert ha az RB0/INT külső megszakítás nincs engedélyezve a programban, akkor hogyan idézhet elő mégis megszakítást? Esetleg úgy, hogy függetlenül, hogy engedélyezve van vagy nincs, az RB0 INT flag külső fel vagy lefutó él hatására mégis átállítódik, és ha ez éppen a megszakítási rutinban történt, kiválthat nem várt hatást?
Egyébként nem tökéletes még mindig a programom, mert a gomb felengedésekor is néha átvált a kimenet.
Akkor azt mondod, ez a módszer, amit elgondoltam nem igazán alkalmas nyomógomb lekezelésére? Innen vettem egyébként az ötletet, bár ebben nem tér ki a prellmentesítére: Bővebben: Link
Találtam itt egy régi hozzászólásban egy másfajta módszert, de nem igazán tudom ezt még értelmezni, nem olyan rég kezdtem el PIC-ekkel foglalkozni. Bővebben: Link
(#) foxi63 válasza fsub hozzászólására (») Jan 9, 2015 /
 
Valóban bebillennek a megszakítás kérő bitek, de ezek logikai és kapcsolatban vannak a megszakítás engedélyező regiszterekkel, tehát vizsgálhatóak, de nem okoznak megszakítást.
Például a timer túlcsordulás jelző is bebillen, de mégse okoz megszakítást....
Tehát ha az RB0 nincs engedélyezve, nem is okozhat megszakítást.
A legjobb megoldás, hogy készítesz egy időzítő áramkört, és 1/10 másodpercenként hívod meg a gomb figyelést, és akkor csak 1x olvasod be és kész , nincs és nem is lehet prellezés.
(#) benjami válasza fsub hozzászólására (») Jan 9, 2015 / 2
 
Én mindig időzítőmegszakítás ütemezése szerint szoktam a gombokat lekérdezni. A következő példa egy óra két gombjának kezelése. Tudja értelmezni a rövid gombnyomást (felengedéskor), a hosszú gombnyomást, hosszú gombnyomáskor az ismétlést, a hosszú lenyomás végén a felengedést és végül mindezt a két gomb együttes lenyomásával együtt is.
A LED kijelző frissítési frekvenciájával hivogatva (100Hz) remekül működik.
  1. // gomb ismétlésének kezdete (ennyi mintavétel után kezdjen ismételni)
  2. #define  BTNREPEATSTARTSPEED 60
  3. // gomb ismétlési sebessége (ennyi mintavételenkét ismételjen)
  4. #define  BTNREPEATSPEED 10
  5. #define  BUTTON1       PORTAbits.RA3
  6. #define  BUTTON2       PORTAbits.RA2
  7.  
  8. unsigned char Btn;                      // lenyomott gomb kódja
  9. // gombok parancskódjai
  10. // (rövid lenyomás utáni felengedés, hosszú lenyomás, hosszú lenyomott állapotban ismétlés, hosszú lenyomás utáni felengedés)
  11. #define BUTTON1CMDSHORT     11
  12. #define BUTTON1CMDLONG      12
  13. #define BUTTON1CMDREPEAT    13
  14. #define BUTTON1CMDUP        14
  15. #define BUTTON2CMDSHORT     21
  16. #define BUTTON2CMDLONG      22
  17. #define BUTTON2CMDREPEAT    23
  18. #define BUTTON2CMDUP        24
  19. #define BUTTONBOTHCMDSHORT  31
  20. #define BUTTONBOTHCMDLONG   32
  21. #define BUTTONBOTHCMDREPEAT 33
  22. #define BUTTONBOTHCMDUP     34
  23.  
  24. // GetButtons
  25. // Lekérdezi a két nyomógomb állapotát és parancsokat rendel hozzá
  26. // Külön parancskód tartozik a rövid lenyomás utáni felengedéshez, a hosszú lenyomáshoz
  27. //   a hosszú lenyomáskori ismétléshez és a hosszú lenyomás utáni felengedéshez.
  28. //
  29. // Rövid gombnyomás felengedésekor a következö parancsokat küldi:
  30. // - 1 db BUTTONxCMDSHORT
  31. //
  32. // Hosszú gombnyomáskor a következö parancsokat küldi:
  33. // - 1 db BUTTONxCMDLONG (amikor elérte a hosszú lenyomás kezdetét)
  34. // - N db BUTTONxCMDREPEAT (lenyomva tartás alatt ezt ismétli)
  35. // - 1 db BUTTONxCMDUP (felengedéskor)
  36. //
  37. // A két nyomógomb együttes lenyomásához is külön parancs tartozik.
  38. // bemenet:
  39. // - BUTTON1, BUTTON2 nyomógomb
  40. // kimenet:
  41. // - Btn = parancs kódja
  42.  
  43. void GetButtons(void)
  44. {
  45.   static unsigned char BtnPressed = 0;  // elözö lekérdezéskor lenyomott gomb kódja
  46.   static unsigned char BtnCount = 0;    // billentű ismétlés számláló
  47.  
  48.   Btn = 0;
  49.   if(!BUTTON2)
  50.     Btn = BUTTON2CMDSHORT;
  51.   if(!BUTTON1)
  52.     Btn = BUTTON1CMDSHORT;
  53.   if(!BUTTON1 && !BUTTON2)
  54.     Btn = BUTTONBOTHCMDSHORT;
  55.  
  56.   if(Btn)
  57.   { // van gomb lenyomva
  58.     if(Btn == BtnPressed)
  59.     { // ugyanaz van lenyomva, mint az elözö mintavételnél
  60.       BtnCount++;
  61.       if(BtnCount == BTNREPEATSTARTSPEED)
  62.         Btn++;                          // BUTTONxCMDLONG
  63.       else if(BtnCount >= (BTNREPEATSTARTSPEED + BTNREPEATSPEED))
  64.       { // folyamatos ismétlés
  65.         BtnCount = BTNREPEATSTARTSPEED; // ismétlési kezdet idöpontja
  66.         Btn++; Btn++;                   // BUTTONxCMDREPEAT
  67.       }
  68.       else
  69.         Btn = 0;              // köztes idöpontokban ne adjon parancsot
  70.     }
  71.     else
  72.     { // vagy most lett lenyomva, vagy elözöleg másik volt lenyomva
  73.       if(BtnPressed == BUTTONBOTHCMDSHORT)
  74.         Btn = 0;              // kétgombos kezelés egyik gombja lett felengedve, nem ad parancsot
  75.       else
  76.       { // nem a kétgombos kezelés egyik gombja lett felengedve
  77.         BtnPressed = Btn;     // ezután ennek az ismétlését kell figyelni
  78.         Btn = 0;              // nem ad parancsot
  79.         BtnCount = 0;        // gombnyomási idö számláló = 0
  80.       }
  81.     }
  82.   }
  83.   else
  84.   { // nincs gomb lenyomva
  85.     if(BtnPressed)
  86.     { // most lett felengedve
  87.       if(BtnCount < BTNREPEATSTARTSPEED)// csak rövid ideig volt lenyomva? ( < BTNREPEATSTARTSPEED )
  88.         Btn = BtnPressed;     // Btn = BUTTONxCMDSHORT
  89.       else                    // sokáig volt lenyomva? ( >= BTNREPEATSTARTSPEED )
  90.         Btn = BtnPressed + 3; // Btn = BUTTONxCMDUP
  91.       BtnPressed = 0;         // következö lekérdezéshez
  92.       BtnCount = 0;           // gombnyomási idö számláló = 0
  93.     }
  94.   }
  95. }
  96.  
  97. void main(void)
  98. ...
  99.   GetButtons(); // gombok lekérdezése
  100.   if (Btn)
  101.   { // gomblenyomások feldolgozása
  102.     if(Btn == BUTTON1CMDREPEAT) ...
  103.     ...
  104.   }
  105. }
(#) fsub válasza foxi63 hozzászólására (») Jan 9, 2015 /
 
Értem, köszi a segítséget. Kipróbálom ezt a módszert is.
(#) fsub válasza benjami hozzászólására (») Jan 9, 2015 /
 
De jó, pont azon gondolkoztam, hogy ezt a hosszú gombnyomás lekezelését hogyan is lehetne megvalósítani, mindenképpen kipróbálom, csak át kell állítanom ehhez az agyamat C nyelvre.
Köszi neked is!
A hozzászólás módosítva: Jan 9, 2015
(#) Kapagerenda hozzászólása Jan 9, 2015 /
 
Üdv,
A switch operátor mire van? Ha valaki példán keresztül tudná bemutatni nekem megköszöném
(#) zenetom válasza Kapagerenda hozzászólására (») Jan 9, 2015 /
 
Szia,
Feltételes elágazás a C nyelvben. Itt találsz rá példát:
Bővebben: Link.
(#) vilmosd válasza Kapagerenda hozzászólására (») Jan 9, 2015 /
 
Altalaban tobbszalu elagazas feldolgozasara hasznaljuk. Alljon itt egy pelda nyomogomb bemenetek lekezelesere.
  1. #define butt_c1 1      
  2. #define butt_c2 2
  3. #define butt_c3 3
  4. #define butt_c4 4
  5. #define butt_c5 5
  6.  
  7. #define Butt1 0b00010000
  8. #define Butt2 0b00100000
  9. #define Butt3 0b01000000
  10. #define Butt4 0b10000000
  11. #define Butt5 0b10010000
  12.  
  13. #define Butt_MASK ((Butt1) | (Butt2) | (Butt3) | (Butt4) | (Butt5))
  14.  
  15.  
  16.  
  17. int botton( int in_butt)
  18. {
  19.  
  20.         switch ( in_butt & Butt_MASK )
  21.         {
  22.  
  23.     case Butt1:
  24.         return (butt_c4);
  25.         break;
  26.  
  27.     case Butt2:
  28.         return (butt_c3);
  29.         break;
  30.  
  31.     case Butt3:
  32.         return (butt_c2);
  33.         break;
  34.    
  35.     case Butt4:
  36.         return (butt_c1);
  37.         break;
  38.    
  39.     case Butt5:
  40.         return (butt_c5);
  41.         break;
  42.  
  43.     default:return (0);
  44.  
  45.        // no Botton or more Bottons
  46.  
  47.         }
  48. }

Ebben az esetben a fvenyt meghivjuk egy valtozoval, ami pl egy port allapotat tukrozi. amennyiben az allapot valamelyik #define allapotat tukrozi, a hozza tartozo ertekkel ter vissza, amennyiben nem akkor >>0<< ertekkel. Fontos a break; utasitas amely megszakitja a tovabbi kiertekelest es kilep a fvenybol. Ellenkezo esetben vegigfut a tobbi reszen is.
A hozzászólás módosítva: Jan 9, 2015
(#) vilmosd válasza zenetom hozzászólására (») Jan 9, 2015 /
 
Na itten szepen le van irva (rajzolva).
(#) killbill válasza Kapagerenda hozzászólására (») Jan 10, 2015 /
 
A switch az utasitas, nem operator. Az operatorok azok a "muveleti jelek" mint pl. az osszeadas vagy kivonas.
(#) adamhollos hozzászólása Jan 11, 2015 /
 
Hello!

Szóval felmerült egy kérdés. Újra kell ahhoz programozni a kontrollert, hogy a config biteket módosítsd?
Mert azt mondja az adatlap, hogy
Idézet:
„Placing the BOR under software control gives the user
the additional flexibility of tailoring the application to its environment without having to reprogram the device to change BOR configuration.”
Szóval akkor csak a Brown-out interface speciális és ezért nem lehet később újrakonfigurálni, vagy egyáltalán semmit sem tudunk újraprogramozás nélkül újrakonfigurálni (pl. watch dog)?
(#) Hp41C válasza adamhollos hozzászólására (») Jan 11, 2015 /
 
Egy PIC bármely programozható területén egy bit 1 értékről 0 értékre átprogramozható törlés nélkül. Vannak olyan típusok, ahol a konfigurációs szó tetszőleges más értékre is átírható. Ld DS70619A
(#) csiberaptor hozzászólása Jan 11, 2015 /
 
Hogyha azt szeretném, hogy egy bemenet logikai 1ről 0ra váltson nyomógomb nélkül, konkrétan egy vezeték elvágásával, akkor hogy lenne célszerű bekötni?
(#) Hp41C válasza csiberaptor hozzászólására (») Jan 11, 2015 /
 
A vezeték egyik vége egy port lábára, a másik vége a Vss -re van kötve. A port lába fel van húzva a Vdd feszültsége külső vagy belső ellenállással (Internal weak pullup). Alapállapotban a lábról alacsony szint olvasható, ha elszakad a vezeték a láb magas szintre kerül a felhúzó ellenállás miatt.
A hozzászólás módosítva: Jan 11, 2015
(#) kissi válasza Hp41C hozzászólására (») Jan 11, 2015 /
 
Fordítva akarja 1-->0, pedig így egyszerűbben/kevesebb alkatrésszel megoldható lett volna !

csiberaptor:
A vezetéket + 5V-ra kötöd és a lábhoz teszel egy lehúzó ellenállást ( pl. 4k7 ). Amíg a vezeték él, addid 5V van a lábon, ha elvágod, akkor 0 V lesz!
A hozzászólás módosítva: Jan 11, 2015
(#) Bakman válasza csiberaptor hozzászólására (») Jan 11, 2015 /
 
kissi leírása lerajzolva.
(#) csiberaptor hozzászólása Jan 11, 2015 /
 
Köszönöm szépen mindkettőtöknek.
(#) kapcsrajz hozzászólása Jan 11, 2015 /
 
Sziasztok !

Tulajdonképpen vicsys oktató videójához (gong hang előállító áramkör) lenne pár kérdésem.

setup_timer_2(T2_DIV_BY_16,236,1); //1,8 ms overflow, 1,8 ms interrupt

Itt a timernél hogy jön ki az 1,8 ms-um (tudom, hogy ez kb 528 Hz 1/528Hz az 1.8ms) de ebből ez miként következik: T2_DIV_BY_16,236,1

setup_ccp1(CCP_PWM);
set_pwm1_duty((int16)472);//528Hz

Itt hogy lett beállítva , hogy 50 százalék lett a kitöltési tényező ? (4 Mhz/16/472=528 Hz ez így ok ? ) A 4 Mhz a pic órajele.
Ha mondjuk 10 százalékos kitöltési tényezőt szeretnék akkor hogy fog ez kinézni ?
Köszi
(#) vicsys válasza kapcsrajz hozzászólására (») Jan 11, 2015 /
 
Egy kis segítség: Töltsd le a projektet és kukkants bele a main.h fájlba. Láthatod, hogy már 8MHz a belső órajel. Ha a varázslót használod, van beépített kis számító része, amivel egyszerű méretezni. A képlet is ott van, ha később változtatni kell és újraszámolni.

PWM.png
    
(#) adamhollos hozzászólása Jan 11, 2015 /
 
Sziasztok!

Van egy PICkit 3-am és próbálom rávenni, hogy tápfeszültségként adjon ki 5 V-ot, de csak 4.85 V van rajta (mikor mind a két láb szabadon lóg, nincs bekötve sehová). Leellenőriztem az USB tápfeszültséget is, de az OK (5.03 V) és ez egy USB 3.0-ás power port szóval 1 A-t simán le tud adni.

Van valami ötletetek, hogy mi a gebasz?
(#) kapcsrajz válasza vicsys hozzászólására (») Jan 11, 2015 /
 
Köszönöm ! Így már világos
(#) vicsys válasza adamhollos hozzászólására (») Jan 11, 2015 /
 
Azt nem tudom, hogy a PK3-nál is van-e teszt lehetőség. Ha igen, érdemes lenne lefuttatni.
(#) adamhollos válasza vicsys hozzászólására (») Jan 11, 2015 /
 
Nem nincsen, nem találtam semmit...
(#) ktamas66 válasza adamhollos hozzászólására (») Jan 11, 2015 /
 
A belső kapcsoló elemein (tranzisztor, FET ) esik ez a feszültség. Szerintem nincs semmi baja.
(#) Pali79 válasza adamhollos hozzászólására (») Jan 11, 2015 /
 
Eredeti Microchip?
(#) adamhollos válasza Pali79 hozzászólására (») Jan 11, 2015 /
 
igen
(#) adamhollos válasza ktamas66 hozzászólására (») Jan 11, 2015 /
 
Ha megpróbálom 5.5 V-ra állítani, akkor is csak 4+ V-ot ad és beszól, hogy
Idézet:
„PICkit 3 is trying to supply 5.500000 volts from the USB port, but the target VDD is measured to be 4.875000 volts. This could be due to the USB port power capabilities or the target circuitry affecting the measured VDD.”


+, ha csatlakoztatom a PIC-hez, akkor az 5 V-os beállításnál is siránkozik, hogy nem tudja kiadni a megfelelő feszkót.
A hozzászólás módosítva: Jan 11, 2015
Következő: »»   617 / 1210
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