Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Nincs valami infó az építőtől, ahonnan a forrás származik, hogy milyen konfig kell? Nem hiszem, hogy csupa 1-es!
Vaklárma!
![]() WDT on, minden más Off, és RC oszci. Ez bizony 0x3FFFh
Nekem ez sem tetszik a kodban:
Minimum egy NOP-ot tennek a ket port cimzes koze (es mindenhova a kodban ahol ket egymast koveto port cimzes van - ugyanarra a portra)
Lényeg, hogy a konfig jól van beállítva a belinkelt kapcsoláshoz, azaz működni fog a PLL áramkör, ha megépíted és az égető is jól működik.
Egyébként jó kis kapcsolás, még hasznos lehet. Tovább lehetne bővíteni egy LCD, vagy 7szegmenses LED-es kijelzővel, és némi gombokkal, de ahhoz más PIC kéne és átírni a progit...
A CLBH és a CLBL is 5uS. Ha jól számolom(f=1/(R*C*pi), (10k(10000ohm), 2,2n(2,2E-9 F))), akkor az oszci 15KHz körül rezeg, ami 69uS periódusidő. Ez bőven lassú, úgy hogy még működhet is NOP nélkül. Persze a PIC-et csak arra használni, hogy egy buta számot átküldjön reset után(olvasd el a cikket), igen nagy marhaság.
![]()
Ja latom, hat vannak ebben a kodban furcsasagok
![]() Amugy nem lenne egy utolso ezt LCD-sre atalakitani es akkor +- vagy szam billentyus bevitellel csinalni a freki kijelolest a dip kapcsolok helyett.
Egyetértek. Egy egysoros LCD-vel, és elég lenne a 16F627A is, mert szerintem beleférne a kód...
"tészta kód..." ... Ez tetszik! ![]() Idézet: „"tészta kód..." ... Ez tetszik! ![]() Jol van na, spagetti kod ![]() ![]() ![]() Ahhoz csak annyit tennek hozza, hogy van meg a betu teszta kod, ami a sok ossze-visszasagarol ismeretes es nem lehet kiolvasni belole semmit sem meg akkor is ha az osszes betut ismered ![]() ![]() ![]()
Nem-nem! Jó az a tészta, de a spagetti még jobb, mert kifejezőbb. Mindkettő nyúlik, de az egyik ráadásul hosszában vékony!
![]() A többi is jó hasonlat, kétségtelen!
Üdv mindenkinek!
Tudna nekem segíteni valaki hogy hogyan lehetne egy másodperces megszakításokat kivenni a timer0-ból? Nem értem az előosztó beállítást teljesen... ![]() ![]()
Két fontos dolgot nem írtál:
1. milyen PIC(még akkor is jó tudni, ha netán a Timer0-k egyformák) 2. Milyen C? (hogy C azt is a while-ből következtetem) A Timer0 jól írod egy 8bites előosztóból és egy 8bites számlálóból áll. A megszakítás akkor jön, ha a számláló(TMR0) túlcsordul. Ha a PIC 32768Hz-el ketyeg egy külső kristályról, akkor a Timer0 bemenete ennek az 1/4 részét, azaz 8192-t kap. Ha ezt elosztjuk a TMR0 256-os osztásával, akkor 32Hz-et kapunk. Ebből látszik, hogy az előosztót 32-es osztásra kéne beállítani. Ezt a PS2 : PS0 bitekkel lehet beállítani az OPTION regiszterben úgy, hogy a Bit2 : Bit0 helyekre 100 értéket írsz. Az OPTION-ban még be kell állítani a Timer0 forrását, ami legyen CLKOUT(T0CS=0). Engedélyezni kell a Timer0 megszakítását, és el kell indítani a számlálót. Ennyi.
Szia cpumaster,
Igy van ahogy mondod, 15 bitnyit kell shiftelni a 32768 Hz kristalyt, hogy 1s-t kapj. Ha egy 16 bites szamlalot teszel ra (pl. timer1-nek lehet adni egy ilyan ora kristalyt) akkor ugye az pontosan 2s-kent fog neked megszakitast okozni, vagy felebreszteni a PIC-et alvo allapotbol. Akkor csak 30-ig kell elszamlalgatni. Ha megvan a 30, akkor bekapcsolod a relet, majd a 16 bites szamlalo legfelso bitjet kell figyeln mikor all be 1-be, ez lesz az 1s amikor a relet kikapcsolod. Timer0-val is meg lehet csinalni ahogy watt irta, kb ugyanaz a helyzet, hogy 256-os eloosztassal 256-ig szamlalgat a 8 bites szamlalod. Ha mindenkepp 1s megszakitasokat szeretnel akkor pedig 128-as eloosztot hasznalva 256-ig szamlalgat...
Köszönöm mindkettőtöknek a hogy írtatok és h ilyen gyorsan.
Van itt a HE-n is 3 PIC-es rovat... itt volt téma a timer használata...kiemelnék egy sort ha lehet ami nekem kell sztem: setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256); ez most egy 256os előosztás ha jól értelmezem. Az órajel ebben a progiban 4mhz volt. Ennek a 1/4 része lesz 256-al osztva tehát 1000/256=3,90625Hz (igen én mondjuk egy külsőről akarom a jelet küldeni amit 2hatványaként választok h pontos legyen mint amit említettem is már) de akkor ezt hogy kell átírnom hogy mondjuk amit beszéltünk ha nem is 1Hz jön ki hogy 128 mondjuk az előosztó(ok ezt átírom a 256ot) de azt hogy ezt meddig számolgatja hová írom? Ez nem világos csak még... ja és igen...ccs a nyelv és most egy 16f877-en és 16f628-on gyakorlok...
Üdv!
Ha 32768 Hz-es kristályt használva, Timer0-val, 1 mp-ként akarsz megszakítást, ccs-ben megírva, az kb. így néz ki:
1. Van a ccs-nek jó kis felhasználói leírása, a timer megszakítás is benne van. 2. Ha végképp nem megy, a ccs pcwh... -ban van egy varázsló, ami könnyedén segít a szükséges beállítások, funkciók programzásában. 3. Végül is PIC, de van a ccs-nek külön topicja... És még egy dolog. Topi 3 részes cikkében a megszakításokról is szó van és ccs példákkal azokat be is mutatja. Idézet: „ez most egy 256os előosztás ha jól értelmezem. Az órajel ebben a progiban 4mhz volt. Ennek a 1/4 része lesz 256-al osztva tehát 1000/256=3,90625Hz” Azt hiszem egy 1000-es nagysagrendnyit tevedtel ![]() Amit MPi-c irt peldat az azt feltetelezi, hogy a core is errol a 32768 kristalyrol ketyeg, azaz a timer0 az 32768/4 orajelen inkrementalodik igy elegendo a 32-es osztas, hogy a timer0 256-os osztasabol adodo megszakitas pontosan 1s legyen. Ha elegendo szmodra ez a sebesseg a program vegrehajtasara akkor ez egy jo kiindulasi alap lehet.
Igen elszámoltam picit... Maradjunk MPi-c példájánál bár nem ezen az elven megy majd hanem az interruptos külső pinről kapja majd a pulzust. Értem hogy ha belsőről akarom akk osztódik 4-gyel meg aztis hogy ha külsőről akk nem. Értem hogy most ebben a példában 32768-at osztjuk előbb 4-gyel mivel ez a pic órajele is. Ez 8192Hz. Akkor a timer előosztót beállítom 32-essre. Kapok 256-ot. Oks értem. De csak eddig. Most azt hol állítom be hogy ezt még 256-al osztja hogy kijőjjön az 1. Vagyis tom eddig számol el hogy túlcsorduljon. De ezt a végét hogy? Ez az érték mindig 256 már? Vagy mi határozza meg? Mert addig értem hogy előosztom max 256-al a TMR0-nál. Akkor a számolás mindig 256-ig történik az előosztás után már?
A TMR0 egy nyolcbites számláló az előosztó után. Ennek a számlálónak a tartalmát ki tudod olvasni és be is tudod írni.
Ha viszont nem csinálsz vele semmit, akkor az az előosztóról kapott impulzusokat rendületlenül számolja és számolja, majd 0xFF után 0x00 következik, azaz túlcsordul. Tehát minden 256 impulzus után kapsz egy túlcsordulási eseményt, ha nem nyúlsz hozzá. Ha sűrűbben akarod a túlcsordulásokat megkapni, mondjuk 100 impulzusonként, akkor a túlcsordulást lekezelő programrészben fel kell tölteni a számlálót egy olyan értékkel (ha jól tévedek, -100, azaz 0x9C kell oda ilyenkor), amiről felfelé számolva 100 impulzus után következik be a túlcsordulás.
Kicsit morcos vagyok, hogy amit írtam nem olvastad el! Abban benne van a válasz!
Idézet: „De ezt a végét hogy? Ez az érték mindig 256 már? Vagy mi határozza meg?” Ahogy szilva mondja: Idézet: „akkor a túlcsordulást lekezelő programrészben fel kell tölteni a számlálót egy olyan értékkel..., amiről felfelé számolva... következik be a túlcsordulás.” Ennek módja (mint írtam, benne van a kezelői leírásban! ) mivel itt megszakítás szerepel a példában, a megszakítást kezelő rutinban a Timer0 kezdőértékét a "set_timer0(érték);" utasítással állítod be, tehát ez az RTCC_isr-ben legyen. (Ez mostmár elég szájbarágós lett.)
Jó reggelt Mindenkinek.
MPLAB- SIM. Egy kicsit rendezgettem a memóriát, és utána a Watch táblázatban azt jelzi, hogy egy-két változót nem talál, és a változó neve előtt egy nagy zöld "P" betű van. Mit jelent ez? Köszönettel
Több oka lehet, hogy nem találja a watch a változót.
1. időközben átnevezted... 2. C esetén, nem globális a változó, és az a rutin amiben deklarálod éppen nem fut. 3. ? ezt majd más bővíti
A zöld P betű mintha a programmemóriára mutató pointert jelezné. De nem vagyok benne biztos, nincs előttem mplab.
Mit jelent, hogy "kicsit rendezgetted a memoriat"?
![]() Es amugy akkor most hogy nez ki vagy mit kell tudni rola mert igy ez nekem most elegge kodos - ccs-ben csinalod, jol emlekszem?
sziasztok!
akarok csinálni egy egyszerü időzítőt. de nem tudom megcsinálni azt, hogy egy LCD-n írja ki az időt, mert byteot nem be tenni, csak szöveget. mikropascalban csinálom. pl.: Var bekapcs:byte; begin bekapcs := 15; lcd_out(1, 1, beakpcs); end. nem jó, mert byteot nem lehet berakni. valaki tud segíteni?
At kell alakitani szovegge elobb, es azt kitenni az lcd-re. Nem ismerem a mikropascalt, de a lenyeg hozz letre egy string tipusu valtozot, nezd ki melyik fuggvennyel vagy eljarassal lehet a stringet atalakitani szovegge, es utana ezt a sztringet rakd ki. Lehet van kozvetlen fuggveny is ami neked ezt automatan megcsinalja, pl write writeln ugrik be hirtelen pascalos korszakombol (PC-s Turbo Pascal) de ilyen helyen is kotorasznek hogy ezek mukodnek-e a mikropascalban az LCD-re.
Helló Trudnai, helló Potyó.
A tudatlanok magabiztosságával rendezgettem a memóriát. (asm-ben) Ez azt jelenti, hogy sok az ide-oda ugrálás a programon belül, ezért a megfelelő program részeket megpróbáltam azonos memória lapra, lapokra szervezni. Közben megtaláltam a hiba okát. A prg. elején a változók, címekhez voltak kötve. Én kitöröltem a címeket, hogy automatikusan configurálja őket a prg. De ilyenkor ugye elé kellett volna irni a 'cblock' és utána meg az 'endc'-t Ezek hiányoztak, és a fordító nem reklamált. Köszönettel, kellemes hétvégét.
Wan hasonlóhoz. wattmep.tvn.hu
Koszi, de nekem tul bonyolultak. Egesz egyszeru kellene amit hamar ossze tudok rakni, csak nehany 16F84-et kellene beegetnem,..nem celom picre fejleszteni..
|
Bejelentkezés
Hirdetés |