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. ![]()
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
![]() 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.
![]()
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 ![]() ![]()
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...
![]() ![]()
Sziasztok!
Meg tudnátok mondani hogy az EW16400YMY típusú LCD kijelző lehet-e 4biten vezérelni vagy nem? |
Bejelentkezés
Hirdetés |