Fórum témák
» Több friss téma |
A fordító készít assembly fájlt? Ha igen, kíváncsi vagyok mi van benne, feltöltenéd?
Az utasítások is időt visznek el, csökkentsd a késleltetést 19-re.
A PIC-nek csak 4MHz belső órajele van, ha mást szeretnél külső megoldás kell. A programod ezt nem tudja és úgy számolja az időzítést mintha 8 lenne, ezért tart dupla ideig.
Köszi,holnap otthonról feltöltöm.
Ktamas66: bármennyire csökkentem ez a plafon. Akkor elvileg, ha külső 20 MHz-es kvarcot használok a PIC 5x gyorsabb lesz és az időzítés sem változik? Persze ha a PIC alkalmas rá? Idézet: „Az utasítások is időt visznek el...” Nagy igazság, főleg a goto, aminek a végrehajtása kétszer olyan hosszú ideig tart, mint a többié. 4MHz -en egy normál utasítás végrehajtása 1us, a goto, call, return, retfie -e pedig 2us. Tegyük fel, hogy a fordító jó kódot készít a WaitUs 20 utasításhoz. Ekkor ezek végrehajtása 2*20us. Ehhez jön még 1-1 us a port állítására és 2 us a goto végrehajtásához. A periódusidő 44us, a frekvencia 22.73 kHz. Ha a 3. sorban WaitUs 19, az 5. sorban WaitUs 17 szerepelne, a periódusidő (1+19+1+17+2) = 40us lenne, a frekvencia 25kHz lenne...
A hozzászólás módosítva: Aug 20, 2016
Esetleg valami ilyesmit is meg lehetne próbálni:
Könnyebb az időbeli szimmetriát kezelni vele.
Köszi. Ha viszont ráteszek egy 20 MHz-es kvarcot és a programban is beállítom a 20 MHz-et, akkor 200ns lesz egy ciklus (adatlap szerint is), mennyire lesz stabil a működés, így nagyon csúcson járna?
Teljesen stabilnak kell lennie 20 MHz-en is.
Mehet 20MHz -n is, de akkor a port állítása 200ns, a goto végrehajtása 400ns lesz.
Megcsináltam 629-re is a programot, a LED-eket pedig kibővítettem 2-vel. Az egyik a 0-2 lábon, a másik pedig az 1-3-ason van, ugyanabban az állásban, mint a többi. Itt a program:
A gond most az, hogy bár szépen végigmegy mindegyiken, amikor a 0-2 lábakon levőt kapcsolja, (a jelölt helyen) akkor nem csak az világít, hanem a 0-1-es is fél fénnyel. no de miért?
Előfordulhat az, hogy amikor engedélyezek egy megszakítást ( enable_interrupts(INT_TIMER2); ) az egyből le is fut?
Nem úgy kéne működnie, hogy akkor fut le a megszakításban szereplő programrészlet amikor eléri az időt?
A megszakítás akkor éleződik, amikor egy órajel érzékeli, hogy az interrupt flag aktív, és az interrupt élezése nincsen tiltva a kiértékelési láncban. Az int flageket azért is kell mindig kapcsolni az interrupt kezelőből. Ha aktív volt a trigger, és engedélyezted a kiértékelési láncban az utolsó kizárást is, akkor teljesen normális, hogy azonnal a megszakítási rutinod kapjon behívást. A kiértékelési lánc elemeiről az adatlap általában mindent szájbarágósan leír.
Idézet: Aha ... Csak C-be abban bíztam, hogy ezeket megoldották helyettem! „Az int flageket azért is kell mindig kapcsolni az interrupt kezelőből...”
Már az engedélyezéskor is aktív lehet a jelzőbit, így azonnal be is lép a megszakítási rutinba. Ezt úgy tudod elkerülni, ha közvetlenül az engedélyezés előtt törlöd a jelzőbitet, és az időzítőt is akkor indítod.
Ellenőrízd, hogy a kérdéses, fél fényerőn világító ledhez tartozó, bemenetként beállított lábon nincs-e bekapcsolva a belső felhúzó ellenállás!
Vannak azok a mindenféle attribok a C függvény fejlécekben, de azok a megszakítás kiszolgálóhoz tartoznak. Ott egyáltalán lehet esélye a fordítónak, hogy értesüljön róla, hogy te implicite kezeltetni szeretnél vele valamit. Viszont a főprogramod init részében ugyan hogyan értesülhetne róla?
Alapinit helyett a főprogramhoz csak annyi van, hogy a GlobalInterruptEnable bit mindegyik pic-en tradicionálisan inaktívként alapinitel hideg reset után. Egyetlen interrupt sem tud éleződni úgy. Meg talán egy szintnyivel lejjebb is inaktív mindegyik csoport mindegyik pic-en, de abban már nem vagyok biztos. Interrupt éleződni csak akkor fog, ha bekapcsolod a csoport engedélyezést, és a global flaget is. Margóra széljegyzetnek: a megszakítás kiszolgáló periféria is olyan, mint bármelyik másik. Nem muszáj bekapcsolni, de ha bekapcsoltad, figyelned kell minden egyes bitjére. Rendesen alapinitelned kell előtte, amit külön ki kell nulláznod, azt külön ki kell nulláznod, stb, stb. Kissé talán alábecsülted a jelentőségét, hát ne tedd. Az asm és a Cxx még sokkal inkább hardver közeli környezetek. Talán a microC és a Basic meg hasonló szintű SDK-k már lekezelnek neked automatán ezt-azt, de a C18 / C30 / C32 fordítók még alig többek, mint az asm kicsit kényelmesebb változatai. Van a Cxx fordítóknak olyan kapcsolója, hogy generáljon lista file-t. Ha van valami asm vénád is, abban mindent konkrétan végig nézhetsz, mit rakott bele a fordító, és mit nem. Az XC fordítók configjaiban meg ofc annyi hiba van még mindig, hogy részemről azokkal egyáltalán nem is foglalkozom. Csinálják meg normálisra, én addig bottal sem piszkálom.
Én kipróbálnám hogy pl. az alábbi megoldásból mekkora frekvencia kerekedik ki, abból már lehetne következtetni mekkora késleltetés kell.
Szia!
Az nem lenne jó dolog, ha ez automatán menne... Van amikor később akarom engedélyezni, van, amikor menet közben is tiltom, majd újraengedélyezem...Nem lenne jó, ha a fordító "egyből" engedélyezné, majd ha Te utasítod rá, akkor tegye !
Be van kapcsolva.
Mindegyiken, amelyik bemenetre van állítva. De már rájöttem, hogy a PK2 csinálja, amiről futtatom. Ha lehúzom, és külső tpról megy, akkor nem világít.
Sziasztok,
A mikrokontroller vezérléséhez 3 különböző kapcsolót használok. Az SW2 és az SW3 normálisan működnek. Ha az SW1 -et megnyomom megőrül az egész, mindenféle össze-visszaságok jellenek meg a kijelzőkön. Próbáltam másik lábára kötni a mikrokontrollernak és cseréltem kapcsolót is ,de a próbléma maradt. A felhúzó ellenálások különböző értékűek mivel sajnos csak ilyen ellenálásaim voltak otthon, viszont mindegyik legalább 100k értékű. Mellékeltem a kapcsolási rajzot. A pic és a kijelző közé képzeljétek oda az ellenálásokat a valóságban ott vannak. Lehet a próbléma a próbapanelos megoldás miatt van és a sok vezeték miatt zavarjelek alakultak ki?
Én nem látom a rajzot....
Program hiba lesz az.. Nem látszik a kapcsolás..
Szinte biztos, hogy programhiba. Ha mutatod a forrást, nem fogunk tudni segíteni.
Amikor először összeraktam a próbapanelen akkor jól működött és a proteusban is teszteltem és ott is okés a dolog.
Pali azt akarja mondani, hogy muti meg a forrást mert akkor tudunk csak segíteni, ha látjuk mit írtál
Tovább: RB0, RB1, RB2-őt digitális bemenetre kell állítani.. A bekötés stimmel. Programba, ha nem használsz megszakítást és C-ben írod, akkor:
A hozzászólás módosítva: Aug 20, 2016
Értem én hogy jó lenne a forráskód, de hogy azon csak én igazodok ki az is biztos azért nem akartam ide bemásolni.
Digitálisra vannak állítva a bemenetek, a pergés mentesítést rárakom. Kösz!
Szia!
Én még tennék 100n kondikat a nyomókkal párhuzamosan.A pergést szűrd ki szoftveresen. Ezekkel a felhúzó ellenállásokkal(eléggé nagyok) bármilyen zaj bezavarhat annyira ,hogy úgy érzékelje,mintha lenyomtad volna a nyomót .
Szerintem sok lesz oda a 100n. Beszikrázik tőlük a kapcsoló, oxidálódik a kapcsoló felület. Pici szikra, pici korom, de összegyűlik. Kapcsolókkal párhuzamosan én 1n-nál többet nem raknék.
|
Bejelentkezés
Hirdetés |