Fórum témák

» Több friss téma
Fórum » PIC - Miértek, hogyanok haladóknak
Lapozás: OK   707 / 1320
(#) icserny válasza meili hozzászólására (») Márc 21, 2010 /
 
Idézet:
„Próbanyákon összeraktam egy kis pic18f14k50-es áramkört, programozni lehet PICkit2-ve”
Látogasd meg a PICCOLO projekt című oldalt, amit kifejezetten a PIC18F14K50 (meg a PIC18F4550) mikrovezérlőhöz készítek!

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)
(#) szilva válasza icserny hozzászólására (») Márc 21, 2010 /
 
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.
(#) icserny válasza szilva hozzászólására (») Márc 21, 2010 /
 
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.
(#) szilva válasza icserny hozzászólására (») Márc 21, 2010 /
 
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?)
(#) icserny válasza szilva hozzászólására (») Márc 21, 2010 /
 
Idézet:
„De ha olvasod a PORT-ot ilyenkor, akkor mindig 0-t kapsz az ANSEL állítása nélkül, nem?”
Azt nem olvasom. A bitbillegtetést úgyis a LATC-n kell végezni.
Idézet:
„Ugye nincs a PICCOLO-ban kész próbaNYÁK-terved hozzá?”
Nincs, de nem is vagyok NYÁK gyártasra berendezkedve.

Egy másik topikban egyik fórumtársunk közzétett egy NYÁKtervet egy PIC18F14K50 USB-UART átlakító céláramkörre.
(#) meili válasza szilva hozzászólására (») Márc 21, 2010 /
 
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!

TUT452.asm
    
(#) meili válasza meili hozzászólására (») Márc 21, 2010 /
 
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?
(#) Blint válasza szilva hozzászólására (») Márc 21, 2010 /
 
Köszönöm a választ, kétségtelenül megvan az adatlapban a válasz, de elkerülte a figyelmemet.
(#) (Felhasználó 56240) válasza trudnai hozzászólására (») Márc 21, 2010 /
 
Ö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
(#) trudnai válasza (Felhasználó 56240) hozzászólására (») Márc 21, 2010 /
 
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.
(#) vilmosd válasza (Felhasználó 56240) hozzászólására (») Márc 21, 2010 /
 
Hali
Itt Bővebben: Link nezz szet minden nap felteszik ugyanezt a kerdest.
Udv Vili
(#) icserny válasza meili hozzászólására (») Márc 21, 2010 /
 
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.

  1. config CPUDIV   = NOCLKDIV  ; Nem osztjuk le az órajelet
  2.         config USBDIV   = OFF       ; USB-hez nem osztjuk le az órajelet
  3.         config FOSC     = IRC       ; Belső oszcillátor
  4.         config PLLEN    = OFF       ; 4x PLL tiltás
  5.         config PCLKEN   = ON        ; Elsődleges órajelgenerátor engedélyezve
  6.         config FCMEN    = OFF       ; Fail Safe Clock Monitor tiltása
  7.         config IESO     = OFF       ; Belső/külső oszcillátor átkapcsolás tiltása
  8.         config PWRTEN   = ON        ; Bekapcsoláskor 62 ms várakozás
  9.         config BOREN    = SBORDIS   ; Brown-out Reset hardveresen engedélyezve
  10.         config BORV     = 27        ; Reset szint = 2,7 V
  11.         config WDTEN    = OFF       ; Watchdog timer letiltva
  12.         config WDTPS    = 32768     ; Watchdog utószámláló beállítása
  13.         config MCLRE    = OFF       ; MCLR (reset) bemenet letiltva, RA3 bemenet
  14.         config HFOFST   = ON        ; Rendszer óra nem vár HFINTOSC-ra
  15.         config STVREN   = ON        ; A verem túlcsordulása RESET-et okoz
  16.         config LVP      = OFF       ; Alacsonyfeszültségű programozás letiltva
  17.         config XINST    = OFF       ; Extended Instruction Set

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.
(#) meili válasza icserny hozzászólására (») Márc 21, 2010 /
 
É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?
(#) icserny válasza meili hozzászólására (») Márc 21, 2010 /
 
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...
(#) meili válasza icserny hozzászólására (») Márc 21, 2010 /
 
Így már működik.
Köszönök mindenkinek mindent!
Akkor még átrágom, hogy miért is így kell.
(#) icserny válasza meili hozzászólására (») Márc 22, 2010 /
 
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...
(#) Thowra hozzászólása Márc 22, 2010 /
 
Ü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.
(#) lidi válasza Thowra hozzászólására (») Márc 22, 2010 /
 
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.

timer.xls
    
(#) Thowra válasza lidi hozzászólására (») Márc 22, 2010 /
 
Ü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.
(#) lidi válasza Thowra hozzászólására (») Márc 22, 2010 /
 
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.
(#) Thowra válasza lidi hozzászólására (») Márc 22, 2010 /
 
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?
(#) watt válasza Thowra hozzászólására (») Márc 22, 2010 /
 
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!
(#) Thowra válasza watt hozzászólására (») Márc 22, 2010 /
 
Ü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 ?
(#) icserny válasza Thowra hozzászólására (») Márc 22, 2010 /
 
  1. Ha nem 0 ról számol hanem pl 128 ról akkor 256*128 at oszt?
Nem, hanem 256-128-at! (Mivel mindig 256-nál csordul túl...)

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.
(#) Thowra válasza icserny hozzászólására (») Márc 22, 2010 /
 
Köszönöm a helyesbítést.
A progi asm ba íródik.
(#) watt válasza icserny hozzászólására (») Márc 22, 2010 /
 
É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?
(#) watt válasza Thowra hozzászólására (») Márc 22, 2010 /
 
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!
(#) steev hozzászólása Márc 22, 2010 /
 
Sziasztok

Egy adott ponton stack errorral elhalálozik a proramom és nem látom egyelőre az okát. C-ben ennyi lenne:
  1. Avarage+=AAvarage[i];

Avarage - double
AAvarage[i] - uint

Disassembly:
  1. 30A6  FB801E     ze [0x001c],0x0000
  2.   30A8  400080     add.w 0x0000,0x0000,0x0002
  3.   30AA  20C540     mov.w #0xc54,0x0000
  4.   30AC  408000     add.w 0x0002,0x0000,0x0000
  5.   30AE  780410     mov.w [0x0000],0x0010
  6.   30B0  B94061     mul.su 0x0010,#1,0x0000
  7.   30B2  07E8B8     rcall 0x000224

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...
(#) steev válasza steev hozzászólására (») Márc 22, 2010 /
 
És még annyi, hogy szimulátorban tökéletesen fut.
(#) icserny válasza steev hozzászólására (») Márc 22, 2010 /
 
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)
Következő: »»   707 / 1320
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem