📄 main.asm
字号:
; Read Capacitance; result in Result variable
; ( cmd: 1 / arg: 0 )
cmd01
clrf Result_L ; clear Result variable
clrf Result_H
clrf Result_U
movlw D'8'
movwf Count
cmd01_00
call CAP_Read ; read capacitance
movfw K2_L ; average eight readings
addwf Result_L, F
movfw K2_H
btfsc STATUS, C ; if lower byte generated a carry
incfsz K2_H, W ; increment middle byte
addwf Result_H, F ; then add middle byte
btfsc STATUS, C ; if middle byte generated a carry
incf Result_U, F
decfsz Count, F ; loop
goto cmd01_00
bcf STATUS, C ; divide by 8
rrf Result_U, F
rrf Result_H, F
rrf Result_L, F
bcf STATUS, C
rrf Result_U, F
rrf Result_H, F
rrf Result_L, F
bcf STATUS, C
rrf Result_U, F
rrf Result_H, F
rrf Result_L, F
movlw CMD_01_ACK
movwf CmdStatus
movfw PORTA ; clear any interrupt on change conditions
bcf INTCON, RABIF
goto End_ISR
;----------------------------------------
; Send Capacitance value
; ( cmd: 1 / arg: 0 )
cmd02
movlw .75 ; take some time to turn the bus around
movwf DelayCounter
decfsz DelayCounter, F
goto $ - 1
movfw Result_H ; send capacitance value
call SSC_SendByte
movfw Result_L
call SSC_SendByte
movlw CMD_02_ACK
movwf CmdStatus
movfw PORTA ; clear any interrupt on change conditions
bcf INTCON, RABIF
goto End_ISR
;----------------------------------------
; Calculate Humidity from Capacitance
; ( cmd: 1 / arg: 0 )
cmd03
movlw .20 ; take some time to turn the bus around
movwf DelayCounter
decfsz DelayCounter, F
goto $ - 1
movlw 0x14 ; subtract 1300 (0x0514) from Result
subwf Result_L, F
movlw 0x05
btfss STATUS, C ; ( a borrow occurred )
movlw 0x06
subwf Result_H, F
movfw Result_H
movwf Humid_PwLI_IN + 1 ; (little-endian)
movfw Result_L
movwf Humid_PwLI_IN
call Humid_PwLI
movfw Humid_PwLI_OUT + 1 ; (little-endian)
call SSC_SendByte
movfw Humid_PwLI_OUT
call SSC_SendByte
movlw CMD_03_ACK
movwf CmdStatus
movfw PORTA ; clear any interrupt on change conditions
bcf INTCON, RABIF
goto End_ISR
;----------------------------------------
;
; ( cmd: 1 / arg: - )
cmd04
movlw CMD_04_ACK
movwf CmdStatus
movfw PORTA ; clear any interrupt on change conditions
bcf INTCON, RABIF
goto End_ISR
;----------------------------------------
;
; ( cmd: 1 / arg: - )
cmd05
movlw .75 ; take some time to turn the bus around
movwf DelayCounter
decfsz DelayCounter, F
goto $ - 1
movlw CMD_05_ACK
movwf CmdStatus
movfw PORTA ; clear any interrupt on change conditions
bcf INTCON, RABIF
goto End_ISR
;----------------------------------------
;
; ( cmd: 1 / arg: - )
cmd06
movlw CMD_06_ACK
movwf CmdStatus
movfw PORTA ; clear any interrupt on change conditions
bcf INTCON, RABIF
goto End_ISR
;----------------------------------------
; Return command status
; ( cmd: 1 / arg: - )
cmdGetStatus
movlw .75 ; take some time to turn the bus around
movwf DelayCounter
decfsz DelayCounter, F
goto $ - 1
movfw CmdStatus ; report that last status message
call SSC_SendByte
movlw CMD_UNSUCCESSFUL ; clear status message
movwf CmdStatus
movfw PORTA ; clear any interrupt on change conditions
bcf INTCON, RABIF
; goto End_ISR
;----------------------------------------
End_ISR
movfw PCLATH_TEMP ; restore PCLATH_TEMP register
movwf PCLATH
movfw FSR_TEMP ; restore FSR_TEMP register
movwf FSR
swapf STATUS_TEMP, W ; swap status_temp into W, sets bank to original state
movwf STATUS ; restore STATUS register
swapf W_TEMP, F
swapf W_TEMP, W ; restore W register
retfie
; end Interrupt Service Routine (ISR)
;----------------------------------------------------------------------
Program code
;----------------------------------------------------------------------
;----------------------------------------------------------------------
; Main Program
;----------------------------------------------------------------------
;----------------------------------------------------------------------
MAIN
;----------------------------------------
; Initialize PICmicro
;----------------------------------------
call init_f690
;----------------------------------------
; Initialize Modules
;----------------------------------------
call SSC_Init ; initialize SSC routines
call CAP_Init ; initializw Capacitance routines
;----------------------------------------
; Initialize Variables
;----------------------------------------
banksel CmdStatus
movlw CMD_UNSUCCESSFUL
movwf CmdStatus
bsf INTCON, GIE ; enable global interrupts
MAINLOOP
sleep
nop
goto MAINLOOP
;----------------------------------------------------------------------
; Data EEPROM Memory
;
; The PIC16F690 device has 256 bytes of data EEPROM with address
; range 0x00 to 0xFF.
; Initialize Data EEPROM Memory locations
;DEEPROM code
; DE 0x00, 0x01, 0x02, 0x03
;----------------------------------------------------------------------
end ; end of program directive
;----------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -