Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Brojanje impulsa sa PIC-om

[es] :: Elektronika :: Mikrokontroleri :: Brojanje impulsa sa PIC-om

Strane: 1 2

[ Pregleda: 6481 | Odgovora: 38 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

marinbnm

Član broj: 19868
Poruke: 256
*.adsl.net.t-com.hr.

Sajt: www.fmdream.net


+2 Profil

icon Brojanje impulsa sa PIC-om13.02.2011. u 18:16 - pre 160 meseci
Htio bi napraviti brojač, i to da mi radi tako što će brojati impulse koji dolaze sa optocouplera, koji su na vretenu jendog stroja, znači zazor prođe on napiše na LCD 1, pa 2, pa 3....i tako do određenog broja, onda idu sekunde, minute....to mi nije problem, problem mi je kako uzeti stanje sa pina, jer ako gledam kad je pin 1 onda će mi on cjelo vrijeme brojiti, što neću nego da odbroji samo jedan impuls (promjenu) jer ako bi stavio ovako da gleda kad je recimo porta.0 = 1 onda se može desiti da stroj stane na tom mjestu i ovaj broji ko lud, tu sam mislio koristiti interupt ali nemam s tim baš iskustva, još je možda malo delikatnije što su dva optocouplera pa svaki broji u svoju stranu, znači ako krene prvi onda broji u plus, ako drugi onda u minus, nešto kao rotary encoder. Ako netko ima prijedlog kako da sredim nek napiše.

frffr
 
Odgovor na temu

Stojan Trifunovic

Član broj: 15156
Poruke: 366
*.rs
Via: [es] mailing liste



+8 Profil

icon Re: Brojanje impulsa sa PIC-om13.02.2011. u 20:34 - pre 160 meseci
Sa interaptima Vam je svakako najjednostavnije rešenje. I nisu toliko komplikovani kada ih jednom savladate. Štaviše, nakon što naučite kako da ih upotrebljavate, možete se (kao ja) počinjati pitati kako ste uopšte mogli bez njih!

Postoji naravo i rešenje bez interapta.
Kažete da imate dva optokaplera od kojih jedan broji unapred, a drugi unazad.. Oba bi se mogla testirati ovako:

1. Da li je na prvom oprokapleru 1? Ako jeste, skoči na 6.
2. Resetuj flag prvog optokaplera.
3. Da li je na drugom optokapleru 1? Ako jeste, skoči na 8
4. Resetuj flag drugog optokaplera.
5. Vrati se na 1 (počni iz početka)

6. Da li je flag prvog optokaplera setovan? Ako jeste, vrati se na 3.
7. Uvećaj brojač, ispiši rezultat, setuj flag prvog i vrati se na 3.

8. Da li je flag drugog optokaplera setovan? Ako jeste, vrati se na 5 ili 1.
9. Smanji brojač, ispiši rezultat, setuj flag drugog i vrati se na 5 ili 1.

U inicijalizaciji je potrebno definisati brojač, a ne bi bilo loše ni proveravati da li je došlo do prekoračenja graničih stanja (ukoliko je to uopšte moguće) u koracima 7 i 9. Potrebno je takođe defnisati i dva flaga
(ovde sam ih nazvao flag prvog i flag drugog optokaplera). Oni ovde pamte prethodno stanje i ne dozvoljavaju uvecanje/umanjenje brojača dok se ne promeni stanje na njihovom optokapleru. Oni prilikom inicijalizacije moraju biti na log.0 (resetovani).

Istim principom moguće je proširiti program i za veći broj optokaplera (vratila).

Jedini problem ovakvog rešenja mogao bi biti ispis na LCD displeju, jer on ipak zahteva neko kratko vreme, a za to vreme može se preskočiti po koji impuls sa optokaplera. To se može rešiti smanjenjem brzine vratila
ili učenjem interapta. Izaberite sami.

[Ovu poruku je menjao Stojan Trifunovic dana 13.02.2011. u 21:47 GMT+1]
 
Odgovor na temu

rsinisa
Siniša Radanočević
Smederevo

Član broj: 2716
Poruke: 1586
*.dynamic.isp.telekom.rs.



+321 Profil

icon Re: Brojanje impulsa sa PIC-om13.02.2011. u 20:49 - pre 160 meseci
Znači tebi treba brojač napred-nazad. Besmisleno je koristiti interapt za tako nešto ako je to jedini njegov zadatak. Vidim da bi to da odradiš sa LCD displejom, a razmisli da li ti odgovara varijanta sa LED displejima. Ako da, pogledaj moj PIC panel, imaš rešen problem prikaza na 4 LED displeja u multipleksu preko interapta na prekoračenje TMR0, a rešenja za brojanje gore-dole sa kvadraturnim enkoderom imaš jako mnogo na internetu. Evo jednog od sajtova:
http://www.sxlist.com/techref/microchip/qenc.htm
Interapt nije potreban u ovom slučaju jer pratiš da li je bilo promene na izlazima optokaplera - ako nije, ne radiš ništa, ako jeste, nekom od ovih rutina odrediš smer i uvećaš ili umanjiš brojač. A i inače je, kako već rekoh, besmisleno koristiti interapt za ovako jednostvan zadatak. Pa ako PIC radi na 4 MHz, nije to uopšte malo!

Pozdrav.
Sinisha
 
Odgovor na temu

marinbnm

Član broj: 19868
Poruke: 256
*.adsl.net.t-com.hr.

Sajt: www.fmdream.net


+2 Profil

icon Re: Brojanje impulsa sa PIC-om13.02.2011. u 22:09 - pre 160 meseci
Evo i jendo zanimljivo riješenje na temu,. inače sam to pokupio sa interneta ali nemam pojima gdje, no tamo se koristiza rotacioni enkoder, što je ustvari ista stvar kao i što meni treba:

Code:
loop1:
if portb.1=0 then                 'uzlaz 1 optocouplera (npr desno "+") 
    counter=counter+1
    goto lcd
endif

if portb.0=0 then                 'ulaz 2 optocouplera (npr lijevo "-")
    counter=counter-1
    goto lcd
endif

goto loop1

lcd:
lcdout $fe,$c0,dec5 counter
while (portb.0=0 or portb.1=0):pause 10:wend
goto loop1

frffr
 
Odgovor na temu

Sepa011

Član broj: 161918
Poruke: 1817
..106.109.adsl.dyn.beotel.net.



+28 Profil

icon Re: Brojanje impulsa sa PIC-om14.02.2011. u 10:07 - pre 160 meseci
Malo ti je losa ta rutina za enkoder. Pogledaj ovde kako bi to priblizno trebalo da izgleda (iz Proton+ i PBP nije tesko preraditi.
 
Odgovor na temu

marinbnm

Član broj: 19868
Poruke: 256
*.adsl.net.t-com.hr.

Sajt: www.fmdream.net


+2 Profil

icon Re: Brojanje impulsa sa PIC-om14.02.2011. u 10:15 - pre 160 meseci
Zašto misliš da je loša?
frffr
 
Odgovor na temu

Sepa011

Član broj: 161918
Poruke: 1817
..106.109.adsl.dyn.beotel.net.



+28 Profil

icon Re: Brojanje impulsa sa PIC-om14.02.2011. u 10:25 - pre 160 meseci
Posto je enkoder "kvadraturni", sa tvojom rutinom bas neces najbolje uhvatiti napred/natrag.
 
Odgovor na temu

Stojan Trifunovic

Član broj: 15156
Poruke: 366
*.rs
Via: [es] mailing liste



+8 Profil

icon Re: Brojanje impulsa sa PIC-om14.02.2011. u 13:59 - pre 160 meseci
Ček, ček. Onda je i moj odgovor neispravan.

Da li ta dva optokaplera rade kao standardan rotirajući enkoder, ili jedan
treba brojiti samo unapred, a drugi samo unazad po svakom dovođenju impulsa?
 
Odgovor na temu

marinbnm

Član broj: 19868
Poruke: 256
*.adsl.net.t-com.hr.

Sajt: www.fmdream.net


+2 Profil

icon Re: Brojanje impulsa sa PIC-om14.02.2011. u 15:40 - pre 160 meseci
Upravo tako, ja sam sinoć se zagledao za kod i palo mi isto napamet i jutros kad sam vidio post, jer neki enkoderi kad idu u jednu stranu daju impuls samo u jednu, i tako za drugu stranu, ili je optički i daje impuls za impulsom kao što Sepa kaže, idem prekosutra pogledati to što je namontirano na vreteno pa javim ako ne riješim sam.
frffr
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Brojanje impulsa sa PIC-om14.02.2011. u 17:43 - pre 160 meseci
enkoderi na cnc masinama su u 99.9% slucajeva kvadratni, pitanje je samo da li imaju samo 2 izlaza ili vise njih (tako mozes da biras rezoluciju)

sto se tice brojanja impulsa, ako su impulsi iole impulsi a ne promene stanja, dakle nesto sto dolazi sa enkodera, nemoj da se zezas da radis tako sto u petlji citas status vec obavezno idi na to da ti promene pozivaju interapt... to je recimo jedan od razloga sto ja za takve projekte volem avr posto nije limitiran na b0 kao piconja .. iako za vecinu drugih stvari teram piconje/msp430 ili u zadnje vreme, sve vise arm... dakle ako ti je bitno da izbrojis svaki impuls - impulse vodi na interrupt pin i broj ih iz interrupta, nikako nemoj da ides na varijantu citanja porta u while petlji, jeste 20mhz "brzo" ali bez blama mozes da preskoci par signala tu i tamo posebno ako je neki malo bolji enkoder (vece rezolucije)
 
Odgovor na temu

marinbnm

Član broj: 19868
Poruke: 256
*.adsl.net.t-com.hr.

Sajt: www.fmdream.net


+2 Profil

icon Re: Brojanje impulsa sa PIC-om14.02.2011. u 18:08 - pre 160 meseci
Ne radi se u impulsima, nego promjenama stanja, iz 0 u 1 i obratno, znači dva optopcouplera i lim koji zaklanja svjetlo, kužite već......

A što se tiče petlje, misliš da bi bio i problem ako su promjene kao tu ili? 16F84 ima jedan INT na RB0 kako kažeš, dalo bi se riješiti sa nekim flip/flop na ulazu ali to je malo overkill ako mikrokontroler može odraditi :D
frffr
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Brojanje impulsa sa PIC-om14.02.2011. u 18:21 - pre 160 meseci
dva optokaplera sa 2 lima pod 90 stepeni ce da generisu kvadratni izlaz.

pitanje je samo koliko se brzo promene desavaju .. ako imas 1rpm to jest 4 promene u minuti, mozes sa while, ali ako imas preko 4000 promena u minuti onda ces sa while vec da imas problem sa picom na 20mhz

84 ima ako se ja dobro secam interapt na promenu na portu B .. dakle bilo koja promena na bilo kom pinu porta B moze da cimne interapt .. B0 je samo "direktan" interapt i malo je brzi od ostalih ..
 
Odgovor na temu

Darko_zed
Aleksinac

Član broj: 137277
Poruke: 2312
109.92.97.*

Sajt: www.proelektro018.com


+98 Profil

icon Re: Brojanje impulsa sa PIC-om14.02.2011. u 20:15 - pre 160 meseci
Bogdane dobro se secas bas je tako kao sto si rekao .
 
Odgovor na temu

Stojan Trifunovic

Član broj: 15156
Poruke: 366
*.rs
Via: [es] mailing liste



+8 Profil

icon Re: Brojanje impulsa sa PIC-om14.02.2011. u 21:23 - pre 160 meseci
Na 84 pored RB0 interapta na doloazak log 1 (ili 0, zavisi kako se podesi),
bilo koja promena (i sa 0 na 1 i sa 1 na 0) na RB4-BR7 pinovima izaziva
interapt. Mogu se koristiti dva od tih četiri pinova, dok ostala dva moraju
ostati neiskorišćena, ili se i oni mogu upotrebiti za drugi rotacioni enkoder
(na drugom vratilu).

I da, naravno, ako je u pitanju fabrički enkoder, on može imati i do 200
impulsa po obrtaju. Interapti su u tom slučaju OBAVEZNI. Ispis na LCD, ma
koliko malo vremena trošio, ipak zahteva i konverziju dobijenog brojača u
trocifreni ili četvorocifreni alfanumerički oblik pogodan za ispis na LCD, i
sve to treba pomnožiti sa 200. Mnogo je, čak i za 20MHz.

Ukoliko je reč o pravljenom enkoderu, sa npr. 1-2 impulsa u sekundi, možda bi
mogli proći i bez interapta koristeći C. U asembleru bi verovatno mogli
postići bar 20 impulsa u sekundi koristeći trikove poput upisivanja samo
izmenjenih karaktera na LCD. Ipak, mislim da se zaključak sam nameće. Naučite
interapte.
 
Odgovor na temu

marinbnm

Član broj: 19868
Poruke: 256
*.adsl.net.t-com.hr.

Sajt: www.fmdream.net


+2 Profil

icon Re: Brojanje impulsa sa PIC-om14.02.2011. u 21:30 - pre 160 meseci
Fora je što moram još koristiti LCD, pa ako kažeš da ostali pinovi porta a moraju biti slobdni ne znam dali mi sve stane, no nije problem ni uzeti 16F877 (jer ga imam trenutno).
Inače radi se o mjerenju cca 5-10 impulsa u sekundi max, ali 16F877 je već brži, a usput i idem pogledati interuptove......
frffr
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Brojanje impulsa sa PIC-om14.02.2011. u 22:02 - pre 160 meseci
nauci interapte, brojanje impulsa je idealan primer gde su interapti pravo resenje

dakle treba ti 2 pina sa porta b i to je to (B1 i B2 ili B0 i B1) .. lcd vezi de god oces imas dovoljno slobodnih pinova
 
Odgovor na temu

lm741
VOJVODINA

Član broj: 167617
Poruke: 672
*.mynsn.net.



+67 Profil

icon Re: Brojanje impulsa sa PIC-om15.02.2011. u 01:30 - pre 160 meseci
uf,..kad se setim interapta dok nisam savladao,..

Bogdane hvala ti,...vredelo je,..

Pozdrav,..
1. Ko zna više, bog mu je dalje
2. Ko zna manje, bog mu je bliže
3. Ko ništa ne zna, njemu bog može biti svako
 
Odgovor na temu

marinbnm

Član broj: 19868
Poruke: 256
*.adsl.net.t-com.hr.

Sajt: www.fmdream.net


+2 Profil

icon Re: Brojanje impulsa sa PIC-om15.02.2011. u 04:35 - pre 160 meseci
Pa jeli može tko podjeliti kakav tutorial ili što......jel' baš tako teeško? :D
frffr
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Brojanje impulsa sa PIC-om15.02.2011. u 04:55 - pre 160 meseci
pogledaj http://www.elitesecurity.org/t...ter-Putni-racunar-za-automobil tu imas primer kako se interapt poziva i za B0 i za B1

pogledaj lekciju 15 ovde: http://www.amqrp.org/elmer160/lessons/ imas kako se cita rotary encoder

ovde: http://www.arduino.cc/playground/Main/RotaryEncoders imas extra objasnjenje, doduse primer je za atmel a ne za pic, ali imas odlicno objasnjenje kako se cita enkoder

dakle

Code:

//prvo ide nekakav config (fuse bitovi, zavisi koji kompajler)

//onda implemetiras RB interrupt
#int_RB
void  RB_isr(void) 
{
  // obrati paznju da se ovaj interrupt desava na SVAKU PROMENU,
  // dakle i sa LOW-HIGH i sa HIGH-LOW

  // ovde sada obradjujes B1 i B2 da vidis sta se promenilo i na koju stranu
}

void main(){
// setuj klok i sta jos oces
// i finalno upali RB interupt

   //postavi IOCB1 i IOCB2 ako hoces da ti RB1 i RB2 okidaju RB interupt, proveri adresu IOCB porta na 84rki, 0x96 je za 887
   *0x96 = 0x06; 
   enable_interrupts(INT_RB);  
   enable_interrupts(GLOBAL);
   while(1){
     // ovde radi sta ti volja, ispisuj stvari na display etc .. 
   }
}



 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: Brojanje impulsa sa PIC-om15.02.2011. u 05:05 - pre 160 meseci
btw, najjednostavnije ti je da jedan pin enkodera vezes na interrupt a drugi da citas samo kada se desi promena na prvom, i u odnosu na drugi znas pravac... na primer deo koda kojim ja citam kvadratni enkoder (kojim menjam temperaturu), jedan pin enkodera je na B0 i trigeruje EXT interupt sa B0 dok je drugi pin na B5 koji ne trigeruje nikakav interapt. Na ovaj nacin imam duplo manju rezoluciju enkodera al "bas me briga" - kod je kraci i koristim samo jedan interrupt:

Code:

//...
volatile int16 target;

#int_ext
void detect_rb0_change() { //here we catch only RB0
  if (input(PIN_B0) == input(PIN_B5) ) {  //forward
      if(target < 27000) target += 50;
  } else { //backwards
      if(target > 1500) target -= 50;
  }
}

void main(){
  //...
  enable_interrupts(INT_EXT);//RB0
  enable_interrupts(GLOBAL);
  //...
}



 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: Brojanje impulsa sa PIC-om

Strane: 1 2

[ Pregleda: 6481 | Odgovora: 38 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.