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   585 / 1210
(#) Pali79 válasza vandorbot hozzászólására (») Okt 29, 2014 /
 
Szerintem olyan PIC-ben kell gondolkodni amiben van 3 különálló CCP modul. A fáziskülönbség állítás megoldását nem látom még. Az is kérdés, hogy milyen határok között szeretnéd állítani? A kijelző része nem annyira problémás, de annak is kell legalább 6 I/O láb.
(#) SKY hozzászólása Okt 29, 2014 /
 
Sziasztok! Én azt szeretném kérdezni, hogy egy adott késleltető utasítás (delay_ms) (a microC-ben) a valóságban is pontosan a megadott ideig "fut", vagy a tört eredményekre kijövő osztások és az összehasonlítás műveletei miatt előfordulhat, hogy ez az idő eltér egy bizonyos arányig? Példaként a 10ms-os késleltetés mondjuk +-10us eltéréssel tartható csak be?
(#) Pali79 válasza SKY hozzászólására (») Okt 29, 2014 /
 
A microC-t nem ismerem, de assembly-ben decfsz utasításokkal szokás késleltetni. Ugyebár 1 utasítás 4 órajel ciklus. Ebből következik, hogy minél nagyobb az órajel annál finomabban lehet szabályozni a késleltetést, de bele kell kalkulálni a kvarc átlagos 20 ppm-es hibáját is.
(#) matheattila válasza SKY hozzászólására (») Okt 29, 2014 /
 
Szia, én használtam régen a mikroC-t és eléggé pontos volt, azt már nem tudom, hogy pl az általad említett +-10us-nál több vagy kevesebb volt-e, mert nem volt fontos számomra. 10ms késleltetésnél ez a kis eltérés már semmi, ha a te esetedben mégis számítana akkor ott már ajánlott inkább Timer megszakítást használni, mert az a legprecízebb és ami a legfontosabb, hogy nem blokkolja a főprogramot mint delay függvények
(#) icserny válasza vandorbot hozzászólására (») Okt 29, 2014 /
 
Milyen pontossági igények vannak? Ha hardveres pontosság kell, akkor esetleg érdemes valamelyik motorvezérlésre kihegyezett mikrovezérlőt megnézni (pl. a dsPIC33FJ128MC802 egy a sok közül és a legelső Microstick is támogatja).
(#) vandorbot válasza icserny hozzászólására (») Okt 29, 2014 /
 
A 2. lábon kb. +90fok tól + 110 fok tartományban, min 0,5 fok felbontással.
A 3. lábon kb +180 fok tól + 240 fok tartományban. elég 1 fokos felbontás.
Nem a pontosság a fő, hogy mondjuk 96,76 fok legyen, hanem az, hogy ne mászkáljon programfutási hiba vagy hő miatt.
(#) Pali79 hozzászólása Okt 29, 2014 /
 
Valaki megmondaná, hogy ez mit jelent:
  1. SUBWF   KT_TMR3_FEL+1,F

A +1 -et nem értem, hogy az micsoda.
(#) zenetom válasza Pali79 hozzászólására (») Okt 29, 2014 /
 
Szia,
Szerintem a mögötte lévő regiszterrel hajtja végre a műveletet.
(#) nedudgi válasza Pali79 hozzászólására (») Okt 29, 2014 /
 
A KT_TMR3_FEL címnél eggyel magasabb címmel végzi el a műveletet a kontroller.
(#) Pali79 hozzászólása Okt 29, 2014 /
 
Köszönöm!
(#) Kapagerenda hozzászólása Okt 30, 2014 /
 
Hello!
Valaki eltudná nekem érthetően magyarázni mire jók a megszakítások. Használják őket időzítéseknél, kijelző vezérléseknél, de sajnos nem értem a lényegüket, hogy mire jók pedig elég fontosnak tünnek. Esetleg védelmi szerepük van?
(#) brato válasza Kapagerenda hozzászólására (») Okt 30, 2014 /
 
Bizonyos eseményeket nem kell folyamatosan figyelni programból, ha valamelyik bekövetkezik akkor automatikusan a megszakítási címre ugrik a program. Itt fel lehet dolgozni az eseményt.
(#) Kapagerenda válasza brato hozzászólására (») Okt 30, 2014 /
 
Esetleg ha egy konkrét példán tudnád ezt szemlélteni megköszönném
(#) nedudgi válasza Kapagerenda hozzászólására (») Okt 30, 2014 /
 
Félek, valamit félreértesz. Megszakítási kérelem akkor keletkezik, ha valamilyen periféria adatot tud forgalmazni a feldolgozó egységgel. Így a fő program futása megszakad, és a ki lehet szolgálni a perifériát. Ha nem megszakítással kezeljük a perifériát, a perifériakezelés csak akkor történik meg, amikor a főprogram "ránéz". Így adatot veszíthetünk, ezt kerüli el a megszakítások használata.
(#) kissi válasza Kapagerenda hozzászólására (») Okt 30, 2014 /
 
Szia!

Az a lényeg, hogy ha megszakítás nélkül akarsz pl. egy késleltetést, akkor csinálsz egy számláló rutint. Itt a processzor folyamatosan azt csinálja, hogy pl. növeli egy változó értékét eggyel és megvizsgálja a kapott eredményt, ha nem nulla, akkor újrakezdi. Ebben az esetben folyamatosan ezzel foglalkozik: növeli, vizsgálja és elölről kezdi, ezért nem tud közben mással foglalkozni ( alapesetben ! ). Ha használsz egy timert, akkor ott már "folyamatosan" foglalkozni vele, mert megadod a kezdőértékét és ettől kezdve automatikusan növeli az értéket ( a beállított órajeltől függően! ) és ha túlcsordul, akkor jelzi egy biten ( a megfelelő IF, pl. TMR0IF )! Itt már elegendő, ha normál programfutás közben "időnként" ránézel az IF bitre és ha jelez, akkor eltelt az idő ( közben "esetleg" mást is tudsz csinálni! ) ! Természetesen ez így nem tökéletes, hiszen nem biztos, hogy "rögtön" észreveszed a jelzést: na erre találták ki a megszakítást! Ha engedélyezed, akkor a TMR0IF bebillenése egy megszakítást vált ki, ami azt jelenti, hogy a program futása "felfüggesztődik" és elugrik egy előre meghatározott programhelyre az utasítás végrehajtás ( 18-as sorozatnál pl. a 0x08-as vagy a 0x18-as címre ! ) és az ott lévő programot kezdi el futtatni, így rögtön tudsz reagálni a megszakítás okára !
Remélem érthető volt ( nem biztos, hogy csak egyszer kell elolvasni !! ) ?!

Szerintem nagyon sokat tudsz tanulni, ha megnézel egy megszakításos programot szimulátorral és breakpoint használattal ( ha nem ismered eeket, akkor még ne a megszakítással kezdj ! ) !
(#) Kapagerenda hozzászólása Okt 30, 2014 /
 
Köszönöm a hasznos segítségeket! Szóval akkor amig dolgozik egy adott periféria addig a program más műveleteket is tud csinálni és a megszakításokkal tuggyuk egy adott érték elérésekor újra vezérelni a perifériát? Szóval lényegében a megszakítások segítségével párhuzamosan végezhetők műveletek a mikroprocesszoron belül?? Vagy valami ilyesmi
(#) Pali79 válasza Kapagerenda hozzászólására (») Okt 30, 2014 /
 
Idézet:
„Szóval lényegében a megszakítások segítségével párhuzamosan végezhetők műveletek a mikroprocesszoron belül??”

Nem! A processzor nem végez műveletet párhuzamosan ha a beépített modulok működésétől eltekintünk. Az utasításokat egymás után hajtja végre. Nagyon leegyszerűsítve ha van 100 utasítás, a végén kezdi elölről. Ha van egy megszakítási kérelem akkor a a program végrehajtása leáll és a megszakítási területen folytatódik. Ha végig csinálta a megszakítási programrészt, folytatja ahol a megszakítás előtt abbahagyta.
Megszakítást sok minden kiválthat, timer túlcsordulás, INT lábra adott jel stb.
Ajánlom figyelmedbe Topi Nulláról a robotokig című cikk sorozatát. A III. rész pont ezekkel kezdődik.
(#) benjami válasza Kapagerenda hozzászólására (») Okt 30, 2014 / 1
 
Megszakításkezelés a valós életben:
Tegyük fel, hogy dolgozol. Csörög a telefon. Felfüggeszted az addigi tevékenységedet, felveszed a telefont és megbeszéled amit kell. Leteszed a telefont, majd folytatod a munkád ahol abbahagytad. Egy idő múlva a hólyagod jelez, hogy megtelt (ez egy nem tiltható megszakításforrás). Felfüggeszted a munkát, kimész a WC-re, elintézed a dolgot, visszajössz, ott folytatod a munkát ahol abbahagytad.
Polling üzemmód: lenémítod a telefonod, mert zavar (tiltod a telefon megszakítás engedélyező bitjét). Időnként megnézed hívtak-e a telefonon. Ha hívtak visszahívod az illetőt.
Ugyanez játszódik le a processzorban is, csak a megszakítást valamelyik periféria fogja kiváltani. Természetesen van arra mód, hogy kiderítsük melyik periféria okozta a megszakítást és az a programrutin hívódjon meg, ami az adott perifériával foglalkozik.
(#) Kapagerenda hozzászólása Okt 31, 2014 /
 
Kösz! Még annyit nem értek, hogy miben különbözik ez a CALL által meghívott subrutin-tól. Például egy gombnyomásra szeretnénk előidézni egy másik műveletet és ez esetben a gombnyomás hatására MINDEGY, HOGY ÉPPEN HOL JÁR, MELYIK UTASíTÁSNÁL A PROGRAMUNK megszakítja a műveletet amin épp dolgozott és elkezdi csinálni azt ami a megszakításban van, majd ha befejezte visszatér oda ahol előzőleg abbahagyta. A Call esetében pedig ez így nem lehetséges mivel állandóan felkéne tüntetni ezt a Call utasítást egy feltétel segítségével, hogy bármikor (ha az eset megkívánja) átlehesenn lépni a subrutin-hoz.
(#) kissi válasza Kapagerenda hozzászólására (») Okt 31, 2014 / 1
 
Most akkor mi a kérdésed ?!
(#) vicsys válasza Kapagerenda hozzászólására (») Okt 31, 2014 / 1
 
Mivel a megszakítás, megszakítja az éppen végzett műveletet- illik nagyon gyorsan lekezelni. A gyakorlatban elég egy jelzőbitet átbillenteni és majd végrehajtani a hozzá tartozó utasítást. Ha ez tényleg jól van időzítve, úgy tűnhet, mintha egyszerre 2 dolog is egy időben futna. Szerintem erre gondoltál...
(#) Hp41C válasza Kapagerenda hozzászólására (») Okt 31, 2014 / 1
 
A megszakítás az elfogadásakor a következő végrehajtadnó utasítás címét a verembe teszi. Innen tudja, hogy melyik is az az utasítás, amivel folytatni kell a program végrehajtását. Mindegy, hogy hány eljárás hívás történt már, ha a maximális számot a megszakítással együtt nem haladjuk meg. pl. standart 16F -ek esetén a verem 8 férőhelyes, a megszakítás egyet elhasznál. Tehát összesen a főprogramból és a megszakításból hívott eljárások szintje nem haladhatja meg a 7 -et.
Még egy - két apróság, de igen fontosak:
A megszakítás soha nem hagy félbe processzor utasítást: pl: a decfsz variable,f esetén a csökkentés eredménye mindenképen bekerül a változóba, a döntés, hogy menne megy tovább a program megtörténik az elfogadás előtt.
A megszakítás is ugyan azokat az erőforrásokat használhatja, ami a kontrollerben rendelkezésre áll: (W és STATUS regiszter), ugyan azokból az utasításokból áll össze a kiszolgáló rutin is (kivétel a retfie). A megszakítási rutinban a (kényszerből) módosított regiszterek értéket (a felhasználás előtt) menteni kell és a visszatérés előtt a mentett értékeket vissza kell állítani.
(#) ktamas66 válasza Pali79 hozzászólására (») Okt 31, 2014 /
 
Ebben az esetben a KT_TMR3_FEL egy 32 bites szám (ha jól emlékszem), aminek a 4 byte-jára így hivatkozok, hogy KT_TMR3_FEL, +1, +2, +3.
(#) Pali79 válasza ktamas66 hozzászólására (») Okt 31, 2014 /
 
Köszi! Közben sikerült segítséggel kibogozni!
(#) Bell válasza Kapagerenda hozzászólására (») Nov 1, 2014 / 1
 
A perifériákat (A/D, TIMER, stb.) elég a program elején beállítani, attól kezdve - függetlenül a többitől - mindegyik önállóan végzi a dolgát. A működésük azonban egy eredményt ad, amire szükségünk van. Ekkor az adott periféria bebillenti a megfelelő bitet, jelzi, hogy végzett a feladattal. Ezt praktikusan lehet megszakítással kezelni.
A megszakítás során ezt a jelzőbitet törölni kell, ezzel nyugtázzuk, hogy tudomásul vettük és további megszakítások is lehetségesek.
Egy időzítést megvalósíthatsz program futtatásával, vagy TIMER-el, az eredmény nagyon hasonló. De ha időzítés közben lenne más teendő is, akkor célszerű a megszakítást választani.
(#) patrik81 válasza Hp41C hozzászólására (») Nov 1, 2014 /
 
Ha 0,6ms-onként akarok mintát venni,akkor a desired baud rate 1800?
(#) Hp41C válasza patrik81 hozzászólására (») Nov 1, 2014 /
 
Nem értem a kérdést.
(#) Pali79 válasza Hp41C hozzászólására (») Nov 1, 2014 /
 
Amikor a megszakítás elején elmentem a W és a STATUS tartalmát itt jó a movfw és a movwf használata?
Még azon gondolkodtam, hogy ezt a ccp- vel megvalósított mérést jó, hogy megszakítással kezelem? Gondolok itt arra, hogy ha a már meglévő adattal számol és közbe jön a megszakítás ami felülírja a regiszterek értékét akkor elrontja a számolást. Ebből a szempontból nem lenne célszerűbb pollinggal megvalósítani?
(#) patrik81 válasza Hp41C hozzászólására (») Nov 1, 2014 /
 
Úgy gondolom,hogy a desired baud rate-et is számolni kell,de hogy?1000/0,6=1666,67 és ez 1800-hoz esik közel?Esetleg a 2400-hoz,mert a PIC ezt értelmezi?
(#) Hp41C válasza patrik81 hozzászólására (») Nov 1, 2014 /
 
Még mindig nem értem...
Milyen frekvenciájú órajelle járatod a 16F690 -t? Legyen 20MHz. Milyen sebességgel szeretnél kapcsoaltot a soros vonalon? Szabványos sebességet kellene választani: 4800, 9600, 19200, 38400. Magasabbat a PICkit2 nem kezel. Legyen 9600. kb. 4% -nál kisebb hiba megengedhető.
Be kell állítani a Baud generatort:
Adatlap Table 12-5:
SYNC = 0, BRGH = 1, BRG16 = 0 szerint 9600 Baud helyett 9615, a hiba 0.16% SPBRG = 129
SYNC = 0, BRGH = 0, BRG16 = 1 szerint 9600 Baud helyett 9615, a hiba 0.16% SPBRGH = 0, SPBRG = 129
stb.
A TX és RX lábakat digitálisra és bemenetnek kell állítani. Fel kell programozni az EUSART -ot.
Küldésnél meg kell várni, hogy PIR1 TXIF bitje 1 legyen, be kell írni a küldendő karakter kódját a TXREG be.
A PICkit2 UART tools képén látható a bekötés.
A hozzászólás módosítva: Nov 1, 2014
Következő: »»   585 / 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