;大大們:
;小弟原本想說在調VR(10k)會經AN3輸入丟給ADRESH一個值,但因為怕它會取太快而我轉太慢會造成在第二次取值時還是第一個值
;,所以在取值時故意讓它DELAY久一點並且一第二個值為準,就可以是最後轉到的為想要丟進的
;取好後
;在丟入TURNY在GP2為不切時,則在每一次中斷切換GP5
;等到GP2動作後在重新取AD,再改換中段時間就應該可成大小時間切換GP5
;不過這程式好像還是不能動作勒............頭痛@@
list p=12f675
include <P12f675.INC>
__CONFIG _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _BODEN_OFF
ADStatus EQU 0x20
W_temp EQU 0x21
STATUS_Temp EQU 0x22
scaler EQU 0x27
Delay1 EQU 0x23
Delay2 EQU 0x24
Delay3 EQU 0x25
ADStatus1 EQU 0x26
Countms EQU 0x30
ADCloop EQU 0x31
ADloop_scaler EQU 0x32
change EQU 0x33
T1HCAP_1 EQU 0x34
T1LCAP_1 EQU 0x35
T1HCAP_2 EQU 0x36
T1LCAP_2 EQU 0x37
;***********Resect Vector***************
org 0x00
nop
goto MainLine
;************ interrupt **************
org 0x04
goto intService
intService:
movwf W_temp
swapf STATUS,w
movwf STATUS_Temp
btfsc PIR1,TMR1IF
call Timer1
swapf STATUS_Temp,w
movwf STATUS
swapf W_temp,f
swapf W_temp,w
retfie
;********** Timer1 ***************
Timer1:
bcf PIR1,TMR1IF
decf scaler,f
clrf TMR1L
movlw T1HCAP_2
movwf TMR1H
movlw T1LCAP_2
movwf TMR1L
return
;********** Main Program ***************
MainLine:
call Initial
MainLoop:
bcf STATUS,RP0
bsf T1CON,TMR1ON
call ADconverter
call turn
goto MainLoop
;********* TURN ******************
turn:
movlw .2
movwf scaler
turn_off:
bcf STATUS,RP0
bcf GPIO,GP5
btfss scaler,0
goto turn_off
turn_on:
bsf GPIO,GP5
btfsc scaler,0
goto turn_on
btfsc GPIO,GP2
goto turn
; ; goto turn_on
call ADloop_time
call ADloop_time
call ADloop_time
return
;*********Initial Subroutine************
Initial:
bsf STATUS,RP0 ;Bank
; clrf TRISIO ;Init GPIO
movlw B'00010100'
movwf TRISIO
bcf STATUS,RP0
movlw 07h
movwf CMCON
; bcf STATUS,RP0
bsf GPIO,GP2
clrf T1CON
clrf TMR1H
clrf TMR1L
clrf INTCON
bsf INTCON,PEIE
bsf STATUS,RP0
clrf PIE1
bsf PIE1,TMR1IE
bcf STATUS,RP0
clrf PIR1
clrf TMR1L
movlw 0x15
movwf TMR1H
movlw 0x9F
movwf TMR1L
bcf T1CON,TMR1ON
bsf INTCON,GIE
bsf STATUS,RP0
; clrf ADRESL
movlw B'00011000'
movwf ANSEL
bcf STATUS,RP0
; clrf ADCON0
movlw B'00001101'
movwf ADCON0
; clrf ADRESH
return
;************A/D converter**************
ADconverter:
movlw .2
movwf ADCloop
ADconverter1:
call ADloop_time
call ADloop_time
call ADloop_time
call ADloop_time
call ADloop_time
call ADloop_time
bcf STATUS,RP0
bsf ADCON0,GO
call ADloop_time
call ADloop_time
Wait1:
btfsc ADCON0,GO
goto Wait1
movlw ADRESH
movwf Countms
; movlw (.65536 - Countms)/.256 [/code]
movlw HIGH(.65536 - Countms)
decfsz ADCloop,F
btfss ADCloop,0
btfsc ADCloop,0
goto savetemp
movwf T1HCAP_2
xorwf T1HCAP_1,F
btfss STATUS,Z
goto ADconverter
call Wait2
return
savetemp:
movwf T1HCAP_1
goto ADconverter1
Wait2:
movlw LOW (.65536 - Countms)
movwf T1LCAP_2
return
;------------------------------------------------------------------------------
; ADloop_time
;------------------------------------------------------------------------------
Delay1ms:
movlw .198
movwf Delay1
Delay1ms_01:
decfsz Delay1, F
goto Delay1ms_01
return
ADloop_time:
movlw .100
movwf ADloop_scaler
ADloop_time1:
call Delay1ms
decfsz ADloop_scaler,F
goto ADloop_time1
return
end