📄 humidity.asm
字号:
;----------------------------------------------------------------------
;
; Filename: humidity.asm
; Microcontroller: PIC16F690
; Assembled using: MPLAB IDE v7.22
;
; Author: Steven Bible
; Company: Microchip Technology Inc.
;
;----------------------------------------------------------------------
;
; Program Description:
;
; < type program description here >
;
;----------------------------------------------------------------------
;
; Revision History:
;
; Ver. 0.0 - November 21, 2005: Adapted to Humirel humidity sensor
;
;----------------------------------------------------------------------
; Include Files and Project Files:
;
#include "main.inc" ; io port and processor defines
#include "humidity.inc"
;----------------------------------------------------------------------
; Externally Defined Labels
;
; EXTERN declares symbol names that are used in this module and declared
; as global in another module.
;----------------------------------------------------------------------
; external variables
; external subroutines
;----------------------------------------------------------------------
; Local Defines
;----------------------------------------------------------------------
; none
;----------------------------------------------------------------------
; Variables
;----------------------------------------------------------------------
;--------------------
; Uninitialized Data Section
;
; The RES directive reserves space for data storage.
udata
Humid_PwLI_IN res 2 ; Input to PwLI subroutine (little-endian)
Humid_PwLI_OUT res 2 ; 16-bit output from PwLI subroutine (little-endian)
PwLI_IDX res 2 ; Index into PwLI table (little-endian)
PwLI_SL res 3 ; 24-bit slope variable (little-endian)
PwLI_MUL res 3 ; 24-bit multiply result variable (little-endian)
TEMP res 1 ; temporary variable
;--------------------
; Shared Uninitialized Data Section
;
; Variables that are allocated in RAM that ais shared across all RAM banks (unbanked RAM).
; The RES directive reserves space for data storage.
;
; PIC16F690 has 16 shared RAM locations
;
; udata_shr
;--------------------
; Global Variables
;
; Variables defined in this module that are made available to other
; modules. The <label> must be defined prior to using the GLOBAL
; directive in this module.
global Humid_PwLI_IN
global Humid_PwLI_OUT
;----------------------------------------------------------------------
; Begin Executable Code Segment
;----------------------------------------------------------------------
;[<label>] code [<ROM_Address>]
code
;----------------------------------------------------------------------
; Macros:
;----------------------------------------------------------------------
m_add24 macro input, output ; output[3] = input[3] + output[3]
movf input, W ; Add input LSB to output LSB
addwf output, F
movf input+1, W
btfsc STATUS, C
incfsz input+1, W ; Add one if there was a carry from previous add
addwf output+1, F ; Add input+1 to output+1
movf input+2, W
btfsc STATUS, C
incfsz input+2, W ; Add one if there was a carry from previous add
addwf output+2, F ; Add input+2 to output+2
endm
;----------------------------------------------------------------------
; Subroutine: Piecewise-Linear Interpolation
;
; Description: 10-bit input, 16-bit output, 64 PL segments, 6 PL bits
;
; Constants:
;
; Global Variables:
;
; Initialization:
;
; Output:
;
;----------------------------------------------------------------------
Humid_PwLI
global Humid_PwLI
; calculate PwLI table index (PwLI_IDX) ( 10-bit INPUT; 6-bit PL_TABLE entry )
; right shift 3 places (PWLINDEX is multiplied by 2)
movfw Humid_PwLI_IN+1
movwf PwLI_IDX+1
movfw Humid_PwLI_IN
movwf PwLI_IDX
bcf STATUS, C
rrf PwLI_IDX+1, F
rrf PwLI_IDX, F
bcf STATUS, C
rrf PwLI_IDX+1, F
rrf PwLI_IDX, F
bcf STATUS, C
rrf PwLI_IDX+1, F
rrf PwLI_IDX, F
; at this point, PWLINDEX should contain only 6 bits in positions 6:1
movlw 0x7E
andwf PwLI_IDX,F
; get Y1
movfw PwLI_IDX
call PwLI_TABLE
movwf Humid_PwLI_OUT
movfw PwLI_IDX
addlw 1
call PwLI_TABLE
movwf Humid_PwLI_OUT+1
; get Y2
movfw PwLI_IDX
addlw 2
call PwLI_TABLE
movwf PwLI_SL
movfw PwLI_IDX
addlw 3
call PwLI_TABLE
movwf PwLI_SL+1
; calculate intermediate slope value of segment
; subtract Y1 from Y2 (rise within segment), store result in SLOPE
movfw Humid_PwLI_OUT
subwf PwLI_SL, F
movf Humid_PwLI_OUT+1, W
btfss STATUS, C
incfsz Humid_PwLI_OUT+1, W
subwf PwLI_SL+1, F
clrf PwLI_SL+2
btfss STATUS, C
comf PwLI_SL+2, F
; calculate Y within segment
; multiply lower 4 bits of PwLI_IN times intermediate SLOPE (the full RISE (or FALL) of the segment)
clrf PwLI_MUL ; Clear multiplication result register
clrf PwLI_MUL+1
clrf PwLI_MUL+2
btfss Humid_PwLI_IN, 0 ; Check bit 0 of multiplicand, skip add if it is zero
goto skip_add_4
m_add24 PwLI_SL, PwLI_MUL ; Add multiplier to result if bit 0 of multiplicand is 1
skip_add_4
bcf STATUS, C ; Clear carry bit in anticipation of a 24-bit rotate
rlf PwLI_SL, F ; Rotate SLOPE[3] one position to the left (multiply by 2)
rlf PwLI_SL+1, F
rlf PwLI_SL+2, F
btfss Humid_PwLI_IN, 1 ; Check bit 1 of multiplicand, skip add if it is zero
goto skip_add_3
m_add24 PwLI_SL, PwLI_MUL ; Add multiplier to result if bit 1 of multiplicand is 1
skip_add_3
rlf PwLI_SL, F ; Rotate SLOPE[3] one position to the left (multiply by 2)
rlf PwLI_SL+1, F
rlf PwLI_SL+2, F
btfss Humid_PwLI_IN, 2 ; Check bit 2 of multiplicand, skip add if it is zero
goto skip_add_2
m_add24 PwLI_SL, PwLI_MUL ; Add multiplier to result if bit 2 of multiplicand is 1
skip_add_2
rlf PwLI_SL, F ; Rotate SLOPE[3] one position to the left (multiply by 2)
rlf PwLI_SL+1, F
rlf PwLI_SL+2, F
btfss Humid_PwLI_IN, 3 ; Check bit 3 of multiplicand, skip add if it is zero
goto skip_add_1
m_add24 PwLI_SL, PwLI_MUL ; Add multiplier to result if bit 3 of multiplicand is 1
; divide by 16 (now we have Y)
skip_add_1
swapf PwLI_MUL, W
andlw 0x0F
movwf PwLI_MUL
swapf PwLI_MUL+1, W
andlw 0xF0
iorwf PwLI_MUL, F
swapf PwLI_MUL+1, W
andlw 0x0F
movwf PwLI_MUL+1
swapf PwLI_MUL+2, W
andlw 0xF0
iorwf PwLI_MUL+1, F
; add Y of the segment to Y1, result in PwLI_OUT
movfw PwLI_MUL
addwf Humid_PwLI_OUT, F
movfw PwLI_MUL+1
btfsc STATUS, C
addlw 1
addwf Humid_PwLI_OUT+1, F
return
;----------------------------------------
; Piecewise Linear Interpolation Look-up table
;[<label>] code [<ROM_Address>]
PwLI_TABLE
movwf TEMP
movlw HIGH PwLITABLE
movwf PCLATH
movfw TEMP
addlw LOW PwLITABLE
btfsc STATUS, C
incf PCLATH, F
movwf PCL
PwLITABLE
retlw low SEGMENT0
retlw high SEGMENT0
retlw low SEGMENT1
retlw high SEGMENT1
retlw low SEGMENT2
retlw high SEGMENT2
retlw low SEGMENT3
retlw high SEGMENT3
retlw low SEGMENT4
retlw high SEGMENT4
retlw low SEGMENT5
retlw high SEGMENT5
retlw low SEGMENT6
retlw high SEGMENT6
retlw low SEGMENT7
retlw high SEGMENT7
retlw low SEGMENT8
retlw high SEGMENT8
retlw low SEGMENT9
retlw high SEGMENT9
retlw low SEGMENT10
retlw high SEGMENT10
retlw low SEGMENT11
retlw high SEGMENT11
retlw low SEGMENT12
retlw high SEGMENT12
retlw low SEGMENT13
retlw high SEGMENT13
retlw low SEGMENT14
retlw high SEGMENT14
retlw low SEGMENT15
retlw high SEGMENT15
retlw low SEGMENT16
retlw high SEGMENT16
retlw low SEGMENT17
retlw high SEGMENT17
retlw low SEGMENT18
retlw high SEGMENT18
retlw low SEGMENT19
retlw high SEGMENT19
retlw low SEGMENT20
retlw high SEGMENT20
retlw low SEGMENT21
retlw high SEGMENT21
retlw low SEGMENT22
retlw high SEGMENT22
retlw low SEGMENT23
retlw high SEGMENT23
retlw low SEGMENT24
retlw high SEGMENT24
retlw low SEGMENT25
retlw high SEGMENT25
retlw low SEGMENT26
retlw high SEGMENT26
retlw low SEGMENT27
retlw high SEGMENT27
retlw low SEGMENT28
retlw high SEGMENT28
retlw low SEGMENT29
retlw high SEGMENT29
retlw low SEGMENT30
retlw high SEGMENT30
retlw low SEGMENT31
retlw high SEGMENT31
retlw low SEGMENT32
retlw high SEGMENT32
retlw low SEGMENT33
retlw high SEGMENT33
retlw low SEGMENT34
retlw high SEGMENT34
retlw low SEGMENT35
retlw high SEGMENT35
retlw low SEGMENT36
retlw high SEGMENT36
retlw low SEGMENT37
retlw high SEGMENT37
retlw low SEGMENT38
retlw high SEGMENT38
retlw low SEGMENT39
retlw high SEGMENT39
retlw low SEGMENT40
retlw high SEGMENT40
retlw low SEGMENT41
retlw high SEGMENT41
retlw low SEGMENT42
retlw high SEGMENT42
retlw low SEGMENT43
retlw high SEGMENT43
retlw low SEGMENT44
retlw high SEGMENT44
retlw low SEGMENT45
retlw high SEGMENT45
retlw low SEGMENT46
retlw high SEGMENT46
retlw low SEGMENT47
retlw high SEGMENT47
retlw low SEGMENT48
retlw high SEGMENT48
retlw low SEGMENT49
retlw high SEGMENT49
retlw low SEGMENT50
retlw high SEGMENT50
retlw low SEGMENT51
retlw high SEGMENT51
retlw low SEGMENT52
retlw high SEGMENT52
retlw low SEGMENT53
retlw high SEGMENT53
retlw low SEGMENT54
retlw high SEGMENT54
retlw low SEGMENT55
retlw high SEGMENT55
retlw low SEGMENT56
retlw high SEGMENT56
retlw low SEGMENT57
retlw high SEGMENT57
retlw low SEGMENT58
retlw high SEGMENT58
retlw low SEGMENT59
retlw high SEGMENT59
retlw low SEGMENT60
retlw high SEGMENT60
retlw low SEGMENT61
retlw high SEGMENT61
retlw low SEGMENT62
retlw high SEGMENT62
retlw low SEGMENT63
retlw high SEGMENT63
retlw low SEGMENT64
retlw high SEGMENT64
;----------------------------------------------------------------------
end ; end of program directive
;----------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -