Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Ezt megértem, de akkor kérdezned kellett volna, és nem elmenni mellette!
Ha most sem értenél valamit a CCP-vel kapcsolatban, akkor első körben az adatlap ábráit ajánlom figyelmedbe, majd jöhetnek a kérdések! Megjegyzem nem csak így lehet ezt megoldani, de szerintem így a legegyszerűbb és a legelegánsabb. Az erőforrásokat is így terheled vele a legkevésbé. Fontos még egy jó koncepció kialakítsa is, mert különben csak a levegőbe csapkodunk!
A legtöbben az assemlert és a C18-at ismerik és használják. A többit kevesen és olyanok, akik szintén kérdeznek inkább! Talán ez nem véletlen!
Nem baj. ASM-et lehet hívni benne. Csak akkor nagyon kell figyelni, mit hova pakol a progi. A szimulátor ebben szintén sokat segít.
CCP-t keresem.
Hali!!!
CCP-vel, timerek-kel és a PIC egyéb perifériáival kapcsolatban van egy egész jó magyar leírásom!!! Hátha segíteni fog vmit! (remélem sikerült csatolnom)
Akkor megint kérdezek.
Ha RB0-t használok, az mennyiben más, mint ccp. Azt látom hogy CCP-t tudom állítani, felfutó, lefutó, 4, 16 ciklus, stb. De RB0 megszakítására rátéve, és kiolvasva TMR1-et más az érték? Gondolom pár ciklus, amíg kiolvassa, de az mindig ott lesz az elején, tehát az eletelt idő szempontjából "lényegtelen".
A kulonbseg az, hogy egyik esetben felprogramozod a felfutas/lefutas idoziteset es tobbet nem kell piszkalnod csinalja magatol, mig a masik esetben foglalkoznod kell vele hogy mikor kapcsolod be, mikor ki stb... van, hgy egyik, van, hogy masik a celravezeto modszer.
De ha mar norby1 megadta azt a leirast, azon keresztul ratalaltam a szerzotol egy masikra, ami egy 16F84 teljes leirasanak tunik - nem neztem meg tuzetesebben, de magyar nyelvu es ezt szerintem at kellene olvasni - es ne add fel ha elsore nem erted, olvasd el megegyszer, nezz ki peldat az adott reszhez a netrol, es ha vegkepp elakadtal akkor itt segitunk. PIC16F84_hun.pdf
Csak trudnai-t kiegészítve, a CCP modul a megszakításkor a Timer1 számlálót(16bites) áttölti hardveresen a saját két regiszterébe, ahonnan ráérsz kiolvasni. Eközben megszakítást is okoz, ha meg van neki engedve. Tehát ha CCP megszakítás érkezik, akkor lekezeléskor csak a CCP regisztereit kell eltárolni, majd a következőnél kivonogatni, és már is megvan a kétbájtos arányos értéked, ami igaz hogy túl pontos, de ez legyen a legnagyobb bajod. Legfeljebb csak a felső bájtot dolgozod fel.
Feladat: Ha a felső bájtot kezeled csak, akkor mekkora lesz a felbontás mS-ben? (4MHz kvarc, 125KHz Timer1 órajel. ....csak a példa kedvéért, de lehet akár a gyakorlatban is ennyi.)
2ms?
És 8-as prescaler.
Igen.
A dolog szépséghibája, hogy ez kerekített érték, ezért ha pontos eredményt akarnánk, akkor 2048uSec-el kéne számolni. pl. A beszámolt érték 100, akkor ez 200msec(2ms kerekítéssel számolva). De valójában 100*2048/1000= 204,8 => 205msec Végül is nem sok a hiba, de az se gond, ha szorzunk, osztunk rendesen. Matek rutinokat találsz az oldalamon, igaz, hogy asm-ban. Ha meg nem asm-ban írod, akkor meg nem gond a matek.
Irdd le reszletesen hogyan szamoltad ki... es akkor ra fogsz jonni miert nem jo...
1/125000
0,000008, de ha levesszük a 4 bitet, akkor 256-szor pontatlanabb lesz. 0,002048us->2ms
Ezért kell 4.096-os osc.
Na, ez mar jobb, csak nem ertem a 4 bitet, jol szamoltal, akkor miert nem 8? A masik, hogy nem 0.002048us, hanem 2048us - csak rossuzl irtad, tudom, csak alkalomadtan zavaro lehet, hogy most nanosececben gondolkodsz-e...
Gombnyomasos kiserletednel amugy ez a kis elteres meg nem szamit, hogy 2ms vagy 2048us, lehet talalni olyan alkalmazast boven ahol egy ilyen kis elteres is mar problemakhoz vezethet. En is mondhatok akkor mar feladatot? Csinalj egy olyan idozitot ami egeszen pontosan 10ms-et var (10000us). Ugyanazok a parameterek, mcu 4MHz-es FOSC-al, es timer1 125kHz-el...
Peldaul... es akkor mar ki is talaltad, hogy miert hasznalnak pontosan 32768Hz kristalyt ora alkalmazasokhoz. Es akkor ennek mar csak egy ujjgyakorlatnak kell lennie: A timer1 felso ertekenek mennyinek kell lennie, hogy pontosan 1mp-et kapj ha timer1-en egy ilyen kvartz van (es nincs oszto, azaz 1:1)? Hogyan mersz vele 0.1mp-et?
ok, 8
Nem nagyon láttam ilyen értékű kvarcot, de nem is kell. A számolás olyan gyorsan megvan, hogy nem ér annyi forintot ez a speciális kvarc! :felkialtas:
Viszont meg kell hagyni, egész jól érted a dolgot! Ennek örülök. A megszakítás kezeléséről vannak elképzeléseid? Érdekes, de asm-ban a megszakítás kezelése könnyebb, mint C-ben vagy más nyelvben. Mondjuk az elemi dolgok is, csak a matek nem. Keverni meg nagyon ingoványos, hamar elszáll az egész.
80
0,1-et még átgondolom, mert alapban csak pontatlanul.
h80 ..
Igy van Megy ez latod? Nem is annyira nehez - a 0.1, meg a 10ms az mar eleg borzalmas, persze minden megoldhato... Azokkal csak azt akartam szemleltetni, hogy vannak dolgok ahol vagy raaldozol jo sok munkat, vagy el kell fogadni egy megkozelito erteket mert nem szamit ugy sem. Alkalmazastol fugg emgint csak, pl LED-nel edesmeindegy 1mp-kent vagy 1.25-onkent villog, a lenyeg hogy kb ilyen sebesseggel villog es a jatekos boldog
A L...xben 40Ft körül lehet venni 3.2768MHz-es és 4.096Mhz-es kvarcot is, de ma voltam a Mikr...llben (ahol egy USB-B csati 120Ft), és ott is van, igaz, 3x-os áron. Szóval van, és nem 800-1000Ft, ahogy az 1.000MHz-es kvarc.
+1200Ft postaköltség! De egyébként megleptél!
A privátra válaszolj kérlek! Nem baj, ha azt írod, hogy bocsi nem!
Sziasztok !
Szeretnék egy nagyon egyszerű működést mevalósítani 12F675 el, csak nem tudom hogyan fogjak hozzá. Azt szeretném hogy ha a bemenetét "L" re húzom és ott tatom akkor a kimenet billenjen be "X" időre "H" ba, aztán vissza. Ha a bemenetet visszaengedem "H" ba akkor ugyanez a kimenet ugyanígy reagáljon. Az tiszta hogy megszakítással ez megoldható, de hogyan lehet megoldani hogy a bemenet mindkét állapota megszakítást okozzon? Mert vagy H ra vagy L változásra tudom beállítani. Vagy két bemenetet használjak megszakításra és a lábakat úgy beállítani állítani hogy az egyik láb H ra a másik L re adja a megszakítást? ha a bemenetet megszakításban (földrehúzva) tartom, akkor hogyan törölhető a flagje? Hogyan lehet ezt a legegyszerűbben megoldani PIC el? Tudom ezt simán meg lehet csinálni pár db 2 inputos NAND kapuval, csak mindez kicsiben kéne, külső RC elemek nélkül amik csak a helyet foglalják....
Egyetlen lábra engedélyezed az Interrupt-On-Change megszakítást. Amikor az jött, akkor feltöltesz egy timert kezdőértékkel, és elindítod, meg persze odabillented a kimenő lábat, ahova akarod. Amikor a timer túlcsordul, akkor a kimenő lábat megint billented, ahová akarod.
Megszakítási rutinba sosem teszünk várakozást!
Szia Menyus,
Mennyire kicsiben? Egy 10F200 tokeletesen alkalmas erre a feladatra, azt lehet kapni SOT23-6 csomagolasban is mar (2.5x3mm). Az egy baseline cucc, nincs benne interrupt, de ehhez, ha csak ennyi a feladat felesleges is. Pollozod az inputot ami kb 3us ciklusido, mikor magasba megy at, akkor magasba billented a kimenetet + varsz ciklussal ameddig kell, majd kibillented es elkezded megint pollozni az inputot mikor megy at alacsonyba es ujra eljatszod a bebillent-var-kibillent jatekot... Tenyleg nem bonyas ezt megvalositani ezzel a mutyurrel - en ket csatornas digitalis szurest csinalok ezekkel.
Köszi, még egy láma kérdés ...Ez a "pollozás" ez hogyan valósítható meg? Van erre vonatkozó utasítás? Hogyan megy ez? 10F??? van itthon csak egyelőre az SMD marker ját nem sikerült megfejtenem. "067R" van ráírva a tokra. Most keresem az adatlapban de nem igazán találom sehol.
Potyo ! Megszakításban miért nem szerencsés várakozást használni? ÍMiért jobb a timer? Én egy várakoztató rutinra gondoltam ami a regiszter mentések és a kimenet átállítása után lefut, utána visszabillentem a kimenetet visszatöltöm a regisztereket és "retfie" Ez miért nem jó?
Azért, mert amíg a kontroller a megszakítási rutinban tartózkodik, addig a többi megszakítás kiszolgálása le van tiltva, így azokat adott esetben nem kezeli le időben. Pl. várakozol, de közben a soros porton jön adat, amit nem kezelsz le időben, és így elveszhet. A konkrét feladatban ugyan nincs ilyen, de tessék megszokni, hogy a várakozásokat mellőzzük, főleg a megszakítási rutinokban. Azért vannak a timerek, hogy azokkal időzítsünk.
Értem , köszi. Azért gondoltam erre a megoldásra mert csak egy megszakítást használok, és van megírt várokozó rutinom. De igazad van, a TIMER ekkel is össze kell barátkoznom, de egyelőre még a megszakítással is bajban vagyok...még a múltkori sem jött össze.
Nezd meg az adatlapjat (DataSheet) Table 14-2. A 06 az a tipusa, a masik ket dolog az evre vonatkozik amikor gyartottak (most meg ne kerdezd akkor a 7R az milyen ev...) 06 --> 10F206, az is jo neked erre a feladatra...
Pollozas: Nem, nincs ilyen utasitas, ez egy nez a technikara. Nem tudom magyarul mi a megfeleloje, idoszakos lekerdezest jelent, tehat amikor egy ciklusban allandoan megnezed, hogy az adott esemeny bekovetkezett-e mar. Ciklusban kozben csinalhatsz mast is, csak minel tobbmindent csinalsz kozben annal lassabban fogod lekerdezgetni az esemenyt. Ezt barmilyen nyelven meg lehet valositani, az esemenytol fugg, aminek a valtozasat figyeled, hogy mit kell csinalnod a valtozas lekovetesere. Van un. "tight loop", megintcsak nem tudom mi a magyar megfeleloje - szoros ciklus vagy szoros hurok? Szoval ott a ciklusban nem csinalsz semmit, arra koncentralsz, hogy minel hamarabb elkapd a valtozas kezdetet. Pl Te esetedben assemblyben 1 utasitas, hogy megnezd meg mindig alacsony-e a bemenet, es 1, hogy erre az utasitasra vissza ugorj. Az ugras 2 ciklusido, igy jon ki a 10F 4MHz-es belso orajelebol adodoan a 3us polling time (tehat max ennyi a kesleltetesed). Interruptos megoldasnal is van kesleltetes, ott egyreszt van egy ami az interruptot kivalto ok es az interrupt vektorra torteno ugras kozott telik el. Masreszt az interrupt vektorban lehet mast is akarsz csinalni, azonkivul el akarod menteni a munkaregisztert es egyeb dolgokat, hogy mikor interruptbol vissza tersz ne okozzon problemat vagyis a foprogram eszre se vegye a megszakitast.. Ez altalaban konstans ertek, de ha erre alapozol akkor fejlesztes kozben ugyelned kell arra is, hogy ez a resz, ami elmenti a pillanatnyi kontextust, ill ami eldonti melyik interrupt kezelo rutin kell az a resz ne valtozzon vagy ezeket is figyelembe kell venni ha szamolsz ezekkel az idokkel. Interruptozas mar halado technika, ezert nem szoktam javasolni csak gyakorlottabb PIC-eseknek.
trudnai!
Végigolvastam itt a menyus kérdésétől a hsz-eket, és neked lesz igazad(függetlenül attól, hogy az eddig elhangzottak igazak, csak ehhez a feladathoz nem illenek.) Szóval én is amondó vagyok, hogy abban az esetben ha semmi mást nem kell csinálni, mint ami elhangzott menyustól, akkor nem kell megszakítás, sőt ahogy írod, még több idő veszne el a mentésekkel, kértékelésekkel, mint ciklusban folyamatosan figyelve a lábat. Ezért én is ezt a megoldást ajánlom menyusnak. Viszont van egy kérdés, ami érdekes lehet! menyus! Lehet olyan, hogy két jel ékezése között kevesebb idő fog eltelni, mint a rá adott jel időtartama? Mert az bonyolítja kérdést. Ha ilyen nem fordulhat elő, akkor a program nagyon egyszerűen megoldható!
Koszonom watt!
Es ahogy irod az interruptozas jo modszer csak ebben az esetben kicsit tul nagy erolkodesnek erzem. A jelek idoziesi kerdese pedig jogos, mondjuk inkabb, hogy pontosan kellene specifikalni mi az elfogadott input, es arra mi az elvart putput es akkor rogvest kiderul mi a celravezeto megoldas. |
Bejelentkezés
Hirdetés |