⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 humidity.asm

📁 Synchronous Serial Communications (SSC) is a synchronous serial communications protocol between
💻 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 + -