Код: Выделить всё
;******************************************************************************
; This file is a basic code template for object module code *
; generation on the PIC12F629. This file contains the *
; basic code building blocks to build upon. *
; *
; Refer to the MPASM User's Guide for additional information on *
; features of the assembler and linker (Document DS33014). *
; *
; Refer to the respective PIC data sheet for additional *
; information on the instruction set. *
; *
;******************************************************************************
; *
; Filename: xxx.asm *
; Date: *
; File Version: *
; *
; Author: *
; Company: *
; *
; *
;******************************************************************************
; *
; Files required: P12F629.INC *
; *
; *
; *
;******************************************************************************
; *
; Notes: *
; *
;******************************************************************************
;------------------------------------------------------------------------------
; PROCESSOR DECLARATION
;------------------------------------------------------------------------------
LIST P=12F629 ; list directive to define processor
#INCLUDE <P12F629.INC> ; processor specific variable definitions
;------------------------------------------------------------------------------
;
; CONFIGURATION WORD SETUP
;
; The 'CONFIG' directive is used to embed the configuration word within the
; .asm file. The lables following the directive are located in the respective
; .inc file. See the data sheet for additional information on configuration
; word settings.
;
;------------------------------------------------------------------------------
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
;------------------------------------------------------------------------------
; VARIABLE DEFINITIONS
;------------------------------------------------------------------------------
; example of using Shared Uninitialized Data Section
INT_VAR UDATA_SHR 0x20
W_TEMP RES 1 ; variable used for context saving
STATUS_TEMP RES 1 ; variable used for context saving
tmp0 RES 1 ; блок временных регистров
datas RES 1 ; данные к обработке
reg_mask RES 1 ; скользящая маска
;------------------------------------------------------------------------------
; определение констант
start_mask equ 0x80 ; 10000000 двоичное (1 в старшем бите)
;------------------------------------------------------------------------------
; EEPROM INITIALIZATION
;
; The 12F629 has 128 bytes of non-volatile EEPROM, starting at address 0x2100
;
;------------------------------------------------------------------------------
DATAEE CODE 0x2100
DE "MCHP" ; Place 'M' 'C' 'H' 'P' at address 0,1,2,3
;------------------------------------------------------------------------------
; OSCILLATOR CALIBRATION VALUE
;------------------------------------------------------------------------------
OSC CODE 0x03FF
; Internal RC calibration value is placed at location 0x3FF by Microchip as
; a 0xADDLW K instruction, where the K is a literal value to be loaded into
; the OSCCAL register.
;------------------------------------------------------------------------------
; RESET VECTOR
;------------------------------------------------------------------------------
RESET_VECTOR CODE 0x0000 ; processor reset vector
GOTO START ; go to beginning of program
;------------------------------------------------------------------------------
; INTERRUPT SERVICE ROUTINE
;------------------------------------------------------------------------------
INT_VECTOR CODE 0x0004 ; interrupt vector location
MOVWF W_TEMP ; save off current W register contents
MOVF STATUS,w ; move status register into W register
MOVWF STATUS_TEMP ; save off contents of STATUS register
; isr code can go here or be located as a call subroutine elsewhere
MOVF STATUS_TEMP,w ; retrieve copy of STATUS register
MOVWF STATUS ; restore pre-isr STATUS register contents
SWAPF W_TEMP,f
SWAPF W_TEMP,w ; restore pre-isr W register contents
RETFIE ; return from interrupt
;------------------------------------------------------------------------------
; MAIN PROGRAM
;------------------------------------------------------------------------------
MAIN_PROG CODE
START
;------------------------------------------------------------------------------
; OSCCAL RESTORE (not required if internal OSC is not used)
;------------------------------------------------------------------------------
; -------------- закрыто на время теста --------------
; errorlevel -302
; BSF STATUS,RP0 ; set file register bank to 1
; CALL 0x3FF ; retrieve factory calibration value
; MOVWF OSCCAL ; update register with factory cal value
; BCF STATUS,RP0 ; set file register bank to 0
; errorlevel +302
;------------------------------------------------------------------------------
; PLACE USER PROGRAM HERE
;------------------------------------------------------------------------------
new_test
movlw 0x56 ; исходные данные для анализа
rep_test
movwf datas ; загружены в datas
movlw start_mask ; стартовая маска анализатора
movwf reg_mask ; загружена в reg_mask
step1
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 7
goto step2 ; jnz переходим к второму анализатору
rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 6/
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 6
goto step2 ; jnz переходим к второму анализатору
rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 5/
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 5
goto step2 ; jnz переходим к второму анализатору
rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 4/
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 4
goto step2 ; jnz переходим к второму анализатору
rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 3/
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 3
goto step2 ; jnz переходим к второму анализатору
rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 2/
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 2
goto step2 ; jnz переходим к второму анализатору
rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 1/
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 1
goto step2 ; jnz переходим к второму анализатору
rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 0/
; анализ младшего значащего бита на первой ступени лишен смысла так как
; за ним нет больше бит для второй ступени анализа
goto error_test ; обработчик ошибки
step2
rrf reg_mask,f ; сдвиг маски в следующий бит 6 или 0
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 6 или 0
goto test_ends ; jnz выход с результатом в start_mask
movf reg_mask,f ; (TSTF) анализ на маску не равную 0
btfsc STATUS,Z
goto error_test ; обработчик ошибки
rrf reg_mask,f ; сдвиг маски в следующий бит 5 или 0
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 5 или 0
goto test_ends ; jnz выход с результатом в start_mask
movf reg_mask,f ; (TSTF) анализ на маску не равную 0
btfsc STATUS,Z
goto error_test ; обработчик ошибки
rrf reg_mask,f ; сдвиг маски в следующий бит 4 или 0
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 4 или 0
goto test_ends ; jnz выход с результатом в start_mask
movf reg_mask,f ; (TSTF) анализ на маску не равную 0
btfsc STATUS,Z
goto error_test ; обработчик ошибки
rrf reg_mask,f ; сдвиг маски в следующий бит 3 или 0
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 3 или 0
goto test_ends ; jnz выход с результатом в start_mask
movf reg_mask,f ; (TSTF) анализ на маску не равную 0
btfsc STATUS,Z
goto error_test ; обработчик ошибки
rrf reg_mask,f ; сдвиг маски в следующий бит 2 или 0
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 2 или 0
goto test_ends ; jnz выход с результатом в start_mask
movf reg_mask,f ; (TSTF) анализ на маску не равную 0
btfsc STATUS,Z
goto error_test ; обработчик ошибки
rrf reg_mask,f ; сдвиг маски в следующий бит 1 или 0
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 1 или 0
goto test_ends ; jnz выход с результатом в start_mask
movf reg_mask,f ; (TSTF) анализ на маску не равную 0
btfsc STATUS,Z
goto error_test ; обработчик ошибки
rrf reg_mask,f ; сдвиг маски в следующий бит 0
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 0
goto test_ends ; jnz выход с результатом в start_mask
;movf reg_mask,f ; (TSTF) анализ на маску не равную 0
;btfsc STATUS,Z
error_test ; обработчик ошибки
nop
goto $ ; аварийный останов (желательно с разбором ошибок)
test_ends ; завершение программы в start_mask результат
nop ; для тест прогона в дебаггере - тут при останове
nop ; вводим в W новое значение данных
nop
goto rep_test
END ; directive 'end of program'