Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   157 / 1320
(#) VrGakos válasza Topi hozzászólására (») Feb 17, 2008 /
 
Nagyon köszönöm a segítségedet. Mostmár működik.
(#) menyus válasza watt hozzászólására (») Feb 17, 2008 /
 
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

(#) potyo válasza menyus hozzászólására (») Feb 17, 2008 /
 
(#) menyus válasza potyo hozzászólására (») Feb 17, 2008 /
 
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?
(#) potyo válasza menyus hozzászólására (») Feb 17, 2008 /
 
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.
(#) watt válasza menyus hozzászólására (») Feb 17, 2008 /
 
Pedig a továbbiakat is leírtam! (jelzőbit, számláló stb.) Kérdezz, mit nem értesz belőle. (potyo beelőzött )
(#) menyus válasza watt hozzászólására (») Feb 17, 2008 /
 
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.
(#) menyus válasza menyus hozzászólására (») Feb 17, 2008 /
 
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....
(#) Topi válasza menyus hozzászólására (») Feb 17, 2008 /
 
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.
(#) trudnai válasza menyus hozzászólására (») Feb 17, 2008 /
 
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...
(#) Topi válasza trudnai hozzászólására (») Feb 17, 2008 /
 
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.
(#) menyus válasza Topi hozzászólására (») Feb 17, 2008 /
 
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...?
(#) potyo válasza menyus hozzászólására (») Feb 17, 2008 /
 
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:
  1. NOVELES
  2.         INCF    SZAM_L, F       ; Növeljük az alsó bájtot
  3.         BTFSS   STATUS, Z       ; Ha még nem ért el 256-ra (0-ra)
  4.         GOTO    NOV_VEGE        ; Akkor a középső bájtot nem bántjuk
  5.         INCF    SZAM_H, F       ; Ha a SZAM_L elért 256-ra, akkor egyel növeljük a középső bájtot
  6.         BTFSS   STATUS, Z       ; Ha még nem ért el 256-ra
  7.         GOTO    NOV_VEGE        ; Akkor a felső bájtot nem bántjuk
  8.         INCF    SZAM_U, F       ; Ha a SZAM_H elért 256-ra, akkor egyel növeljük a felső bájtot
  9. NOV_VEGE
  10.  
  11. TESZT
  12.         MOVF    SZAM_L, W       ; Alsó bájtot W-be töltjük
  13.         XORLW   0xBA            ; megnézzük, egyenlő-e 0xBA-val (d'164794'=0x0283BA)
  14.         BTFSS   STATUS, Z       ; Ha igen, akkor átugorjuk a következő parancsot
  15.         GOTO    TESZT_VEGE      ; Ha nem egyenlő, akkor máris vége a tesztnek
  16.         MOVF    SZAM_H, W       ; Ugyanaz a középső bájtra
  17.         XORLW   0x83
  18.         BTFSS   STATUS, Z
  19.         GOTO    TESZT_VEGE
  20.         MOVF    SZAM_H, W       ; Ugyanaz a felső bájtra
  21.         XORLW   0x02
  22.         GOTO    TESZT_VEGE
  23.         CLRF    SZAM_L          ; Nullázzuk a bájtokat
  24.         CLRF    SZAM_H
  25.         CLRF    SZAM_U
  26.         CALL    ESEMENY         ; Meghívjuk az esemény kezelőjét
  27. TESZT_VEGE
(#) menyus válasza trudnai hozzászólására (») Feb 17, 2008 /
 
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.
(#) szilva válasza potyo hozzászólására (») Feb 17, 2008 /
 
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.
(#) trudnai válasza szilva hozzászólására (») Feb 17, 2008 /
 
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
(#) menyus válasza potyo hozzászólására (») Feb 17, 2008 /
 
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:
(#) menyus válasza trudnai hozzászólására (») Feb 17, 2008 /
 
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...
(#) menyus hozzászólása Feb 17, 2008 /
 
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?
(#) szilva válasza trudnai hozzászólására (») Feb 17, 2008 /
 
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.
(#) potyo válasza menyus hozzászólására (») Feb 17, 2008 /
 
A határ az, hogy az összes memóriát elhasználod a várakozás változói számára.
(#) trudnai válasza menyus hozzászólására (») Feb 17, 2008 /
 
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
(#) szilva válasza menyus hozzászólására (») Feb 17, 2008 /
 
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.
(#) szilva válasza potyo hozzászólására (») Feb 17, 2008 /
 
Jogos, ez a fizikai határ
(#) potyo válasza trudnai hozzászólására (») Feb 17, 2008 /
 
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
(#) watt válasza menyus hozzászólására (») Feb 17, 2008 /
 
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.
(#) menyus válasza szilva hozzászólására (») Feb 17, 2008 /
 
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.
(#) VrGakos hozzászólása Feb 17, 2008 /
 
Sziasztok!
Meg tudnátok mondani hogy az EW16400YMY típusú LCD kijelző lehet-e 4biten vezérelni vagy nem?
(#) szilva válasza VrGakos hozzászólására (») Feb 17, 2008 /
 
Ez alapján azt mondom, hogy igen:

Bővebben: Link
(#) VrGakos válasza szilva hozzászólására (») Feb 17, 2008 /
 
Köszönöm válaszod. De lenne mégegy kérdésem:
HD44780-as chip is van benne, mert nem nagyon akar működni.
Következő: »»   157 / 1320
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