Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Frekvencmetar u PB. Nikako da ozivi
#1
Ovo sam odavno pronasao i pokusavao kad kako imam vremena da napravim ali nikako da proradi.Pronalazio sam neka objasnjenja ali nista u pic basic-u uvezi ovog programa pa ako neko zna gde je ovde greska da je ispravimo.Ja sam ovde samo dodao komande za lcd displej.


Quote: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

 
 
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=",#period
  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
 
  GoTo mainloop ' Do it forever
       
  End
Reply
#2
ovo
Code:
TMR1_Vred = 64536 

neće da može. Može samo
Code:
TMR1_Vred = 64535
65536 je 0b10000000000000000 -> 17 bitova
65535 je 0b1111111111111111  -> 16 bitova

što uslovljava da  
Code:
TMR1L = TMR1_Vred.lowbyte
TMR1H = TMR1_Vred.highbyte
ima vrednost 0 (NULA)

Big Grin
Make no mistake between my personality and my attitude.
My personality is who I am.
My attitude depends on who you are.

塞爾維亞文
Reply
#3
Probam odma cim stignem kuci.
Reply
#4
Ponovo nece ali nepredajemo se.Sad je samo pokazao neke druge vrednosti na displeju isto bezveze.Dovodio sam  mu u proteusu od 100Hz do nekoliko KHz i rezultalt je uvek neki broj koji nema veza sa onim sto treba da pokaze.
Reply
#5
Proveri  vrednost oscilatora koju koristis u proteusu. Kod ti nije dobar jer ne koristis prekide. Sta sve moze da se desi dok ti pises po displeju!?
Reply
#6
Na displej u ispise neku vrednost 49 hiljada i nesto i tako stoji. Probao sam nesto da ubacim prekide ali mi izgleda neide pa sam postavio kod kakav je bio kad sam ga skinuo. Oscilator je na 4MHz
Reply
#7
Evo probao sam da ubacim nesto (oznacio sam isprekidanim linijama) i posle bezbroj pokusaja nista,samo menja neki broj na displeju bezveze.Sta bi jos trebalo da se uradi? neznam sta jos da probam.


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="

trisc.2=1
capture VAR PIR1.2 ' CCP1 capture flag
overflow VAR PIR1.0 ' Timer1 overflow flag
period VAR WORD ' Word variable that stores the value
broj var word
TMR1_Vred Var word
TMR1_Vred = 64535


CCP1CON = %00000100 ' Enable the CCP1 capture, falling edge
T1CON = %00000001 ' TMR1 prescale=1, and turn it on (1uS per count)

mainloop:

pie1.0=1---------------
pie1.2=1---------------
intcon.7=1----------------

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
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


intcon.7=0-----------------
pie1.0=0---------------------
pie1.2=0-----------------

GoTo mainloop ' Do it forever

End
Reply
#8
Ne koriste se prekidi tako. Možeš ti da setuješ i resetuješ INTCON i PIE koliko hoćeš, kad mikro ne zna ništa o tome. U PIC BASIC-u se prekidi koriste na dva načina; ili se piše asemblerski podprogram za obradu prekida, ili se koristi komanda ON INTERRUPT GOTO. Prvi način je najbrži i najteži ako ne znaš asembler. Drugi način je mnogo prostiji ali malo usporava program. Kad ubaciš komandu ON INTERRUPT kompajler iza svake tvoje instrukcije ubacuje svoju kojom proverava da li je došlo do nekog prekida, pa ako jeste onda skače na rutinu obrade prekida koju si mu napisao.

Grešku si napravio upravo sa LCDOUT komandom jer si napisao:
Code:
lcdout $FE, $80, "BROJ=",#period
a trebalo je:
Code:
lcdout $FE, $1, "BROJ=",#period
čime bi obrisao displej i upisao nov podatak ili:
Code:
lcdout $FE, $80, "BROJ=",#period, "     "
čime bi prepisao eventualno đubre koje ti se prikazuje na displeju ako ga ne brišeš nego samo pišeš preko, jer bilo šta što se ne prepiše ostaje prikazano. To si verovatno i video na displeju, pa si mislio da program ne radi. Ja ovaj drugi način više koristim ako mogu jer često brisanje displeja dovodi do treperenja istog.

Inače onaj program ne zahteva nikakve prekide. Radi otprilike ovako:
Ako posmatraš od labele reset ovde se program vrti u brzoj petlji i čeka silaznu ivicu nekog signala. Kad se to desi, capture postaje 1, izlazi se iz petlje. U tajmer se upisuju nule i skače se na mainloop gde se program ponovo zaglavi u petlji i čeka capture, dok tajmer polako napreduje. Kad se desi capture, podatak se izvuče iz CCPR1 i prosledi na displej, što može da traje i pola sata nebitno je. Posle prikaza očisti se capture flag i ponovo uđe u reset petlju i čeka nova ivica signala. Ono upisivanje 64535 nisam siguran čemu služi, daje 1000 us ili 1ms do overflow-a, ali ovde ne vidim svrhu jer program radi (probao sam u proteusu) i bez toga. Inače program ne meri frekvenciju već periodu signala od nekoliko us do 65535 us.
Reply
#9
Nebitno,meni je odgovaralo da meri i periodu ili bar samo trajanje log1 U svakom slucaju hvala na odgovoru.Za asembler iskreno nemam poima a znam da je za obradu prekida najbolje sa njim ,trebalo bi mi mnogo vremena da se snadjem pa zato ostaje u picbasicu.Ono 64545,neznam,ja sam to pronasao negde na internetu i pokusao da ga ozivim.
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)