H
HeiFelix
Guest
I am PIC16F87A uporabljajo za odkrivanje frequncy sprememb na RA4 s štetjem vhodni pulz TMR0.Pogostnost je približno 80KHz glede na senzor in OSC je 8MHz.V vsakem 160ms, število impulzov je 0x36B5 ali 0x36B6 kar pomeni pogostost je stabilna.
Hočem odkriti eno ali dve več impulzov v tem obdobju, kakor hitro je mogoče.Torej, sem FIFO za beleženje števila impulza pri 16 (X10ms) consectutive obdobjih.Na koncu vsakega obdobja, dobim vsoto FIFO in jih primerjajte s standardom.Verjamem, da na ta način sem lahko zazna spremembo v 10ms.Ampak, jaz vsota zadnjega 160ms je nihal od 0x36B3-0x36B6 kar pomeni, da ne morem dobiti standard za preverjanje.Nekatere impulzov je treba izgubil, ko sem ga evidentira.Kako lahko dobim pričakovano vsoto kot 0x35B5 ali 0x35B6 v takih 16X10ms obdobju?Koda je naslednja:
Koda:..........;;;;;;;;;;;;;;;;;; Interrupt Service ;;;;;;;;;;;;;;;;;;;;;
IntService
movwf W_Temp
swapf m, STATUS_Temp
movwf STATUS_Temp
BCF STATUS, RP0
btfsc INTCON, T0IF
klic IntServiceTimer0
swapf STATUS_Temp, w
movwf STATUS
swapf W_Temp, f
swapf W_Temp, w
retfie;;;;;;;;;;;;;;;;;; Interrupt Service za Timer0 ;;;;;;;;;;;;;;;;;;;;;
IntServiceTimer0
BCF INTCON, T0IF
incf TMR0_High, f
vrnitev;;;;;;;;; Main Program ;;;;;;;;
Glavnih
klic InitialPIC
klic InitialDetector
movlw CounterLength
movwf CounterCounter
MainLoop
btfss PIR1, TMR2IF: 10ms overfloe
Goto MainLoop
BCF PIR1, TMR2IF
movf TMR0, w
clrf TMR0
movwf TMR0_TempL
movf TMR0_High, w
movwf TMR0_TempH
clrf TMR0_High
............
Uporaba TMR0_TempL in TMR0_TempH priti vsoto v 16x10ms obdobje .......
.............
odkrivanje sprememb frequncy in do določene operacije .........
Goto MainLoop
Hočem odkriti eno ali dve več impulzov v tem obdobju, kakor hitro je mogoče.Torej, sem FIFO za beleženje števila impulza pri 16 (X10ms) consectutive obdobjih.Na koncu vsakega obdobja, dobim vsoto FIFO in jih primerjajte s standardom.Verjamem, da na ta način sem lahko zazna spremembo v 10ms.Ampak, jaz vsota zadnjega 160ms je nihal od 0x36B3-0x36B6 kar pomeni, da ne morem dobiti standard za preverjanje.Nekatere impulzov je treba izgubil, ko sem ga evidentira.Kako lahko dobim pričakovano vsoto kot 0x35B5 ali 0x35B6 v takih 16X10ms obdobju?Koda je naslednja:
Koda:..........;;;;;;;;;;;;;;;;;; Interrupt Service ;;;;;;;;;;;;;;;;;;;;;
IntService
movwf W_Temp
swapf m, STATUS_Temp
movwf STATUS_Temp
BCF STATUS, RP0
btfsc INTCON, T0IF
klic IntServiceTimer0
swapf STATUS_Temp, w
movwf STATUS
swapf W_Temp, f
swapf W_Temp, w
retfie;;;;;;;;;;;;;;;;;; Interrupt Service za Timer0 ;;;;;;;;;;;;;;;;;;;;;
IntServiceTimer0
BCF INTCON, T0IF
incf TMR0_High, f
vrnitev;;;;;;;;; Main Program ;;;;;;;;
Glavnih
klic InitialPIC
klic InitialDetector
movlw CounterLength
movwf CounterCounter
MainLoop
btfss PIR1, TMR2IF: 10ms overfloe
Goto MainLoop
BCF PIR1, TMR2IF
movf TMR0, w
clrf TMR0
movwf TMR0_TempL
movf TMR0_High, w
movwf TMR0_TempH
clrf TMR0_High
............
Uporaba TMR0_TempL in TMR0_TempH priti vsoto v 16x10ms obdobje .......
.............
odkrivanje sprememb frequncy in do določene operacije .........
Goto MainLoop