Rutina za kasnjenje signala
Moderators: pedja089, stojke369, [eDo], trax
-
- Posts: 5
- Joined: 31-01-2011, 18:31
Rutina za kasnjenje signala
Pozdrav kolege!
Pocetnik sam u programiranju PIC mikrokontrolera (16f887), programe nameravam da pisem u C-u.
Interesuje me kako se u praksi resava situacija kada je potrebno napraviti kasnjenje signala, sa nekog pina,
od na primer par sekundi do nekoliko minuta (naravno da mikrokontroler ovo radi u pozadini)?
To je na primer kada se javi neki signal pa se ceka npr. 20s pre nego sto se iskljuci neki uredjaj.
Napravio sam f-ju u C-u koja ovo realizuje ali cini mi se da je glomazna tj. ima puno parametara prilikom poziva:
tast3=t_on(&tast1,50,&b1,&preth1,&temp1,&brojac);
gde su:
tast1 - npr. portb.fo
50 - vreme koje se mnozi sa 100ms (5s)
&b1 - promenljiva u kojoj cu zapamtiti vrednost brojaca (koji se uvecava na svakih 100ms) kada detektujem uzlaznu ivicu signala tast1
&preth1 - promenljiva u kojoj cuvam vrednost prethodnog stanja signala
&temp1 - promenljiva u kojoj cu da cuvam prethodnu vrednost koju vraca f-ja
&brojac - vrednost brojaca koja se uvecava na svakih 100 ms
Ne znam kakva su resenja u praksi, pa molim iskusnije da predloze neko resenje.
Pozdrav.
Pocetnik sam u programiranju PIC mikrokontrolera (16f887), programe nameravam da pisem u C-u.
Interesuje me kako se u praksi resava situacija kada je potrebno napraviti kasnjenje signala, sa nekog pina,
od na primer par sekundi do nekoliko minuta (naravno da mikrokontroler ovo radi u pozadini)?
To je na primer kada se javi neki signal pa se ceka npr. 20s pre nego sto se iskljuci neki uredjaj.
Napravio sam f-ju u C-u koja ovo realizuje ali cini mi se da je glomazna tj. ima puno parametara prilikom poziva:
tast3=t_on(&tast1,50,&b1,&preth1,&temp1,&brojac);
gde su:
tast1 - npr. portb.fo
50 - vreme koje se mnozi sa 100ms (5s)
&b1 - promenljiva u kojoj cu zapamtiti vrednost brojaca (koji se uvecava na svakih 100ms) kada detektujem uzlaznu ivicu signala tast1
&preth1 - promenljiva u kojoj cuvam vrednost prethodnog stanja signala
&temp1 - promenljiva u kojoj cu da cuvam prethodnu vrednost koju vraca f-ja
&brojac - vrednost brojaca koja se uvecava na svakih 100 ms
Ne znam kakva su resenja u praksi, pa molim iskusnije da predloze neko resenje.
Pozdrav.
Re: Rutina za kasnjenje signala
Pa mozda da napravis delay funkciju koja ce raditi u odnosu na takt ( ovisno od PIC-a).
Evo jedna primjer za 8 Mhz clock funkcije definisane kao makro :
#define FOSC 8000000L
#define _delay(x)
{
unsigned char us;
us = (x)/(12000000/FOSC)|1;
while(--us != 0) continue;
}
Kasnije ovu funkciju mozes pozvati u dijelu koda gdje zelis delay. Ovaj primjer je za ms pa ako zelis da zakasnis za recimo 10ms onda pozoves jednostavno _delay(10) iz dijela kod gdje ti to treba.
Nadam se da sam dobro razumio sta si htio i da je to-to.
Evo jedna primjer za 8 Mhz clock funkcije definisane kao makro :
#define FOSC 8000000L
#define _delay(x)
{
unsigned char us;
us = (x)/(12000000/FOSC)|1;
while(--us != 0) continue;
}
Kasnije ovu funkciju mozes pozvati u dijelu koda gdje zelis delay. Ovaj primjer je za ms pa ako zelis da zakasnis za recimo 10ms onda pozoves jednostavno _delay(10) iz dijela kod gdje ti to treba.
Nadam se da sam dobro razumio sta si htio i da je to-to.
-
- Posts: 5
- Joined: 31-01-2011, 18:31
Re: Rutina za kasnjenje signala
Ako sam dobro razumeo program ce ostati u petlji sve dok ne istekne 10ms? Ja sam konkretno mislio na situaciju iz prakse kada na neki pin dovedes signal sa nekog kontakta (npr. nizak nivo vode u bazenu) i na osnovu toga hoces da iskljucis pumpu ali samo ako je signal sa pina prisutan npr. vise od 10s.
-
- Posts: 3
- Joined: 30-01-2011, 20:12
- Location: Beograd, Srbija
Re: Rutina za kasnjenje signala
Mislim da ti je najlakse da rutinu za kasnjenje uradis preko tajmera TIMER1 (poglavlje 6.0 u datasheetu za PIC). To je 16bitni tajmer (registri TMR1L i TMR1H) i koliko se secam kada koristis kristal od 10MHz on moze da broji vreme do nesto vise od 200ms. Posto kazes da dok tajmer broji vreme ti zelis da radis jos neke stvari sa kontrolerom predlozio bih ti sledece:
Zgodno je da namestis da ti TIMER1 generise interapte jer tako ce kontroler moci da radi nesto drugo a na TIMER1 ce obratiti paznju samo kada istekne maksimalno vreme koje on moze da izbroji. To je cini mi se ono sto tebi treba. Maksimalno vreme koje TIMER1 moze da izbroji mozes proveriti preko simulacije u programu.
Ne zaboravi da interapte podesis u INTCON i PIE1 registru, takodje obrati paznju na registre koji su vezani za TIMER1.
Posto si ustanovio da je bilo promene na pinu koji ti "gleda" nivo vode u bazenu ukljucujes TIMER1.
Nakon sto TIMER1 izbroji koliko moze desice se interapt. U interapt funkciji treba da se nalazi sledece:
Pitas da li i dalje imas informaciju o nivou vode. Ako imas, resetujes tajmer da bi poceo opet da broji iz pocetka, povecavas brojac, proveravas da li je brojac dostigao vrednost koja ti treba (tebi treba vreme n x vreme od timer1 ) i izlazis iz interapt funkcije.
Tako ces ulaziti u interapt funkciju na kraju svakog brojanja tajmera dok je brojac manji od one vrednosti sto si ti zadao a kontroler ce za vreme brojanja tajmera moci da radi nesto drugo sto si mu zadao.
Mozda sam se malko vise raspisao ali nadam se da sam ti pomogao. Ukoliko zapnes negde javi pa da pogledamo.
Pozdrav,
Milanche85
Zgodno je da namestis da ti TIMER1 generise interapte jer tako ce kontroler moci da radi nesto drugo a na TIMER1 ce obratiti paznju samo kada istekne maksimalno vreme koje on moze da izbroji. To je cini mi se ono sto tebi treba. Maksimalno vreme koje TIMER1 moze da izbroji mozes proveriti preko simulacije u programu.
Ne zaboravi da interapte podesis u INTCON i PIE1 registru, takodje obrati paznju na registre koji su vezani za TIMER1.
Posto si ustanovio da je bilo promene na pinu koji ti "gleda" nivo vode u bazenu ukljucujes TIMER1.
Nakon sto TIMER1 izbroji koliko moze desice se interapt. U interapt funkciji treba da se nalazi sledece:
Pitas da li i dalje imas informaciju o nivou vode. Ako imas, resetujes tajmer da bi poceo opet da broji iz pocetka, povecavas brojac, proveravas da li je brojac dostigao vrednost koja ti treba (tebi treba vreme n x vreme od timer1 ) i izlazis iz interapt funkcije.
Tako ces ulaziti u interapt funkciju na kraju svakog brojanja tajmera dok je brojac manji od one vrednosti sto si ti zadao a kontroler ce za vreme brojanja tajmera moci da radi nesto drugo sto si mu zadao.
Mozda sam se malko vise raspisao ali nadam se da sam ti pomogao. Ukoliko zapnes negde javi pa da pogledamo.
Pozdrav,
Milanche85
-
- Posts: 5
- Joined: 31-01-2011, 18:31
Re: Rutina za kasnjenje signala
Hvala na odgovoru.
Ja sam ovo slicno napravio sa TMR0 tako da se prekid desava na svakih 0.4ms. U interapt rutini inkrementiram neku promenljivu cnt, reinicijalizujem timer TMR0 i to je sve. U glavnom programu proveravam vrednost promenljive cnt i kada ona dogura do 250, inkrementiram promenljivu brojac a resetujem promenljivu cnt. Promenljiva brojac se menja sve vreme od 0 do 65535.
Kada se desi uzlazna ivica na pinu koji nadgledam, ja vrednost promenljive brojac upisem u neku pomocnu promenljivu a zatim gledam razliku izmedju promenljive brojac i vrednosti koje sam upisao
u pomocnu promenljivu. Kada ova razlika bude veca od zadate (npr. 100*100ms=10s) i vrednost pina je jos uvek na 1, ja prosledim teka tada 1 kao izlaz f-je.
Ne znam da li je ovo mnogo komplikovano i da li se ovo ovako radi u praksi?
Ja sam ovo slicno napravio sa TMR0 tako da se prekid desava na svakih 0.4ms. U interapt rutini inkrementiram neku promenljivu cnt, reinicijalizujem timer TMR0 i to je sve. U glavnom programu proveravam vrednost promenljive cnt i kada ona dogura do 250, inkrementiram promenljivu brojac a resetujem promenljivu cnt. Promenljiva brojac se menja sve vreme od 0 do 65535.
Kada se desi uzlazna ivica na pinu koji nadgledam, ja vrednost promenljive brojac upisem u neku pomocnu promenljivu a zatim gledam razliku izmedju promenljive brojac i vrednosti koje sam upisao
u pomocnu promenljivu. Kada ova razlika bude veca od zadate (npr. 100*100ms=10s) i vrednost pina je jos uvek na 1, ja prosledim teka tada 1 kao izlaz f-je.
Ne znam da li je ovo mnogo komplikovano i da li se ovo ovako radi u praksi?
Re: Rutina za kasnjenje signala
Dobro si to odradio ali povecaj vrijeme kojim tajmer ukljucuje interapt na nekoliko ms cak i desetak nije problem(tajmer 2) za mehanicke procese koje hoces kontrolisati, , moras paziti da ti duljina koda(vrijeme) koju izvrsavas u interapt dijelu koda ne bude duza od vremena koje si setovao u tajmeru za interapt.
-
- Posts: 5
- Joined: 31-01-2011, 18:31
Re: Rutina za kasnjenje signala
abc wrote:Dobro si to odradio ali povecaj vrijeme kojim tajmer ukljucuje interapt na nekoliko ms cak i desetak nije problem(tajmer 2) za mehanicke procese koje hoces kontrolisati, , moras paziti da ti duljina koda(vrijeme) koju izvrsavas u interapt dijelu koda ne bude duza od vremena koje si setovao u tajmeru za interapt.
Hvala na odgovoru. Jel mozes da mi pojasnis ovaj boldovani deo? Pozdrav
Re: Rutina za kasnjenje signala
shevchenko84, prvo procitaj pravila, i PM.
Drugo, radi se o tome, npr ako ti se interapt desava svakih 1mS, i npr sama obrada interapta traje 2mS.
To znaci da interapt nece moci da radi kako treba. tj nece se izvrsavati do kraja rutina, i stalno ce se prekidati i program ce ostati zaglavljen u interaptu...
To znaci da obrada interapte mora da krace traje od vremena izmedju 2 interapta.
U principu se uvek gleda da int rutine traju sto krace, i kad se dese, da se sto brze odrade, da sto manje remete izvrsavanje programa.
Drugo, radi se o tome, npr ako ti se interapt desava svakih 1mS, i npr sama obrada interapta traje 2mS.
To znaci da interapt nece moci da radi kako treba. tj nece se izvrsavati do kraja rutina, i stalno ce se prekidati i program ce ostati zaglavljen u interaptu...
To znaci da obrada interapte mora da krace traje od vremena izmedju 2 interapta.
U principu se uvek gleda da int rutine traju sto krace, i kad se dese, da se sto brze odrade, da sto manje remete izvrsavanje programa.
-
- Posts: 5
- Joined: 31-01-2011, 18:31
Re: Rutina za kasnjenje signala
Hvala na odgovoru!
Izvinjavam se zbog prekrsaja pravila .
Izvinjavam se zbog prekrsaja pravila .
Re: Rutina za kasnjenje signala
Dobio si odgovor zasto interapt rutina treba traje da krace od vremena izmedju interapta.
Ima tu jos "sitnica" koje znaju da zagorcaju zivot recimo , setujes hardver PIC-a i nisi do kraja setovao a ukljucio si neki interapt koji prekine program prije nego sto je PIC i uspeo pravilno da setuje hardver, a u medjuvremenu u interapt rutini se ukljucuje neki hardver koji nije pravilno setovan , recimo pinovi ulaz-izlaz, tajmeri itd. pa da vidis veselja, sve je ok a neradi kako treba, greska je samo u tome da nekoliko redova nize trebas prebaciti komandu za ukljucivanje interapta .
Ima tu jos "sitnica" koje znaju da zagorcaju zivot recimo , setujes hardver PIC-a i nisi do kraja setovao a ukljucio si neki interapt koji prekine program prije nego sto je PIC i uspeo pravilno da setuje hardver, a u medjuvremenu u interapt rutini se ukljucuje neki hardver koji nije pravilno setovan , recimo pinovi ulaz-izlaz, tajmeri itd. pa da vidis veselja, sve je ok a neradi kako treba, greska je samo u tome da nekoliko redova nize trebas prebaciti komandu za ukljucivanje interapta .
Re: Rutina za kasnjenje signala
Ja uvek na kraju setujem interapte, pre samog pocetka glavne rutine.
Tacnije posle definisanja promenljivih, imena, tris, ostalih registara int1int2, i tek onda na kraju stavim definisanje int registra, i ukljucivanje interapta.
Obicno mi je i prvi red intcon=0, koliko sam video nema potrebe, ali sto je sigurno sigurno je.
Tacnije posle definisanja promenljivih, imena, tris, ostalih registara int1int2, i tek onda na kraju stavim definisanje int registra, i ukljucivanje interapta.
Obicno mi je i prvi red intcon=0, koliko sam video nema potrebe, ali sto je sigurno sigurno je.