Fórum témák
» Több friss téma |
Hogy ha a GIEH-t 1-re állítom akkor már nem az alacsony prioritást fogja figyelni hanem a magasat és azonnal már a program indulásnál megvalósul a megszakítás mivel fel vannak húzva a lábak magas szintre.
Valami más ötlet?
Olvasd el az adatlapon a 9 fejezetet
. A 9-1 árán látható. hogy semmilyen interrupt nem megy ki ha a GIE nem 1. Az INTCON leírásában is benne van, ha GIE 0, az IPEN állásától függetlenül minden megszakítás tiltva van. Ha a GIE-t a megszakítások beállítása után engedélyezed, már csak olyan megszakítás jöhet, amit beállítottál.A PORTB beállításait 10.2 fejezetben nézheted. A lábakon levő változásokat a latch-hez képest figyeli, a port írása/olvasása átállítja a latch-et ami az aktuális állapot, tehát innen már csak a változást figyeli (ezt menet közben is meg kell csinálni, hogy beálljon az aktuális állapot mielőtt törlöd a RBIF-et). Ezt tedd meg mielőtt a GIE-t engedélyezed, és akkor már csak az innentől jövő változások okoznak megszakítást. Ha nem engedélyezel semmilyen magasszintű megszakítást, oda nem fog ugorni a program, hiába van a GIEH is 1-en.
Igen igazad van. Engedélyeztem a GIE/GIEH-t szóval indúl a dolog, de bárhová teszem (beállítás elejére vagy végére vagy közepére) program indulásnál egyből a megszakítással indul a program, aztán utána már jó.
Lenne egy hülye kérdésem: Ha 0,4...0,85us hoszzú impulzusokat akarok előállítani, mekkora minimális oszcillátor frekit kell választanom? Már teljesen belekavarodtam mint házimacska a hímzőcérnába... (Tényleg kellene a 48MHZ?)
A PORTB inicializálása megfelelő (CLRF LATB)? Mielőtt kiadod a GIE-t, ráolvasol egyet a PORTB-re?
Igen próbáltam úgy is, de az eredmény ugyan az.
Megszakítással indul a program, majd utána már megfelelően működik. Vagy is kissé összekuszálódik pár megszakítás után szóval ott még majd bütykölnöm kell valamit. Közben jó lett. A flag-et a végén törlöm és a GIEH-t is a végén állítom be így oké lett a dolog. Köszi a segítséget. A hozzászólás módosítva: Ápr 7, 2014
Szia!
Hát.... 20MHz kristály = 200nsec/utasítás. 0.4uS = bsf port nop bcf port 0.8uS = bsf, nop,nop nop bcf Sajnos 50nsec nem megy. Valóban 48Mega kell, Azonban, ha a PIC-nek van pwm modulja akkor ott 50nS -os felbontás is van, tehát elvileg egy beállított pwm érték képes ekkora impulzus kiadására. Viszont a periódus idő kötött. Érdmes lenne megnézned. üdv.: Foxi
Sajnos a "bit-banging" üzemmódot kellene választanom és eltérőek az értékek- csak egy min-max tartományt adtam meg. Ráadásul elég pontosnak kellene lennie mert +-170ns eltérést engednek meg.
Most már Te látod, hogy működik
, még egy feltétel van az adatlapban: egy utasításnak kell lenni a port olvasás és a megszakítás engedélyezés között (akár egy NOP).
Akkor egyszerűen átlagoni kell. például 5x 400nsec 1x 600nsec vagy valami más osztásban. esetleg. nem tudom esetleg leírhatnád a kritériumot pontosabban.
Ott nullázom a Flag-at.
Valamiért megfagy a program 4-5 megszakítás után, de hogy miért a fene sem tudja... Most ezen agyalok mi lehet a hiba amiért meg gabalyodik egy idő után...
Sziasztok!
A segítségeteket szeretném kérni. A problémám a következő lenne: Egy PIC16F877A-val szeretnék egy feszültségmérőt összehozni, ami 0-15V-ig mér. A PIC AN0 csatornáját használom, 10 bites a benne lévő a/d konverter. Addig jutottam a dologgal, hogy ki tudom olvasni az ADRESH és ADRESL eredményt tároló regisztereket, de ezeknek az értékei mindig megegyeznek.
Ha van valamijen ötletetek, szívesen fogadom.
A fenti kód egy része Szegő Jánostól, az FD1-es teszt panelhez tartozó csomagból származik.
A két regiszter más bankban van, olvasáskor bankot kell váltani.
Szia. Nagyon köszönöm, a franc essen bele, tegnap még volt erre egy gondolatom, hogy megnézem, nem tettem. Tipikus hiba lehetőség! Hálás köszönet!
Még egy kérdésem lenne. Nem csináltam még ilyen 10 bites számolást, tudtok esetleg valami iránymutatást adni, hogy kezdjek bele a dologba? A PIC álltal mért feszültséget szeretném soros porton kiküldeni. Felbontásnak bőven elég lenne a 100 mV. A sorosport használat már megoldott. A feszültség tartomány amit mérni szeretnék 0.0-15.0V-ig terjedne. Elsőre úgy gondoltam, hogy a 10 biten ábrázolható 1023-at osztom 15-el, így 68,2 kapok. Ezt vonnám ki az 1023-ból, amíg nullát nem kapok.
Sziasztok!
Jól értelmezem, hogy a SLEEP módból egy CLRWDT utasítással ébreszthető fel a PIC vagy kell még más is hozzá?
Nem jól értelmezed. SLEEP módban a PIC alszik, nem csinál semmit, utasítást nem tud végrehajtani. A CLRWDT utasítás a WatchDog Timer számlálót törli.
A hozzászólás módosítva: Ápr 8, 2014
Ha ASM-ben akarok számolgatni én valószínűleg olyan osztót raknék elé, ami a 20,48V-ot osztaná 5V-ra (ha a tápot használod referenciának), így a kapott eredményt csak kettővel kellene szorozni (rotálni balra), és a kijelzésnél helyére rakni a tizedespontot
.Figyelembe kell venni: - az 5V nem stabil referencia, - az A/D átalakítónak ofszethibája van, ami kis feszültségeken jelentkezik, - a mérések picit szórhatnak (ha a 4 digites eredményt, csak 3 digiten jelzed ki nem okoz problémát, vagy szorzás helyett két mintát összeadsz, vagy négyet osztasz kettővel, vagy .... )
Köszönöm!
Még olvasgattam meg próbálkoztam vele és úgy látom akkor tudom felébreszteni a PIC-et, ha valamilyen megszakítás történik.
A külső reset, a watchdog lejárata mindenképen felébreszti a kontrollert. A többi lehetőség valóban az egységek megszakítás kéréséhez vannak kötve. Ha a GIE tiltott, akkor felébredéskor nem keletkezik megszakítás, hanem a soron következő utasítással folytatódik a végrehajtás. Ha a GIE engedélyezett, akkor a megszakítási rutinra kerül a vezérlés.
Keresnék itt egy jó kis osztó rutint, a kapott esedményt elosztanám 150 -nel. a hányados lenne a feszültség 100mV -ban, a maradék felhasználható kerekítséhez.
Sziasztok. Most kezdtem barátkozni PIC proramozással C nyelven, de sehogy se sikerül működésre bírnom egy PIC18F45k22-es interruptkezelését. A célom az hogy kb egy másodpercenként interruptot generáljon a TMR0. Valamit biztosan rosszul állítok be. MPLAB X -et használok XC8 -cal. Előre is köszi a segítséget.
A kód kb így alakul:
A hozzászólás módosítva: Ápr 8, 2014
A megszakítási rutinban a TMR0IF -t törölni kell.
Köszi, ennyire vak nem lehetek.
Kitöröltem. így sem megy.
Pusztán elméleti kérdés.
Mi a pontosabb hosszútávon? RTC, 32 768 Hz-es kvarccal, vagy PIC, 20 MHz-es kvarccal, Timer2-vel és egy segédváltozóval visszaosztva a frekvencia 1 Hz-re? Az áramkimaradást egyelőre hagyjuk ki a játékból, a kvarc-ok a HEStore-ban is kapható "közönséges" típusok. A hozzászólás módosítva: Ápr 8, 2014
Most a T0CKI bemenetre érkező jelről számolna.
A hozzászólás módosítva: Ápr 8, 2014
Szia, gondolom ezelőtt AVR-et programoztál (a megszakításkezelés alapján) mert nem látom, hogy az interrupt flag-et nulláznád a megszakítás után (AVR-nél nem kell itt viszont igen)...
Esetleg ha a B port működhet analog portként is akkor azt nem árt digitálisra állítani, illetve komparátorokat letiltani (ez minden PIC-re érvényes). Az sem derül ki a programodból, hogy mekkora frekin járatod a PIC-et, timer interrupt-nál ezt figyelembe kell venni másképp nem tudod kiszámítani a timer értékét. Az overflow azt jelenti, hogy egy bizonyos értéktől (nem feltétlenül 0-tól) addig számol ameddig eléri a maximum értéket (16 biten ez 0xFFFF, azaz 65535). Tegyük fel, hogy 8MHz-es kristályod van, ekkor a proci és a perifériák 2MHz-en ketyegnek, a TMR0 (4-es előosztó miatt) 0.5MHz-en fut, ez azt jelenti, hogy 2us-onként lépteti a számlálót, ha te 1 másodpercet akarsz mérni akkor 1s/2us = 500 000 léptetést jelent, de mivel a számláló csak 65535-ig tud számolni, ezért már az elvárt érték kb egy tízedénél megszakítást generál. Tehát addig kell növeld az előosztó értékét ameddig a kívánt periódus és a timer periódusának hányadosa belefér a 16 bites értékbe. Ha ez megvan akkor azt a kapott hányadost kivonod a 65535-ből és azt az értéket kell beírd a TMR0 regiszterbe, hogy onnan kezdjen el számolni és mire a végére ér pont 1sec lesz. Ekkor a megszakítás rutinban újra be kell állítani a timer regiszter értékét különben 0-tól indul és akkor már nem 1 másodperc lesz a következő megszakításig. Megértésedet kérem de most nem volt időm letölteni a pic adatlapját és minden pontosan megnézni, de szerintem ezek alapján már meg kell tudd oldani ![]() Remélem, hogy sikerült megérteni amit itt leírtam, részleteket az adatlapban megtalálod, hisz az azért van
T0CON 5. bitje a T0CS ami 1-nél T0CKI az órajel, 0-nál pedig a bepépített. Ahogy nézem nekem 0-ra van állítva.
"T0CS: Timer0 Clock Source Select bit 1 = Transition on T0CKI pin 0 = Internal instruction cycle clock (CLKOUT)" (#) matheattila: Köszi, igen egy ideig tanultam AVR-t assembly nyelven. A flag már törölve, azt javítottam, az INTOSC megy alap 1mhz-en, így kb 1Hz (250 000/4 ~ 2^16 ennél pontosabb nekem nem kell) szóval azzal nem kellene hogy gond legyen. Csak a C portot használom, de a rákötött ledeken semmi változás. Még a komparátorokat kikapcsolom, és megnézem úgyis. Köszönöm a gyors és részletes választ. A hozzászólás módosítva: Ápr 8, 2014
Szia!
Igazad van, belső órajelről számol.
Tesztelésnél 8 db 1 van, a beállításnál 7 db. Egyégként:
A hozzászólás módosítva: Ápr 8, 2014
|
Bejelentkezés
Hirdetés |




. A 9-1 árán látható. hogy semmilyen interrupt nem megy ki ha a GIE nem 1. Az INTCON leírásában is benne van, ha GIE 0, az IPEN állásától függetlenül minden megszakítás tiltva van. Ha a GIE-t a megszakítások beállítása után engedélyezed, már csak olyan megszakítás jöhet, amit beállítottál.






