12-16-2016, 01:31 PM
LCD counter
|
12-16-2016, 01:34 PM
Za HW capture module frekvencije su reda nekoliko desetina MHz!
12-16-2016, 01:36 PM
12-16-2016, 01:37 PM
Nije baš tako. U Capture modu par registara CCPRxH i CCPRxL uhvati vrednost TMR1H i TMR1L i to u trenutku kada se desi događaj na CCP pinu. Ovo je OK za merenje frekvencije. Šta je sa brojanjem?
Tačno Gorane,
Sve ide u CCPRxH i CCPRxL Ako pustiš u nedogled imaš capture interapt, ili samo prekoračenje pa ponovo u krug. Frekvenciju upravo dobijaš "brojanjem" ali u odredjenom vremenskom periodu. Ako nema tog vremenskog perioda, imamo braojač do max. vrednosti u CCPRxH i CCPRxL ako hoćemo preko toga, onda capture interaptom inkrementujemo novi registar. Kod merenja frekvencije, u trenutku TMR interapta - pročitamo sadržaj CCPRxH i CCPRxL Kod brojanja impulsa samo čitamo sadržaj CCPRxH i CCPRxL u 16-bitnom formatu. (12-16-2016, 01:36 PM)Želja Wrote:(12-16-2016, 01:34 PM)mikikg Wrote: Za HW capture module frekvencije su reda nekoliko desetina MHz! Mislm da je moguce to raditi i sa 16F ili 18F MCU, dsPIC je bar 2-3x brzi od njih po tom pitanju. dsPIC je recimo dovoljno brz (dovoljno za 150kHz) da se radi brojanje preko interapta i SW brojaca. (dsPIC ima preko 50-70MIPS, kuva to junacki brzo) Ta interapt rutina bi bila minijaturna, treba samo da uradi "brojac += 1" ili "brojac -= 1" … to moze bas brzo da se izvrsava i da radis ako hoces sa 32/64 bitnim brojacima … Sva ostala SW logika je van interapta i ona se izvrsava "kad stigne", nema tu problema te prirode, i onako ce main() petlja biti reda milisekunde jer je sporo osvezavanje LCD-a
12-16-2016, 02:01 PM
Timer1 modul se namesti da radi kao brojač stim da broji na pinu T13CKI. Tako sam uradio sa PIC18F4620 i radi ok za vrednosti koje si naveo (2us impuls 5us pauza). Imam neki overflow za vrednosti brojača veće od dva bajta ali ću i to da podesim samo kasnije sad imam neka posla. Capture mi i dalje ne pije vodu. Aj kad uradiš baci ovde da vidim šta ja to ne vidim
12-16-2016, 02:02 PM
Odavno ne koristim C30, ja kad sam se "navratio" na PIC-eve krenuo sa XC8/16/32 … to znam koliko-toliko ...
Evo šta mi treba:
Imamo sledeći kod u C30: (ispitujemo stanje direction ulaza kroz capture interapt) (interapt nastaje i na ulaznoj i na silaznoj ivici) // handled on every state change void __attribute__((__no_auto_psv__, __interrupt__)) _IC2Interrupt(void) { IFS0bits.IC2IF = 0; // clear IF checkDir(); } void checkDir(void) { if(DIR) CLKCNT = 1; else CLKCNT = -1; } ****** Hteo bi izbeći pozivanje potprograma checkDir iz interapta, odnosno direktno posle brisanja zastavice interapta, umetnuti BLOK u asembleru u koji bi ispitao stanje Direction ulaza u PIC koji je izazvao interapt, ali bez upotrebe IF-ELSE nego direktno u ASM - zbog brzine . Kako bi trebalo napisati ASM blok umesto IF-ELSE ?
12-16-2016, 02:21 PM
>>> dsPIC je recimo dovoljno brz (dovoljno za 150kHz) da se radi brojanje preko interapta i SW brojaca.
IS rutina vrsi neku "matematiku" na svaki interapt, procesira ga, to je DSP, stim sto ta IS moze da ima uvezanu mapu koeficijenata koja se ciklicno izvrsava i tako se recimo prave FIR i IIR filteri, "red" filtera zavisi od mogucnosti, recimo 20-og reda LPF ili 200-og reda … !!! Moze da se radi DSP u realnom vremenu nad 150kHz impulsima Vise se isplati uzeti A/D konverter i semplovati salim se ...
12-16-2016, 02:27 PM
// handled on every state change
void __attribute__((__no_auto_psv__, __interrupt__)) _IC2Interrupt(void) { IFS0bits.IC2IF = 0; // clear IF btfss DIR goto CLEAR movlw 1 movwf CLKCNT goto Izlaz CLEAR movlw 0xFF ;ovo je u drugom komplementu -1 movwf CLKCNT Izlaz } void checkDir(void) { if(DIR) CLKCNT = 1; else CLKCNT = -1; } ******
Bas tako Vojce, to je interap rutina i to je cela pamet, sve ostalo po main() je igranje sa LCD i ostalim stvarima.
12-16-2016, 02:39 PM
Vojče, - BUILD FAILED
capture.c: In function '_IC2Interrupt': capture.c error: 'btfss' undeclared (first use in this function) capture.c error: (Each undeclared identifier is reported only once capture.c error: for each function it appears in.) capture.c error: syntax error before 'PORTDbits'
12-16-2016, 02:39 PM
Treba samo preurediti prema Zeljinim nazivima promenljivih.Moze ovo i brze:
movlw 0x01 movwf CLKCNT btfsc DIR goto INTEND comf CLKCNT,f INTEND Kako sam nekada voleo asembler (Miki to dobro zna :-)). Nisam ga koristio sigurno 10 godina. Neke stvari se ne zaboravljaju!!!
12-16-2016, 02:41 PM
(12-16-2016, 02:39 PM)Želja Wrote: Vojče, - BUILD FAILED Zeljo, moras u C-u da das direktivu da pises u asembleru. Zaboravio sam kako tasno.Probaj ovo: _asm onda ubaci moj kod _endasm
12-16-2016, 02:43 PM
Znam da mora nekako ...
pokušaću ... Znam tačno kako se to radi u PicBasicu, ali to mi sad nije od pomoći.
Evo ispravnog koda za jednu asm liniju:
// IRQ handler for IC2 (RD1) = DIR // handled on every state change void __attribute__((__no_auto_psv__, __interrupt__)) _IC2Interrupt(void) { IFS0bits.IC2IF = 0; // clear IF checkDir(); asm ("nop"); } *** Ne uspevam kompajlirati sa više ASM linija ??? Mora li svaka linija početi sa ASM ? , ili može jednostavnije ? asm ("nop"); asm ("nop"); asm ("nop"); Ovako može ... , ali sigurno može jednostavvnije !
12-16-2016, 02:52 PM
(12-16-2016, 02:39 PM)vojinilic Wrote: Treba samo preurediti prema Zeljinim nazivima promenljivih.Moze ovo i brze: Tako je, "prebrojite" koliko je to clock-ova i dodajte jos nekoliko za in/ret od ISR i to je maksimalna brzina koja moze da se uzorkuje.
12-16-2016, 02:54 PM
Za svaku liniju stavljaš asm("...");
|
« Next Oldest | Next Newest »
|
Users browsing this thread: 4 Guest(s)