Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Idézet: Látogasd meg a PICCOLO projekt című oldalt, amit kifejezetten a PIC18F14K50 (meg a PIC18F4550) mikrovezérlőhöz készítek!„Próbanyákon összeraktam egy kis pic18f14k50-es áramkört, programozni lehet PICkit2-ve” Legjobb tudomásom szerint a C port kimenetként való használatához (LED villogtatás) csak a TRISC regisztert kell beállítani (amelyik bitbe 0-t írsz, az a bitje PORTC-nek kimenet lesz). Kimenet vezérlésekor PORTC helyett célszerűbb a LATC regisztert írását megszokni, mert a read-write-modify műveleteknél (bitműveletek) baj lehet! A PICCOLO projekt támogatói könyvtárában a LEDport eleve LATC-nek van definiálva). Ha bemenetként akarod használni valamelyik portlábat, akkor az ANSEL és/vagy ANSELH regiszterekben kell az analóg funkciót letiltani a megfelelő bit 0-ba állításával. (adatlap 9.4 alfejezete)
Lehet, hogy csak a PORTC írása volt a gond a LATC írása helyett. Minden esetre az adatlapban ez szerepel:
Idézet: „Note: On a Power-on Reset, RC<7:6> and RC<3:0> are configured as analog inputs and read as ‘0’.” Ráadásul az ANSEL és ANSELH regiszterekről azt mutatja az adatlap ("9.4 Port Analog Control" fejezet), hogy minden használt bitjük 1-be áll reset után, azaz minden analógba kapcsolható láb analóg bemenetként indul. Ennek ellenére ha a TRISC-vel engedélyezzük a kimeneti buffert, akkor lehet, hogy LATC-vel fog működni a kimenet, de én jobbnak látnám a digitális kimenetnek használt lábról az analóg funkciót letiltani a megfelelő ANSEL regiszterrel. Mellesleg a kollega elküldte este a kódot nekem, amire most rá is néztem, de szerintem nem az ANSEL-ekkel van a baj, hanem azzal, hogy más modulok (Timer1, MSSP) alternatív funkciói voltak engedélyezve, amik felülbírálták a láb digitális I/O voltát. Én jobban örülnék neki, ha az ilyen kérdések-válaszok a fórumon zajlanának, mivel más is tanulhat az esetből.
A PIC18F14K50 adatlapja azt is írja, hogy ha egy láb kimenetnek van állítva, akkor az ANSx bitnek nincs hatása a kimeneti funkcióra.
Lehet, hogy rossz szokás, de én még soha nem nyúltam az ANSEL bitekhez ennél a PIC-nél.
De ha olvasod a PORT-ot ilyenkor, akkor mindig 0-t kapsz az ANSEL állítása nélkül, nem? Legalábbis az adatlap idézete erre utal. Igaz, hogy ez a LAT-os kimenetkezelést nem befolyásolja.
(Van itthon egy ilyen PIC, de még nem jutottam hozzá, hogy foglalkozzak is vele. Ugye nincs a PICCOLO-ban kész próbaNYÁK-terved hozzá, hanem az eredeti low pin count-ot alakítottad kicsit át?) Idézet: Azt nem olvasom. A bitbillegtetést úgyis a LATC-n kell végezni.„De ha olvasod a PORT-ot ilyenkor, akkor mindig 0-t kapsz az ANSEL állítása nélkül, nem?” Idézet: Nincs, de nem is vagyok NYÁK gyártasra berendezkedve.„Ugye nincs a PICCOLO-ban kész próbaNYÁK-terved hozzá?” Egy másik topikban egyik fórumtársunk közzétett egy NYÁKtervet egy PIC18F14K50 USB-UART átlakító céláramkörre.
OK, most vettem észre, hogy itt is megy a téma, akkor bemásolom ide a jelenlegi kódot, amit szilva javaslataival módosítottam, hogy akkor ne csak őt zavarjam ezzel, talán nem hibáztam, de így sem működik a dolog.
Köszönöm előre is mindenkinek!
Ja és akkor a kérdésem:
Nem lehet, hogy egyéb, a C porttal nem kapcsolatos regisztereket is be kellene állítani az OSCCON, OSCCON2 és az OSCTUNE regisztereken kívül?
Köszönöm a választ, kétségtelenül megvan az adatlapban a válasz, de elkerülte a figyelmemet.
Összeraktam a programozott olvasni, tudom (3FFF) ha jól tudom, akkor üres a PIC
De programozni nem tudom, mert a folyamat végén ki írja, hogy (Verify failed at address 0000F!) annyit értek hogy az ellenőrzés folyamán hiba van de mi Remélem csak bealítási hiba A program neve IC-Prog 1.05e
eloszor ellenorizdd a programozo feszultsegeket. IC-Prog-ot en nem ismerem amugy, de ha ez a watt fele parhuzamos programozo, akkor O biztosan tud tanacsot adni ill az oldalan is biztosan van info.
Hiányoznak a konfigurációs bitek! Megpróbáltam egy lehetséges variációt összeállítani, de kipróbálni most nem tudom.
A PCLKEN = ON helyett lehet, hogy PCLKEN = OFF kell (az adatlapból nem világos, hogy ez csak a külső oszcillátort jelenti-e? Ha igen, akkor OFF-ba tehető). A PLL-t első körben kihagynám (hagyd ki a programból OSCTUNE írását!). T1CON, T3CON, OSCCON2 írása is fölösleges szerintem.
És ezeket hogy kellene beírnom a programba? Mivel így beírva build-eléskor hibát dob. Meg kell keresem azokat a regisztereket, amikben ezek szerepelnek, és azokat beállítani?
Ez legyen elől: include "p18f14K50.inc", utána jöjjenek a config kezdetű sorok. Ha nem ez volt a sorrend, akkor érthető a hibajelenség...
Így már működik.
Köszönök mindenkinek mindent! Akkor még átrágom, hogy miért is így kell.
Azért kell legelöl az #include, mert a becsatolt állomány definiál egyrakás szimbólumot, ami nélkül a továbbiakat "nem értené meg" a fordító. A konfigurációs beállítások pedig azért kellenek, hogy megfelelő üzemmódban induljon el az oszcillátor, meg a PIC többi része.
Ezek nélkül nem biztos hogy a PIC-nek eszébe jut, hogy megnézze, hogy mi is az első végrehajtandó utasítás... Nézd meg, légy szíves, hogy config PCLKEN = ON átírása config PCLKEN = OFF-ra esetén is működik? Ebben ugyanis magam sem vagyok biztos...
Üdv mindenkinek!
Szeretnék kérni egy kis segítséget a timerek számításához. Egy 877 es PIC et használok 4MHz es kvarccal. Ismert a kívánt frekvencia vagy késleltetési idő és a timerekkel kellene előállítani. Egyszerre csak egy menne. Kérdésem, hogy van e valami képlet amivel ki lehet számolni a kvarc értéke, kívánt frekvencia, késleltetési idő alapján a beállításokat? Előre is köszönöm.
Mi az a késleltetési idő ? Amúgy egy excel táblával ki tudod számolni, az elóosztó, órajel, stb figyelembevételével, hogy milyen sűrűn fog megszakítást okozni. Pl a mellékelt xls ben, timerrel és utólagos szoftveres utóosztóval megvalósított időmérés kalkulációja van. Látszik hogy pontos időméréshez, legjobb a 2 hatványa quartz. Persze lehet okosan elvégezni az osztást egész számokkal és akkor ez a hiba nem jelentkezik. És persze számít a nem direkt óra quartznak készült órajelforrások tűrése is. De itt most nem ez a lényeg, csak mintaként van az excel file.
Üdv!
A késleltetésen pl 20ms et értek. A számoláshoz max számológép áll rendelkezésre, ezért lenne szükségem valami képletre.
Amúgy nem bonyolult: a timer akkor fog megszakítást generálni ha túlcsordul a számlálója. A számláló pedig Fosc/4 ütemben számol. (ha a proci órajeléről jár, de mehet ugye külső órajelről is) Ezt lehet még előosztóval lassítani. Esetleg utóosztó is lehet, vagy szoftveresen egy számlálóval utóosztani. Lehet még megszakításkor tulcsordulás után feltölteni a timer számlálóját, hogy ne 0 -ról számoljon. Ezt már neked kell eldöntened. Tehát olyan csodaképletet ne várj ami minden lehetőséget lefed.
Ha pl timer0 al dolgozok, 4 MHz es a kvarc akkor ugye
4000000 / 4 = 1000000 Hz ezt osztom 256 tal (256 os osztó) = 3906,25 Hz Ha nem 0 ról számol hanem pl 128 ról akkor 256*128 at oszt? Ha igen, gondolom a timer1 re is igaz, csak ott 256 helyett 65536*ahonnan indul? A timer2 nél előosztó*utóosztó*ahonnan indul?
Ha nem értettem semmit félre a leírt számításaidból, akkor igen, így van. De ha biztosra akarnék menni, akkor elő kéne vennem az adatlapot megnézni, hogy melyik timer milyen elő és utóosztóval van ellátva, milyen beállítási lehetőségek vannak itt, és azt is, hogy melyik timer hány bites(még akkor is ezt kéne tennem, ha 95%-ban emlékszem rájuk!)
Tehát javaslom, te is tedd ezt és számolj a szerint, kiindulva abból, hogy nagyjából már érted a hogyant!
Üdv!
Ezeket onnan néztem, a timer0 az 8 bites, tehát max 256 lehet a kezdőérték, az osztásokat megnézve 2, 4, 8, 16, 32, 64, 128, 256 lehet. ha jól értelmezem akkor a leghosszabb idő amire képes az 1000000 / (256*256) = 15,25 Hz a legrövidebb idő pedig 1000000 / 256 = 3906,25 Hz ?
Hasonlóan Timer1 is: 65536 - ahonnan indul. Csak az a bökkenő, hogy ezt az "ahonnan indul" értéket nem tudod szoftveresen időveszteség nélkül beírni. Meg lehet próbálni figyelembe venni (kompenzálni), de ez bizonytalan, mint a kutya vacsorája (különösen, ha nem lehet előre tudni, hogy mit csinál közben a program). Mellesleg a CCS C projektvarázslójában van timer konfigurálási lehetőség, abban látod, hogy milyen időközönként fog megszakítást okozni egy timer.
Köszönöm a helyesbítést.
A progi asm ba íródik.
Én ezt úgy értettem, hogy van egy 256-os előosztó, és a 8 bites számláló 128-tól indul. Nem jól értettem akkor?
Igen, ezt jól látod.
Annyit még icserny kompenzálós mondandójához, hogy van megoldás kompenzálni megszakításban, de elég bonyolult, viszont nem az számít, ahonnan indul, hanem az, amennyi még vissza van. Tehát 255 esetén 1 lépés múlva fog túlcsordulni(8bites esetén) és nem 255 lépés múlva. Ha ezt eddig is értetted, akkor rendben!
Sziasztok
Egy adott ponton stack errorral elhalálozik a proramom és nem látom egyelőre az okát. C-ben ennyi lenne:
Avarage - double AAvarage[i] - uint Disassembly:
A legutolsó sornál száll ell. Ez gondolom valami beépített rutin címe, de nem találtam rá még leírást. dspic30f4013-ról van szó. Találkoztatok már ilyesmivel? Lehet hogy jobb lenne a szummázást asm-ban megcsinálnom...
És még annyi, hogy szimulátorban tökéletesen fut.
Mekkorára van beállítva a stack mérete? Próbáltad már növelni? (pl. MPLAB IDE Projects/Build Options/Project menüpontban MPLINK fülre kattintva)
|
Bejelentkezés
Hirdetés |