Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Szerintem nem értetted meg Ideiglenes aggályait. Nem az a kérdés, hogy tudsz-e a megszakítás elején hozzápiszkálni a Timer1-hez, hanem az, hogy mikor is esik be az a megszakítás pontosan. Merthogy a fő programvonulat csinál valamit, ami közben épp túlcsordul a timer1, a flagja ugyan beállítódik, de lehet, hogy maga a megszakításkiszolgálás majd csak valamikor később fog érvényre jutni. Ennél már csak az a cifrább, hogy amikor a megszakításban a timer1 regisztereit piszkálod, akkor nem mindegy (a timer1 órajelének fázisához képest), hogy mikor teszed ezt meg, mert ettől függően kimaradhat egy számolási lépés. Mivel van bizonytalanság abban, hogy a kiváltó okot mennyi idővel utána kezeled le, ez a fázishelyzet sem garantálható, különböző trükkökhöz kell folyamodni (lásd errata). Ráadásul ilyenkor nem nullázni vagy fix értékkel írni szokás a timer1 regisztert, hanem hozzáadni valamennyit az értékéhez, hogy a túlcsordulástól a lekezelésig eltelt idő alatt megszámolt érték ne vesszen el csak úgy. A komparálásos megoldásnál abban biztos lehetsz, hogy a timer1 folyamatosan, zavartalanul fog számolni, nem fog az újratöltésekkor kiesni egy megszámlálandó impulzus sem, ennél fogva a kiváltott interruptok ismétlődési gyakorisága biztosan a timer1 alapórajelének (pl. kvarc) pontosságától fog függeni. Igaz, hogy az interrupt kiváltása és lekezelése közötti időben ugyanúgy benne marad a bizonytalanság, tehát lehet jitter az interruptok lekezelése között, viszont maga a kiváltó ok (a CCP flag beállása) pontosan ütemben fog megtörténni.
Ezek a fejtegetések arra az esetre vonatkoznak, ha a beérkező interruptok közötti időt kell pontos értéken tartanunk. Ha nem ez a cél, hanem az, hogy a firmware egy pontjáról indított pontos időzítés végén legyen az interrupt, akkor jó lehet a direkt timer regiszter-írás is, és ez az írás történhet az interruptból is. Természetesen mindkét esetben célszerű a főprogramot úgy szervezni, hogy a fent említett jitter minimális legyen, pl. nem illik az interruptokat letiltani.
Szia! Ezt nagyon nem bírom megérteni az említett kódrészletben miért van erre szükség? movlw high ModeSelectTable ; jump to the current mode Miért van ez benne? Nekem bit szinten kellene elmagyaráznod...
Ezt magam sem írhattam volna gyönyörűbben...
A W-be teszi a tábla címének felső 8 bitjét, amit utána a PCLATH regiszterbe tölt a következő sorok egyikében. Ez akkor kerül be a PC felső 8 bitjére, amikor a PCL betöltésre kerül. Ez szinkronizációs okokból van így, ezt könnyű belátni miért. Az ezt követő utasítás már az új PC címen hajtódik végre, azaz a táblázat megadott címén. A táblázatnak nem szabad lapon átnyúlnia, mert az gondot okozhat, azt külön kéne kezelni, ha még is így lenne.
Egy kicsit belenéztem a pic24 világába, de az elmélet első lépéseinek felfogása után rögtöm megakadtam az első példprogramom kipróbálása során.
Az MPLAB ban kiválasztom a device select -ben a PIC24HJ128GP502 -t. A programban includolom eszerint:
Aztán fordításkor a következő üzenetet kapom: Error in parameter"24HJ128GP502" (a program további sorokból is áll) Ez milyért van???
Nézd meg at MPLAB IDE Project/Set Language Toolsouite menüpontban, hogy az MPLAB ASM30 Toolsuite van-e kiválasztva? (könnyű mellényúlni kattintáskor...)
MPLAB melyik verziója van telepítve?
Nagyon hálás vagyok a részletes válaszért. Kissé tamáskodva ismerem be, hogy még mindig kis kiegészítésre szorulok a kérdés pontos megértéséhez.
Ha szbad válaszodba azokon a helyeken belekérdeznék, ahol nekem nem világos a dolog. Idézet: Rendben ez érthető, de úgy számolom, hogy a programomban a túlcsordulás előtt (nem is kevéssel, 16 bites módban) mindenképpen be kell következnie a megszakítás kiszolgáló résznek is. Ez alatt kifejezetten azt értem, hogy nullázom a TIMER1 számlálóit, és innentől már ujraindulhat a számolás, még akkor is, ha van további programsor a megszakítás kiszolgáló rutinban. Azt is biztosított, hogy a megszakítás kiszolgáló rész futása alatt nem lehet újabb egyezés a comparátorral, az interruptot nem kell tiltanom, mert meglehetősen rövid lenne az érintett kód. „a fő programvonulat csinál valamit, ami közben épp túlcsordul a timer1, a flagja ugyan beállítódik, de lehet, hogy maga a megszakításkiszolgálás majd csak valamikor később fog érvényre jutni” Idézet: „Ennél már csak az a cifrább, hogy amikor a megszakításban a timer1 regisztereit piszkálod, akkor nem mindegy (a timer1 órajelének fázisához képest), hogy mikor teszed ezt meg, mert ettől függően kimaradhat egy számolási lépés.” Itt arra gondolsz, hogy éppen az alsó byte -on túlcsordulás van, és akkor "piszkálom" (resetelem) TMR1 -et? Ez okozhat gondot szerintem, a fentiekben írt okok miatt. Idézet: „Ráadásul ilyenkor nem nullázni vagy fix értékkel írni szokás a timer1 regisztert, hanem hozzáadni valamennyit az értékéhez, hogy a túlcsordulástól a lekezelésig eltelt idő alatt megszámolt érték ne vesszen el csak úgy.” Hozzáadni? Akkor nem veszik el? Mit érek vele, ha az aktuális érték (ami már nem nulla) 10 helyett 15 lesz? Idézet: „Igaz, hogy az interrupt kiváltása és lekezelése közötti időben ugyanúgy benne marad a bizonytalanság, tehát lehet jitter az interruptok lekezelése között, viszont maga a kiváltó ok (a CCP flag beállása) pontosan ütemben fog megtörténni.” Itt arra gondolsz, hogy a kiszolgáló rutinban lehet olyan uatasítás, ami néha 1 néha 2 ciklusú, és ezért kiszámíthatatlan a futás idő? (pl. BTfSS) A korábbi válaszok tükrében kicsit tudnál még csiszolni ismereteimen?
MPLAB verzió: 8.10
Jót kérdeztél, mert a Project/Set Language Toolsouite menüpontban csak a registerd tools -ok vannak felsorolva, hogy melyik van "kiválasztva" azt nem tudom eldönteni. Megpróbáltam a következőt, mivel pontosan olyant nem találok amit írtál: a megjelenő tools -ok közül a Microchip ASM30T Toolsite / Executables / MPLAB ASM30 Assembler (Pic30-as.exe) választom, majd OK -ot ütök. Sajna ugyanaz történik, tehát valamit nagyon rosszul csinálok. megj: A kiválasztott proci tipusának megfelelő p24HJxxxx.inc file megvan az MPLAB könyvárában.
A leggyakrabban akkor nem teljesül azonnal a pl. timer megszakítás, ha éppen egy másik megszakítás folyamatban van. A lekezelés akkor teljesül, ha az előző megszakítás befejeződött. Hiba lenne abból kiindulni, hogy nekem úgy se lesz más megszakítás, mert ha még is, akkor borult az egész program felépítése. Más szinkrozizációs okokból is csúszhat a timer mire a megszakítás lekezelésre kerül, ilyenek a két programlépéses parancsok lefutásából származó csúszások is és más az erratákból kiolvasható esetleges hardveres problémák is.
A timer számolása növekvő, megszakítás a túlcsorduláskor következik be. Ezért ha módosítani szeretnénk a megszakítások bekövetkezését az eredeti 16bittől eltérően, akkor egy nagyobb számot kell beírni, mint 0. Ha ezt fixen beírnánk, és a fent említett kiszolgálás csúszik, akkor hibás kezdőértéket kap a számláló, miután kidobnánk a kiszolgálásra várakozás közbeni számláló növekedés értékét. De ha hozzáadjuk a kívánt értéket, akkor a már beszámolt érték nem vész el, pont annyival többről indul a számláló, amennyire szükségünk van. Tehát a timer reset, ami végül is egy fix szám beírását jelenti, nem jó megoldás. Idézet: Elnézést kérek, mert rosszul írtam: nem a Set, hanem a Select Language Toolsuite menüpontot kell nézni! Ott egyértelmű, hogy melyik az aktív.„hogy melyik van "kiválasztva" azt nem tudom eldönteni.” Az új projekt kezdése egyébként így megy: 1. A Project menüben válasszuk a Project Wizard-ot, majd a felbukkanó ablakban kattintsunk a Tovább gombra! 2. A Device mezőben válasszuk ki a PIC24HJ128GP502 mikrovezérlőt, majd kattintsunk a Tovább gombra! 3. Az Active Toolsuite mezőben válasszuk a "Microchip ASM30 Toolsuite"-ot, majd Tovább! 3. A Create New project lapon kattintsunk a Browse (tallózás) gombra, majd keressünk egy alkalmas helyet az új projektnek (pl. C:\PIC24) és adjunk nevet az új projektnek (pl. proba1)! Tovább... 4. Nem adunk hozzá forrásállományokat! Tovább... 5. Kattintsunk a Befejezés gombra! Utána Project/Add New File to Project, adunk egy nevet, pl. proba1.s, s jöhet a kódbeírás.
Igen, nekem sem tűnt fel, hogy a set tool felett ott van a select tool menű, de mentségemre legyen mondva, hogy szürkén. Az általad javasolt project szerint már valószínűleg menni fog a beállítás.
Köszönöm a segítséget!
Ajaj, ha szürke, akkor neked projekted sem volt?!
bevallom nem. Én notepad -dal szerkesztem a programot, (otthol is és a céges gépen is néha) majd átírom asm re, ezután ha olyan gép előtt ülök, amelyen van MPLAB lefordítom.
Szóval nekem eddig nem hiányzott a project.
Erről sürgősen le kell szokni, mert itt nem .asm hanem .s a kiterjesztés, ezt projekt nélkül nem fogja lefordítani az MPLAB.
Lentebb már leírtam, hogyan kell ezt szabályosan csinálni, csak azt nem írtam oda (ismertnek gondoltam), hogy .s a forrásfájl kiterjesztése.
Van egy olyan problémám, hogy 10f220-nál gp2 kimenetnek van konfigurálva, mégis nem mindig csinálja a dolgát néha táp reset után nem hajlandó kimenetként üzemelni, hanem magától ad ki négyszög jelet. Néha meg jó a dolog. Találkoztatok már ilyen problémával?
Szia!
Az OSCCAL regiszter 0. bitje állítja be, hogy az FOSC4 (az órajel negyede frekvenciájú négyszögjel) vagy a port bitje legyen a lábon.
Sziasztok!
Van valakinek információja ,arról, hogy a Chipcad-hez érkezett-e már készlet a 18f2550-i/sp-ből? Még szeptemberben azt ígérték, hogy október végén lesz. Köszönöm. Üdv!
Szia!
November végére jósolják, de a listájuk alapján 18LF2550 I/SP még van nekik...
Ez az nagyon szépem köszönöm Már agyon néztem az adatlapot és nem jöttem rá.
Köszönöm.
Ez csak abban különbözik a sima "F"-estől, hogy már 2V-tól működőképes, ugye? PICKIT2 klónhoz szeretném. Szerintem megfelelő lesz bele.
Szia!
Minden azt mondja, hogy mennie kell...
10f220-nál szeretném ccsc-ben írni az osccal regisztert ehhez kéne segítség, mert valamiért táp rezet után néha gp2 nem üzemel kimenetként!
köszönöm mindannyitoknak a választ a Timer kérdésemre.
A kezdeti lendület megtört, a fordításig nem jutottam el.
Az általad leírt project létrehozási lépések után létrejön az .mcp, .mcw, és .mcs filek. Most a következő lépés: Idézet: „Utána Project/Add New File to Project, adunk egy nevet, pl. proba1.s, s jöhet a kódbeírás.” Gondolom itt pontosabban a Project/Add Files to Project et kell választani, de itt csak vagy meglevő filet lehet választani, vagy a filenévhez beírni egy új nevet. Ezután katt a megnyitásra, majd látszólag nem történik semmi, az ablak eltűnése után szürke MPLAB felüleletet látok. Valamit azonban mégis sikerült elérni, mert a Project/Remove File From Project re kattintás után felhozza a korábban beírt filenév eltávolításának lehetőséget. Szóval hogy is lehet a kódot írni a projectben? Idézet: „Gondolom itt pontosabban a Project/Add Files to Project et kell választani” Nem jól gondolod. Kell nyitnod egy új szerkesztőablakot, (beleírni a kódot) és elmenteni, majd hozáadni a projecthez a project ablakban a source file alá. Javaslom, hogy keresd meg a gyártó oldalán az MPLAB Getting Started with MPLAB IDE tutorialját, és tanulmányozd át, illetve az alapján indíts egy projectet. Idézet: Eggyel mellényúltál, mert nem az Add Files to Project menüpontot kell választani, hanem az általam írt Add New File to Project menüpontot. „Gondolom itt pontosabban a Project/Add Files to Project et kell választani, de itt csak vagy meglevő filet lehet választani, vagy a filenévhez beírni egy új nevet.”
lassan azért haladok...
Már ott tartok, hogy az MPLAB elkezdi a fordítást, de hibával le is áll. "cannot open linker script file p24HJ128GP502"
Komolyan azt tervezed, hogy minden lépést megkérdezel, ami egyébként az előbb ajánlott dokumentumban le van írva? Egyrész már igen égő ez a bocaság, másrészt visszaélsz a türelmünkkel!
Én is csak azt tudom tanácsolni, hogy olvasd el a gyári dokumentációt, ha már úgyis ott van a telepítési könyvtárban. Egy magyar leírást pedig itt találsz.
Be kell állítani a korábban már emlegetett Set Language Toolsuite menüpontban az elérési útvonalakat. Be kell állítani a projekt opciókat. Be kell állítani az MPLAB IDE opciókat (de csak akkor, ha már tudod, hogy mi az, amit módosítasz!). |
Bejelentkezés
Hirdetés |