Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Nagyon köszönöm a segítségedet. Mostmár működik.
Megpróbálom...
Tehát a 4 Mhz es órajelet osztom 4 el, (ez a TIMER 1 órajele) ezt osztom a TIMER 1 modul maximálisan beállítható osztásával 8 al, ezt pedig elosztom a 65536 al ami ha jól sejtem az az érték amikor a TIMER1 túlcsordul. (16 biten a maximálisan ábrázolható érték a D '65535 ') Az eredmény 1,9073486 . 1 / 1,9073486 = 0,524288 sec azaz 0,5242880 másodpercenként csordul túl a TIMER1 a maximális (8) osztásnál ha jól számoltam. A 24 óra alatt 164794 szer fog túlcsordulni a TIMER1
Köszi, de itt el is akadtam. Lehet hogy nem látom a fától az erdőt, de hogyan tovább?
Én arra gondoltam hogy ezt a 0,524288 sec es jelet használnám a TIMER0 órajeleként a külső órajel bemenetén keresztül, ezzel léptetném felfelé. Ebben az esetben a TIMER0 nál beállítható maximális 256 os osztásnál a 643 az az érték amit el kell érjen a számláló a 24. óránál. Jó ez így vagy másképpen kell ezt megoldani? Ti hogyan csinálnátok?
Fogsz egy változót, amit minden timer megszakításnál egyel megnövelsz. Amikor ez a változó elért egy bizonyos értéket, akkor végrehajtod, amit időzíteni akarsz, és nullázod a változót.
Pedig a továbbiakat is leírtam! (jelzőbit, számláló stb.) Kérdezz, mit nem értesz belőle. (potyo beelőzött )
Tehát van a TIMER1 flagje ami minden túlcsorduláskor jelez. Ezt a bitet pollozom és ha jelez akkor növelem (INCFSZ) a változót ahogy potyo írta. Ez a változó egy ideiglenes regiszterbe írt érték lehet gondolom, pl D'000' ról indulna.
De nekem 164794 ig kell elszámolnom. Ekkora számot hogyan ábrázolok 8 biten? Ez nem tiszta, meg az hogy hogyan lehet figyeltetni azt ha elér a számláló egy bizonyos értéket.
Vagy még az jutott eszembe hogy lefelé csökkentem a számlálót és ha alulcsordul akkor lekezelem a jelzőbitjét, de akkoris bajban vagyok a 164794 el...hogyan írom be ezt a regiszterbe? Ekkora értéket fel sem vehet. Kezdek öszekeveredni....
Több egy bájtos regiszterre kell bontani.
T1, T2, T3 stb... Először csökkented a T1-et. Majd ha DECFSZ-el megvizsgálva 0, akkor ugrasz a következő számláló részre (és újra 255-öt írsz a T1-be), ami csökkenti a T2-t... Ha az is 0, akkor ugrasz a hármashoz. Három byte-al ez kivitelezhető assembly-ben igen könnyen. Lépcsőzetesen kell csökkenteni az értékeket.
Vedd le az INTOSC-ot 31k-ra... Ha mast kozben nem kell csinalnod akkor azzal meg aramot is sporolsz - szamold at termeszetesen mennyit csordul tul 1 nap alatt... Ha meg kevesebb aram kell akkor lehet orakvartz-al probalkozni ugyanigy timer1-en logva, kozben altatva a procit...
Ez okos ötlet... Járasd a timert külön külső 32.768KHz-es kristályról... Nem lesz kerekítési hibád, halál pontosan lehet leosztani 1mp-re.
Köszi, akkor ez olyasmi mint a várakoztatás, csak ott nem a jelzőbit vezérli a léptetést hanem GOTO val van megoldva. Vagy hülyeséget írok...?
Ez 16 biten sem fér el, ehhez 24 bitre van szükség.
SZAM_L SZAM_H SZAM_U Ezt kell lefuttatni, amikor a timer túlcsordult:
Topi / Trudnai
Köszönöm, lassan elveszek az ötletekben. Az órakvarcos megoldás is tetszik de nem kell ekkora pontosság, Az áram nem lényeg (hálózati cucc lesz) megteszi az INT. OSC is. Egész 5let gyűjteményem lett hirtelen. Ezen a Watt féle megoldáson azért keresztül megyek ha már belemélyedtem, nem árt összebarátkoznom a TIMER ekkel. Nektek is köszönöm az 5leteket.
A gyakorlatban egyszerűbb kódot szokott eredményezni, ha a számlálót a kezdetkor a kívánt értékre állítjuk be, és nulláig csökkentjük.
A nullával egyenlőség ellenőrzése mindössze annyi, hogy az összes számlálóbyte-ot OR kapcsolatba hozzuk, majd az eredmény nulla voltát ellenőrzünk.
Ugyanugy timert kell hasznalnod csak mivel a timer1 frekvenciajat levettuk, ezert ez a keplet:
Idézet: „Ezt így lehet kiszámolni 4MHz-es kvarcnál: 1/(4000000/4/előosztó/65536)=sec” atalakul: Ezt így lehet kiszámolni 32kHz-es kvarcnál: 1/(32768/4/előosztó/65536)=sec A belso intosc (ha olyan a PIC-ed, hogy le lehet venni kisebbre mint a 4MHz) az 31k, ezert nem pontos, de nem kell hozza kulso kvartz. Csupan ennyit javasultunk Topival
Hűű... nagyon köszönöm a segítséget, kezd tisztulni a kép. Tanulmányozom a példádat, de így már azért mindjárt világosabb a dolog. Tehát a 164794 hexa alakját három részre L / H / U ( 02 / 83 / BA ) ra bontottad..zseniális, sosem jutott volna magamtól eszembe. Köszönöm. :yes:
Köszi, a 10F206 ot nézegettem, de abban csak TIMER0 van, marad a 12F675 az van itthon, de abban úgy tudom nem lehet alacsony frekvenciájú oszcillátort beállítani. Talán az F628 ban, sebaj az is van...
Még egy kérdés, csupán a kiváncsiságtól hajtva. Várakoztatással el lehet érni ekkora (24 óra vagy akár nagyobb, több napos esetleg hetes) késleltetést? Tudom hogy pazarló és nem jó / nem elegáns megoldás, hiszen lefoglalja az egész mikrovezérlőt üres utasításokkal, csak az érdekel a várakoztatásnak vannak e határai?
Világos, hogy érdemes valamilyen timert használni, én a 2 vagy 3 byteos számlálóláncokhoz írtam, hogy talán célszerűbb csökkentgetni, mint növelgetni.
Egyébként nemrég készült el egy 1 órás telefonidőzítő, ami a telefon felvételekor indul, és egy táblázatban megadott minta alapján még bele is csipog a vonalba, hogy a telefonáló észbe kapjon, hol tart az egy órán belül. Az óra végén meg egyre idegesítőbben kezd csipogni, hogy fejezze be már, ugye 1 óra után már számolják a hívásdíjat. Ez a kütyü 12F510-zel készült el, timer0-val állítok elő 2000/sec tick-et, és ehhez van a csipogás 1000Hz-e is meg a másodpercek számlálása is szinkronizálva. Itt is már 2 vagy 3 byteos számlálólánc kellett. Frekimérővel és tesztprogival kalibrált belső oszcillátorról jár, az egy óra alatt pár másodperc eltérésnél nem lehetett jobbra beállítani az OSCCAL-lal.
A határ az, hogy az összes memóriát elhasználod a várakozás változói számára.
Idézet: „csak az érdekel a várakoztatásnak vannak e határai?” Persze, en pl eleg turelmetlen ember vagyok De komolyra forditva a szot: a korlat a memoria... Ha nem eleg a 24 bites, hasznalsz 32 bitest, ha az sem eleg, akkor 48-ast es igy tovabb. Linux/Unix rendszereknel masodpercben tartjak nyilvan az idot 1970. Jan. 1-tol szamaolva... 32 biten... 2038-ban ugyanazok a problemak lepnek fel mint a Win-es es legtobb rendszerben 2000-ben volt. De itt addigra mar minden 64 bites lesz, namost (2038-1970)*65536 ev mire az tulcsordul Unix time Year_2038_problem
Nem, nincsenek, ha elég hosszú szót használsz a számábrázolásra, akkor akármekkora idő elérhető az érték visszaszámolással, mint várakoztatással.
Érdemes azért a legbelső ciklust valamihez szinkronizálni, mint ahogy írtam az előbb, nálam a 2000/sec timer0 túlcsordulások adják az időzítés alapját.
OFF
Windóz 32 biten számolja a hálózati kapcsolaton átment bájtok számát. 4giga után indul nulláról. Nemtudom, 64 bites windózok hogy csinálják, de a 32 bitesbe is tehettek volna ide nagyobb változót Sőt valamelyik netszolgáltatónál meg a statisztikában olykor előfordult negatív érték is. Azok meg előjeles 32 bites ábrázolást írtak
Csak tisztázás képpen, hogy ne vesszél el, ami eddig itt elhangzott, az mind egybevág, csak árnyalatnyi eltérések vannak, hogy a dolog jobbá váljon. Tehát amit én írtam az ennek az eleje, a többi a folytatása.
Valóban jó ötlet a 31K-s INT osci, mert 2 bájton fog elférni a szám(5141, ha jól számoltam 32768-al) A növelsénél, vagy csökkentésnél figyelni kell a Carry-t és ha van, akkor a másik bájtot is csökkenteni, ill. növelni kell. Talán a csökkentés az ésszerűbb, de igazából tök mindegy.
Ok, értem. Még egyszer köszönöm mindenkinek a segítséget, most már valahogy megoldom (ha már potyo megírta helyettem a teljes időzítő programot... de persze nem ez volt a cél. ) a problémámat. Főleg a nagy számok lekezeléséval voltam bajban, nem értettem hogyan oldjátok meg. Tényleg nagyszerű megoldás.
Sziasztok!
Meg tudnátok mondani hogy az EW16400YMY típusú LCD kijelző lehet-e 4biten vezérelni vagy nem? |
Bejelentkezés
Hirdetés |