Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
LCD counter
#21
(12-16-2016, 01:29 PM)vojinilic Wrote: Upravo to. Capture ce sve da uhvati.

Vojče,

kojom brzinom ?
koja su tu ograničenja ?
Reply
#22
Za HW capture module frekvencije su reda nekoliko desetina MHz!
Reply
#23
(12-16-2016, 01:34 PM)mikikg Wrote: Za HW capture module frekvencije su reda nekoliko desetina MHz!

Misliš li na moćnije dsPIC-ove ?
Šta je za očekivati ( ugrubo) recimo od 16F serije ?
Reply
#24
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?
Reply
#25
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.
Reply
#26
(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!

Misliš li na moćnije dsPIC-ove ?
Šta je za očekivati ( ugrubo)  recimo od 16F serije ?

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
Reply
#27
(12-16-2016, 01:43 PM)mikikg Wrote: 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 ...

Ima li neko li iskustva sa C30 kompajlerom ?
Reply
#28
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 Big Grin
Reply
#29
Odavno ne koristim C30, ja kad sam se "navratio" na PIC-eve krenuo sa XC8/16/32 … to znam koliko-toliko ...
Reply
#30
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 ?
Reply
#31
>>> 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 Smile Vise se isplati uzeti A/D konverter i semplovati Smile salim se ...
Reply
#32
// 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;
}


******
Reply
#33
Bas tako Vojce, to je interap rutina i to je cela pamet, sve ostalo po main() je igranje sa LCD i ostalim stvarima.
Reply
#34
Vojče, - BUILD FAILED

capture.c: In function '_IC2Interrupt':
capture.c47 error: 'btfss' undeclared (first use in this function)
capture.c47 error: (Each undeclared identifier is reported only once
capture.c47 error: for each function it appears in.)
capture.c47 error: syntax error before 'PORTDbits'
Reply
#35
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!!!
Reply
#36
(12-16-2016, 02:39 PM)Želja Wrote: Vojče, - BUILD FAILED

capture.c: In function '_IC2Interrupt':
capture.c47 error: 'btfss' undeclared (first use in this function)
capture.c47 error: (Each undeclared identifier is reported only once
capture.c47 error: for each function it appears in.)
capture.c47 error: syntax error before 'PORTDbits'

Zeljo,

moras u C-u da das direktivu da pises u asembleru. Zaboravio sam kako tasno.Probaj ovo:
_asm
onda ubaci moj kod
_endasm
Reply
#37
Znam da mora nekako ...
pokušaću ...

Znam tačno kako se to radi u PicBasicu, ali to mi sad nije od pomoći.
Reply
#38
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 !
Reply
#39
(12-16-2016, 02:39 PM)vojinilic Wrote: 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!!!

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.
Reply
#40
Za svaku liniju stavljaš asm("...");
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)