Fórum témák
» Több friss téma |
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.
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?
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.
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
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).
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.
Valaki megmondaná, hogy ez mit jelent:
A +1 -et nem értem, hogy az micsoda.
Szia,
Szerintem a mögötte lévő regiszterrel hajtja végre a műveletet.
A KT_TMR3_FEL címnél eggyel magasabb címmel végzi el a műveletet a kontroller.
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?
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.
Esetleg ha egy konkrét példán tudnád ezt szemlélteni megköszönném
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.
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 ! ) !
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
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.
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.
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.
Most akkor mi a kérdésed ?!
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...
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.
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.
Köszi! Közben sikerült segítséggel kibogozni!
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.
Ha 0,6ms-onként akarok mintát venni,akkor a desired baud rate 1800?
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?
Ú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?
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
|
Bejelentkezés
Hirdetés |