Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 38 odgovora
  • 9.711 pregleda

Najnovija ↓

Brojanje impulsa sa PIC-om 13.02.2011. u 19:16 · pre 191 mesec #1
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.
Potpis
frffr
Re: Brojanje impulsa sa PIC-om 13.02.2011. u 21:34 · pre 191 mesec
izmenjeno 1 put, poslednji put Stojan Trifunovic 13.02.2011. u 21:47
  1. Stojan Trifunovic13.02.2011. u 21:47zapis iz teksta poruke
#2
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.
Re: Brojanje impulsa sa PIC-om 13.02.2011. u 21:49 · pre 191 mesec #3
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
Re: Brojanje impulsa sa PIC-om 13.02.2011. u 23:09 · pre 191 mesec #4
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
Potpis
frffr
Re: Brojanje impulsa sa PIC-om 14.02.2011. u 11:07 · pre 191 mesec #5
Malo ti je losa ta rutina za enkoder. Pogledaj ovde kako bi to priblizno trebalo da izgleda (iz Proton+ i PBP nije tesko preraditi.
Re: Brojanje impulsa sa PIC-om 14.02.2011. u 11:25 · pre 191 mesec #7
Posto je enkoder "kvadraturni", sa tvojom rutinom bas neces najbolje uhvatiti napred/natrag.
Re: Brojanje impulsa sa PIC-om 14.02.2011. u 14:59 · pre 191 mesec #8
Č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?
Re: Brojanje impulsa sa PIC-om 14.02.2011. u 16:40 · pre 191 mesec #9
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.
Potpis
frffr
Re: Brojanje impulsa sa PIC-om 14.02.2011. u 18:43 · pre 191 mesec #10
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)
Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Re: Brojanje impulsa sa PIC-om 14.02.2011. u 19:08 · pre 191 mesec #11
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
Potpis
frffr
Re: Brojanje impulsa sa PIC-om 14.02.2011. u 19:21 · pre 191 mesec #12
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 ..
Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Re: Brojanje impulsa sa PIC-om 14.02.2011. u 22:23 · pre 191 mesec #14
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.
Re: Brojanje impulsa sa PIC-om 14.02.2011. u 22:30 · pre 191 mesec #15
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......
Potpis
frffr
Re: Brojanje impulsa sa PIC-om 14.02.2011. u 23:02 · pre 191 mesec #16
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
Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Re: Brojanje impulsa sa PIC-om 15.02.2011. u 02:30 · pre 191 mesec #17
uf,..kad se setim interapta dok nisam savladao,..

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

Pozdrav,..
Potpis
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
Re: Brojanje impulsa sa PIC-om 15.02.2011. u 05:55 · pre 191 mesec #19
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 .. 
   }
}


Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Re: Brojanje impulsa sa PIC-om 15.02.2011. u 06:05 · pre 191 mesec #20
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);
  //...
}


Potpis
arhimed
http://www.mysql.rs/ | http://elco.crsndoo.com/
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme