Fórum témák
» Több friss téma |
Fórum » PIC - Miértek, hogyanok haladóknak
Sziasztok!
Az alábbi kis programot írtam pic18f25k80-ra. Az volna a lényeg, hogy egy motort tartsak állandó fordulatszámon, akkor is, ha változik a terhelés. A bejövő jel egy HALL szenzortól jövő négyszög jel. T: a HALL szenzor jelének elérni kívánt periódus ideje T1 és T2 a mért periódus idő. Tudom, hogy a periódus idők számolása nem OK, de ezen kívül más gondom is van. Az input capture-ök nem ott vannak a hol lenniük kéne. Lásd a fotót a felső a szenzor jele az alsó pedig akkor vált ha esemény van (lásd a kódot, az osztás az oszcilloszkópon 0,5 ms, az input capture a felfutó élre érzékeny). Nem telhet el ennyi idő a felfutó él és az esemény közt, hisz a timer tulcsordulását is leellenőriztem és ott az eltérés csak 0,01 ms volt a számolt értékhez képest Az adatlapban egyáltalán nem találom, hogy mi lehet a gond, tudnátok segíteni? Valaki tudna benne segíteni, hogy hogyan számoljam ki helyesen a periódusidőt? íme a program kód (C18):
A hozzászólás módosítva: Feb 5, 2013
Szia!
A programot csak felületesen néztem át és néhány olyan dolgot láttam, amit nem értek. Azt tudod-e, hogy a lebegőpontos számok használata megszakításban olyan, mint ha egy várakozási ciklust tettél volna bele? Rengeteg program lépés, mire a PIC végigrágja magát a sámításokon. De ez csak az egyik rész. Ha már CCP modult használsz capture módban, miért nem a Timer1 CCP regiszterekbe áttöltött értékéből számolod ki a periódust, ez előző és a mostani érték különbségéből? Mi szükség a segédváltozókra? A Timer megszakításban legfeljebb a túlcsordulásokat számold, amivel a CCP megszakításban kalkulálsz, ha két impulzus között a timer1 túlcsordulna. De motor esetében erről szerintem nem lesz szó, csak amikor áll a motor.
Mar bocsass meg, de idokritikus alkalmazast irni c-ben.... brrrr.
Legalabb assembly betetet alkalmazz, ha a feladat megkivanja. Az ember szine feher. A PIC nyelve asm.
Szia! Igazad van, de ebben az esetben a CCP modul leveszi(levenné) a terhet az időkritikus részről, a többi elfér C-ben. Ezt szerintem meg lehet írni C-ben is gond nélkül.
Idézet: Hm, majd próbálj meg beletölteni egy asm fájlt, mindjárt rájössz, hogy nem... „A PIC nyelve asm.” Idézet: A volt főiskolai tanárom azt mondta erre, hogy ezt azok szokták hangoztatni, akik nem foglalkoztak/ foglalkoznak a C nyelvvel és nem ismerik....„A PIC nyelve asm.” Szerintem az igazság valahol a kettő között van, mindegyik nyelvet jó lenne ismerni és dönteni, hogy az adott feladathoz melyik illeszkedik jobban, mindenféle tényezőket figyelembe véve.
Mégis, ha egy kontroller programját vissza kell fordítani (ellenőrzés végett), mindig asseblyre fordítják vissza. Ha valami kétely merül fel a lefordított kóddal kapcsolatban, akkor is az assembly lista segít. Hátrányként szokták emlegetni, ha egy magas szintű nyelv nem teszi lehetővé a könyvtári függvényei assembly szintű nyomkövetését.
Ez igaz, de egy abszolút kezdőnek nagyon hamar lehet sikerélménye egy hello word!-el, ha fogalma sincs a belső felépítésről, címzésekről, Bank-okról, stb... A mostani PIC-ek meg már elég jó paraméterekkel rendelkeznek és nem jelent gondot ezen a szinten a debug hiánya, vagy, hogy elfogyna a memória...
Az jelen feladatot mindkét nyelven hasonló hatékonysággal meg lehet írni. Nekem mindkét nyelv a szívem csücske lett, pedig asm-al kezdtem. Most keverem a kettőt, mikor C-ben programozok, akkor is asm szerűen oldom meg a feladatokat, nem úgy, mint ha PC-n írnám C-ben.
Sziasztok!
Lehet egyszerre használni az ADC-t és a Comparátort? (a lábakat értelemszerűen megosztva). Még ilyet nem csináltam és az adatlapban nem igazodok el. (18F4550) Két AD bemenet kéne Vss reffel és egy Comparátor nullátmenet detektálásra. Köszi!
A lábakat nehéz lesz kisakkozni a kötöttségek miatt. Talán a CM2,CM1,CM0 = 001 beállítás áll legközelebb ahhoz, amit mondtál. De ekkor csak RA1 és RA2 használható az ADC-hez, RA0 és RA3 pedig a komparátorhoz. Nem tudom, hogy működőképes-e ez a kombináció.
Szia! Erre a kiosztásra gondoltam én is, de nem tudom, hogy a két periféria üti-e egymást. Lehet, hogy akár a komparátor bemenetén a feszt is meg lehet mérni ugyanazon lábon az AD-vel? Végül is miért ne! Na majd kipróbálom! Köszi!
Köszönöm a segítséget, közben megoldottam.
Idézet: „A PIC nyelve asm.” Minden tiszteletem annak aki asm.-ben összedob egy bonyolultabb programot pl. egy jobbfajta motorvezérlőt, részemről a C teljesen megfelelő (am. asm-ben is tudok programozni, de nem igazán vagyok oda érte ) A hozzászólás módosítva: Feb 6, 2013
Működik. Már nem emlékszem melyik tipuson, de én csináltam olyat, hogy komparátornak használtam egy bemenetet és mértem rajta AD-vel is.
Én a tápfeszt kötöttem rá, ami ha egy bizonyos szint alá esett (komparátor), akkor megszakítást generált. Időnként meg megmértem ugyanazon a lábon a tápfeszt és felhasználtam a mért értéket.
PIC18F26K80
Ehhez a kontrollerhez most fogtam hozzá és már az elején egy hibába botlottam. Rengeteget olvastam és kerestem a neten, hátha találok valami leírást, de sajna nem. A hiba röviden. Az RB4 lábat ha folyamtosan magasra állítom, akkor egy órajelnyi impulzus van a kimeneten folymatosan, nincs stabilan magasban. Elvileg mindent beállítottam ami kellhet, de nem tudom mi okozza ezt a (számomra) hibát. MPLAB 8.88 és C18 9.80 a fejlszető környzet. Valakinek ötlete, hogy mi okozhatja?
A hozzászólás módosítva: Feb 8, 2013
Csak egy altalanos jotanacs: ezeknel a PICeknel mar tul sok a regiszter es ezert egyes funkcioregiszterek nem erhetok el direktben, hanem a BANKot is allitani kell hozza. Talan ez okozhatja nalad is a hibat. Pl. az ANCON maris kivul van ezen.
Egyebkent megnezhetned, hogy csak magas szintet nem ad-e ki vagy egyaltalan nem is valt outputba, magyaran lehuzza-e a 4K7-en keresztul adott tapot... A masik lehetoseg, hogy a PWM outputot nem allitottad jol, a fent emlitett okok miatt. A hozzászólás módosítva: Feb 8, 2013
Tudtommal, a fordító automatikusan váltja a bankot.
Az RB4-es kimenetre (és még néhányra) egy LED van kötve és a LED halvánnyabban világít a többihez képest. Szkóppal nézve egy órajelnyi impulzusig megy magasra a kimenet, majd alacsonyba vált, pedig a program szerint folyamatosan magasban kellenne lennie. 62.5ns-ig 5V, majd kb 1.8us-ig 0V, majd megint 62.5ns-ig 5V és így tovább. Folyamatos impulzus vana kimeneten.
Jól gondolod, a bankváltósdival csak az assemblyben dolgozóknak kell foglalkozni.
Ha minden terhelést leszedsz a lábról (LED), akkor is ugyanezt csinálja? Elvileg lehetne valami kalandor periféria, de alapból mindegyik periféria kimenet le van tiltva, azért egy CCP1CON = 0 nem árthat. A jelenség alapján a CCP/PWM perifériára gyanakodnék leginkább. A hozzászólás módosítva: Feb 9, 2013
CCP1CON = 0 berakva, ugyan az a hiba...
Ha lekötöm a LED akkor is ugyan az. Errata átolvasása után nem találtam benne semmi infót ami ilyen jelenségre utal. Most már hullik a hajam... Bagatel dolog és nem haladok. A hozzászólás módosítva: Feb 9, 2013
Nézz körül az adatlapban az RB4 IO port résznél a CTPLS funkció körül! (CTPLS=> CTMU pulse generator output)
Egyrészt kapcsold át az RB4 lábat digitális üzemre, mert analóg üzemben van - ANCONx regiszterek valamelyike. Másrészt ha már 18F, akkor kimenetként használva nem a PORTx, hanem a LATx biteket kellene használni. Látszólag az utóbbi is megoldaná a problémádat, de az előbbit is csináld meg és szokd meg, hogy kell.
Úgy néz ki egy órajel időre 5V, 3-ra 0V RB4. Lehet valami PWM hiba, bár CCP1CON = 0 esetén ki van kapcsolva. Próbáld meg PSTR1CON = 0. Esetleg másik IC-vel is próba.
A megoldás a LATx bitek használata!
A bemenetek és kimenetek előtte már át voltak kapcsolva digitálisra. Köszi a segítséget!
Nem, nem voltak, a kódodban nincsenek átkapcsolva! Ha át lettek volna, akkor a PORTx-el is működött volna!
A hozzászólás módosítva: Feb 9, 2013
Amit ide beraktam, abban tényleg nem voltak átkapcsolva csak az utána következő probálkozásokban. Azokat nem raktam be ide. Mikor a be és kimeneteket átirtam LATx-re azonnal megjavult.
Most jeleneleg az a konfig: OSCCONbits.IRCF = 0b111; //16MHz OSCTUNE = 0b11011111; TRISA = 0b11111111; TRISB = 0b11000011; TRISC = 0b10100001; CTMUCONH = 0; ADCON0 = 0x00; ADCON1 = 0x00; ADCON2 = 0x00; REFOCON = 0; INTCON = 0; CCP1CON = 0;
Érdekes, adatlap szerint:
Idézet: „CLRF PORTB ; Initialize PORTB by ; clearing output ; data latches CLRF LATB ; Alternate method ; to clear output ; data latches” A hozzászólás módosítva: Feb 9, 2013
Na igen, ha csak nem valami bug van a kontrollerben.
Ebben sincs átállítva digitális módba az RB4 láb. Mondom, ANCONx regiszterek.
|
Bejelentkezés
Hirdetés |