Pozdrav svima.Poceo sam poodavno da napisem kod za frekvencmetar koji ce raditi do 65535Hz pa kasnije da ga preuredim ali mi nikako neuspeva da mi proradi za sad u proteusu.Evo nekog koda koji sam pronasao pa ako moze neka izmena da to proradi.Probao sam sve sto sam znao i sto mi je palo napamet ali neide pa bih zato zamolio za pomoc.
DEFINE LCD_BITS 4
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 0
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 3
DEFINE LCD_LINES 2
pause 100
lcdout $FE, 2
lcdout $FE, $80, "BROJ="
capture VAR PIR1.2 ' CCP1 capture flag
overflow VAR PIR1.1 ' Timer1 overflow flag
period VAR WORD ' Word variable that stores the value
broj var word
TMR1_Vred Var word
TMR1_Vred = 64536
CCP1CON = %00000100 ' Enable the CCP1 capture, falling edge
T1CON = %00000011 ' TMR1 prescale=1, and turn it on (1uS per count)
mainloop:
IF (capture = 0) Then mainloop ' Wait here until captured
TMR1L = TMR1_Vred.lowbyte 'Postavi TMR1 na 64536
TMR1H = TMR1_Vred.highbyte
period.lowbyte = CCPR1L ' Store the captured value in
period.highbyte = CCPR1H ' period variable
IF overflow = 0 Then ' Skip the output if the timer overflowed
lcdout $FE, $80, "BROJ=",#broj
EndIF
capture = 0 ' Clear the capture flag
lcdout $FE, $80, "BROJ=",#broj
reset:
IF (capture = 0) Then reset ' Wait for beginning of next period
TMR1L = 0 ' Clear Timer1 low register
TMR1H = 0 ' Clear Timer1 high register
capture = 0 ' Clear capture flag
overflow = 0 ' Clear overflow flag
GoTo mainloop ' Do it forever
End
Kod je u redu. Samo tmr treba postaviti na 0.Premalo informacija si dao za bilo sta.
Sta ne radi? Zasto ne radi? gde zapleo? Da li kontroler izvrsava uopste kod? Da li radi displej? Da li radi prikaz broja na displeju? Da li meri bilo sta? Kako si dovodio ulazni signal? Gde si ga dovodio? Amplitude? Frekfencije?
Samo par pitanja za pocetak rasprave o tome sta bi moglo da ne radi...
Na displeju samo pokaze nulu,ja sam to radio u proteusu pa ako proradi onda da ga napravim medjutim neide nikako.Kad pustim u priteusu sve je kao normalno i neprijavljuje greske ali i nemeri.Signal uvodim iz generatora u proteusu,stavio sam da budu 100Hz i nista,onda sam komandu za displej pomerao na nekoliko razlicitih mesta i opet nista tj.probao sam jos dosta stvari da uradim i kad nije uspelo ja sam ga ovde na forumu postavio onako kako sam ga skinuo.Iznem ja zamo za displej jer je u originalu bila komanda za setiski port.Evo odakle je to
evo sad ovako i na displeju pise 06439 Sve sam probao sto mi je palo napamet i neide.Ako mozete pomagajte,ja bih jos pokusavao sa ovim ali vise stvarno neznam sta da mu radim,sve sam probao sto sam znao
period VAR WORD ' Word variable that stores the value
broj var word
TMR1_Vred Var word
TMR1_Vred = 64536
CCP1CON = %00000100 ' Enable the CCP1 capture, falling edge
T1CON = %00000011 ' TMR1 prescale=1, and turn it on (1uS per count)
trisc = 1
mainloop:
IF (capture = 0) Then mainloop ' Wait here until captured
TMR1L = TMR1_Vred.lowbyte 'Postavi TMR1 na 64536
TMR1H = TMR1_Vred.highbyte
period.lowbyte = CCPR1L ' Store the captured value in
period.highbyte = CCPR1H ' period variable
lcdout $FE, $80, "BROJ=",#period
IF overflow = 0 Then ' Skip the output if the timer overflowed
EndIF
capture = 0 ' Clear the capture flag
reset:
IF (capture = 0) Then reset ' Wait for beginning of next period
TMR1L = 0 ' Clear Timer1 low register
TMR1H = 0 ' Clear Timer1 high register
capture = 0 ' Clear capture flag
overflow = 0 ' Clear overflow flag
Ok. Znaci ipak radi, samo ne broji.
Na koji pin dovodis signal? Koji oblik signala? Koja amplituda? I ne vidoh nigde koji pic si stavio u proteusu?
Daj sliku simulacije dok radi, i sa zakacenim osciloskopom i otvorenim. Pa da vidimo sta je sa signalom.
nece slika da se posalje,neznam zasto.Na osciloskopu su cetvrtke.Uvodim signal u RC1 mada kad vise nisam znao sta cu pokusavao sam i u RC0 i RC1 ali prikaz na displeju imam samo na RC2 dok na 0 i 1 mi nepokazuje nista na displeju.Slika mi je jpg ali stvarno neznam zasto nece da se posalje.Cim pokazuje nesto na displeju mislim da tu nije greka u definiciji displeja sem mozda u programu da se nalazi na pogresnom mestu.Pokusacu ponovo za sliku da vam posaljem.Pic je 16f877A na 4MHz. I ono u dodjem delu proteusa mi je zeleno,nema znak ! i da ispisuje neke greske.
Sve sam probao i tako sam iskopirao kod dok mi je bili neki od pokusaja u toku.Video sam u DS da treba na RC2
ali kad vise nisam znao sta cu onda... kako kazu kad nas "cesas se gde te ne svrbi" i eto,nesto sto treba da je prosto mene muci vec dvadesetak dana jer treba mi takav frekvencmetar za dosta ozbiljniju stvar gde treba pustiti uvek paran broj perioda jer u pitanju je trafo od nekoliko KA. Neznam sta dalje da navedem dabiste mogli da uvidite gresku koju pravim
Al ti onda volis da komplikujes...
Sto odma ne rece sta ti treba. Ovo meri jednu poluperiodu. Tako da od ovoga koristi ne bi imao.
Ali ajde jos jednom razmisli da li je tacno to sto si napisao. Kazes paran broj perioda? Pa kakve veze ima da li je paran ili ne? Da nisi mislio na poluperiode? Da ako iskljucis na pozitivnu poluperiodu, pa kad ga opet ukljucis na pozitivnu, bojis se da jezgro ne ode u zasicenje?
Za to ima puno jednostavnije resenje.
Za jednosmernu pulsirajucu, nema negativnih poluperioda. E zato mi treba ovako prostiji kod jer njega cu znati kako da ubacim i prilagodim a i da dodam joj nesto ako zatreba ali sve to ako ovo proradi. Ja nisam bas nesto vest u programiranju pa sam se zato javio da zamolim za pomoc pa kad proradi onda je sve lakse za nadalje.
SYMBOL LED=PORTB.7
SYMBOL TASTER=PORTB.0
INPUT TASTER
Brojac var byte
NovoStanje var bit
StaroStanje var bit
starostanje = taster ' ovde se uzima pocetno stanje, tj stanje kada je taster pusten
brojac=0
Pocetak:
novostanje = taster 'OVDE SE UZIMA TRENUTNO STANJE NA TASTERU
if novostanje<starostanje then
brojac=brojac+1
if brojac>1 then
brojac=0
'Ovde stavi da radi sta god treba npr
If PaliGasi=0 then
izlaz=0
else
izlaz=1
endif
endif
ENDIF
STAROSTANJE=NOVOSTANJE
GOTO POCETAK
END
Nikakve pauze i blokirajuce komande ne dolaze u ovbzir u ovakom programu
PaliGasi moze da bude pin na kontroleru na koji je zakacen prekidac. Moze da bude i promenljiva koju ces na postaviti na 1 ili 0 u zavisnosti od cega god.
Taster je ulaz na koji dolazi taj pulsirajuci napon.
Probacu nesto.Oco definitivno nece a neznam zasto, nema logike da neradi a ipak neradi dok na pr. program koji meri trajanje periode proradio na prvu, po istom principu kao ovaj za frekvencmetar.
daje neke znake zivota,kad mu menjam u proteusu frekvenciju na ulazu menja se i rezultat na displeju ali nije ni priblizno tano.Moze li se sad videti i ispraviti greska ? Oci mi ispadose pored kompa i nevidim vise sta da mu uradim.Evo sad sa ovim izmenama,mozda sam samo pogresio redosled kako sta da konfigurisem,neznam.Samo bar da hoce do 65535 i netreba nista drugo jer koliko toliko razumem kako bi ovo trebalo da radi pa nadalje mogu da ga prilagodim kako mi sta treba.
portc.2 = 1
capture VAR PIR1.2 ' CCP1 capture flag
overflow VAR PIR1.1 ' Timer1 overflow flag
period VAR WORD ' Word variable that stores the value
period = 0
broj var word
broj = 0
TMR1_Vred Var word
TMR1_Vred = 64536
CCP1CON = %00000101 ' Enable the CCP1 capture, falling edge
T1CON = %00000001 ' TMR1 prescale=1, and turn it on (1uS per count)
intcon.6=0 '================
intcon.7=0 '====================
pie1.2=1 '=======================
pie1.0=1 '========================
mainloop:
IF (capture = 0 ) Then mainloop ' Wait here until captured
TMR1L = TMR1_Vred.lowbyte 'Postavi TMR1 na 64536
TMR1H = TMR1_Vred.highbyte
period.lowbyte = CCPR1L ' Store the captured value in
period.highbyte = CCPR1H ' period variable
IF overflow = 0 Then ' Skip the output if the timer overflowed
lcdout $FE, $80, "BROJ=",#period
pause 100
capture = 0 ' Clear the capture flag
EndIF
reset:
IF (capture = 0) Then reset: ' Wait for beginning of next period
TMR1L = 0 ' Clear Timer1 low register
TMR1H = 0 ' Clear Timer1 high register
capture = 0 ' Clear capture flag
overflow = 0 ' Clear overflow flag
intcon.6=0 '=================================
intcon.7=0 '========================================
TMR1L = TMR1_Vred.lowbyte 'Postavi TMR1 na 64536
TMR1H = TMR1_Vred.highbyte
I 17bit broj ne moze stati u 16 bita.
Upisivanjem 64536 isto je kao da si upisao nulu.
I ne znam koji pic koristis, ali na nekima je bitan redosled upisivanja H i L registra.
Proveri da li ti je brzina pica postavljena na 4MHz u simulaciji.
Koristim 16f877A imam 4MHz u simulaciji. Svrha je da meri frekvenciju i nista vise. To valjda moze tako do 65535 bez preskalera. Ako ozivi i proradi posle lako mogu da da ga prilagodim jer koliko toliko razumem princip rada.
Stavio sam 65535 i isto se ponasa,to sam i ja video ali zaboravi da ispravim pre nego sto sam ga postavio na forum.Probao sam ba nadjem na internetu i nesto slicno tom nacinu merenja frekvencije ali nista u picbasic-u
Sad tek stizem da pisem. Skinuo sam sa nekog stranog foruma prog za merenje periode i ovaj sto sam postavio, a za njega je pisalo da meri frekvenciju. Ili sam ja lose shvatio ili se tej neko zeznuo. Jbg. ostdo bez frekvencmetra, nema veze, hvala vam u svakom slucaj.